问题标签 [shared-primary-key]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
375 浏览

database - 数据库设计,连接不同实体的公共数据

我们有客户、经纪人、公司等实体。它们具有不同的属性,并且必须位于不同的表上。但是他们可以有共同的东西,在我们的例子中是联系信息(实体->联系是一对多的关系)。最好的方法是什么。如果没有完美的设计,如果最重要的是编写尽可能少的代码,那最好。

案例1:所有实体都有一个'common' auto-inc entityId(它们共享主键,所以你不能有一个id=1的客户和一个id=1的公司) 在此处输入图像描述

案例 2:'contact' 存储有关它所指实体的信息。(客户、公司、经纪人不共享主键)

在此处输入图像描述

案例 3:3 个联系表,每个实体一个。

有更多的方法可以连接这些表,这是一个经常发生的问题,我不是特别喜欢任何解决方案,所以帮助我决定。

0 投票
2 回答
1429 浏览

postgresql - 共享主键与外键

我有一个实验室分析数据库,我正在研究 bas 数据布局。我已经看到了一些基于使用“共享主键”的类似要求的建议,但我没有看到仅外键的优势。我正在使用 PostgreSQL:下面列出的表

我可以使用这种设计,或者我可以将分析表中的字段移动到 gc 和分光光度计表中,并在样品、gc 和分光光度计表之间使用外键。我看到的这种设计的唯一优势是,我只需要有关执行了多少或哪些类型的分析的信息,而不必加入实际结果。但是,确保共享主键之间的引用完整性以及管理额外连接和触发器(删除级联等)的附加规则似乎比次要优势更令人头疼。我不是 DBA,而是科学家,所以请让我知道我缺少什么。

更新:共享主键(据我所知)就像一对一的外键,具有附加约束,即父表(分析)中的每个值必须出现在其中一个子表中一次,并且不超过一次。

0 投票
1 回答
1492 浏览

hibernate - OneToOne 共享主键,Pure JPA 2.0 解决方案与 EclipseLink 一起使用,但与 Hibernate Provider 一起使用失败

对于原始问题,请参阅 两个具有共享主键的表之间的 OneToOne 。

我在同一个线程中回答了纯 JPA 2.0 方式的解决方案(使用 EclipseLink 提供程序)。

现在我面临的问题是,一旦我将 JPA 提供程序从 EclipseLink 切换到 hibernate-entitymanager 3.5.1-Final,相同的示例将引发以下异常:

有任何想法吗?

0 投票
2 回答
2638 浏览

c# - EF6 表拆分与多个拆分的共享主键

我正在将旧数据库系统升级到 .NET + Entity Framework 6(代码优先 POCO)+ PostgreSQL。为了便于编程,我希望将一个大表(200 多个字段)拆分为多个实体,例如:

我很高兴发现 EF6 支持“表拆分”:将单个表映射到多个实体以拆分字段。

然而,尝试实现这一点,并在线阅读许多页面,确认多次拆分时这是有问题的。实体框架不仅需要主实体的导航属性,还需要映射到表的所有实体之间的导航属性。对于我上面的场景,这将需要 21 个无意义的导航属性 - 如果我费心将它们设为双向,则需要 42 个。

请参阅:http ://social.msdn.microsoft.com/Forums/en-US/0f65caae-8a66-431f-aa02-4b2c68f871e9/ef-41-rc-code-first-split-one-table-into-multiple-实体?论坛=adodotnetentityframework

请参阅:如何使用 EF-Code-First 将大表分成多个离散类型

建议使用具有共享主键的多个表,这对我来说是一种选择。但是,考虑到 EF 臃肿的 SQL 查询生成,以及 PostgreSQL 有时带有复杂查询的杂乱无章的查询优化器,我担心这个选项(100GB+ 数据库)的性能。

总结一下:

表拆分

优点:最好的查询性能,在数据库层实现最快

缺点:用废话污染我的模型和 OnModelBuilding() 方法,让其他开发人员感到困惑

跨多个表共享主键

优点:最简洁的模型和代码,非遗留数据库的推荐解决方案

缺点:实施额外的工作,可能会降低性能

我的问题:

1) EF6 是否通过 2+ 拆分改进了表拆分?

2) 有没有我没有考虑到的因素?

3)还有其他选择吗?

PS 我对使用 [ComplexType] 不感兴趣

0 投票
1 回答
1755 浏览

entity-framework - EF6 无法为表拆分/共享主键 + 基类构建模型?

问题

根据我之前的问题,我正在尝试使用表拆分来共享大约 7 个实体的大表(200 多个字段)。

EF6 不仅需要从主模型到子模型的导航属性,还需要所有子模型之间的导航属性(这很糟糕)。

手动解决方案

这可以手动完成:

使用流畅的映射:

这行得通。但这不会不适用于 7+ 模型。

尝试改进#1

我想通过继承+ DRY原则改进:

但是在第一次请求时失败,“序列包含多个匹配元素”:

尝试改进#2

我以为我可以将它们声明为抽象的,因此至少程序员被迫实现正确的成员(仍然很糟糕在每个派生类上重新声明):

但这失败时同样的错误。啊??类定义与工作副本相同,只是它们被声明为“覆盖”而不是“虚拟”。就好像 E/F 正在索引 PropertyInfos 或不考虑 PropertyInfo.ReflectedType 的东西

尝试改进#3

我可以使用接口强制执行该模式,但这不太可取,因为必须在每个类上声明接口,这开始看起来很奇怪:

嗯?

这是 E/F 中的一个错误,它很难将基类上的属性与派生类上的属性相同吗?

抱歉冗长的解释,这是今天上午整个调查的总结。

0 投票
2 回答
900 浏览

java - 共享主键生成。休眠

我在生成具有使用共享主键的一对一关系的主键时遇到问题。

这是代码:

第二类:

我遇到过类似的问题,我认为我做的一切都是正确的,但我仍然得到

当试图持久化 Pracownik 对象时。

0 投票
3 回答
79514 浏览

c# - 先了解实体框架代码中的 ForeignKey 属性

有关一些背景信息,请参阅以下帖子:

实体框架一对零或一对无导航属性的关系

我一直认为这ForeignKey是用来显示类中的哪个属性包含确定导航属性的 ForeignKey,例如

但是,我在链接的帖子中发现这是不对的,因为 DeferredData 的主键被称为 Id 我实际上需要:

ieForeignKey用于指向其他类。

然后我开始更改其他一些参考:

然而,这失败了。原来在这一点上ForeignKey需要指向MemberDataSet课堂上的 Id。

我认为这是因为第二个关系是一对多,而第一个是一对零或一,并且实际上关系的主要目的是不同的,但我希望对此/对好文章的引用有所澄清,所以我可以了解正在发生的事情以及 ForeignKey 正在做什么。

在上面的示例中,我也在寻找清楚的说明如何public int? DeferredDataId { get; set; }适合方程,因为它没有明确链接到DeferredData. 我很高兴这将按照惯例匹配,但我将如何明确告诉它,例如,如果它有不同的名称?我在这篇文章中看到的所有例子都是关于使用ForeignKey属性的,但这并不是所有情况下的答案!

非常感谢所有帮助-希望了解问题而不是解决特定问题,因为我的模型中有很多参考资料,因此需要确定每种方法应采取的方法。

谢谢。

编辑

添加了其他类来帮助:

0 投票
2 回答
3312 浏览

postgresql - 将主键传播到子表

我想在插入新行时将主键列的值从父表传播到特定的子表。

出于解释目的,我创建了以下表格:

当我插入新材料时,我会自动添加 aRealMaterial或 a VirtualMaterial(引用新 ID)。我应该强调我想使用这种共享主键模式,而不仅仅是单表继承。

我应该为我的目的使用触发器吗?

0 投票
2 回答
50 浏览

sql - 对 2 个主键执行删除时出现 SQLite 错误

我创建了一个带有 2 个主键的表,当我尝试一次删除几条记录时,但整个表都被擦除了。这是我尝试过的代码,我不确定它为什么会这样做。任何帮助都将受到欢迎。

根据我的计算,返回的计数应该是 3,而不是 0。

0 投票
1 回答
1382 浏览

php - Symfony/Doctrine 类表继承和外键作为主键

我目前正在使用 Symfony 2.5(和 Doctrine 2.4.2)设计一个 Web 应用程序,它必须灵活地轻松插入新的模块/捆绑包。

所以我有一个实体(比如说 A),它与抽象类(B 和 C)有两个一对一的关联。未来的模块将实现两个抽象类之一。由于关联是一对一的,因此我将它们设为抽象类的 ID,以便在我们知道 A 实例的 ID 时轻松访问它们

所以这是代码的样子:

A类:

B类:

我不会发布 C 类的代码,因为它与 B 类相同。

在我看来,一切似乎都很好。即使对于映射验证命令。事实上,当我执行时php app/console doctrine:schema:validate,它告诉我我的模式是有效的。但是,此命令然后尝试将我的架构与数据库中的架构进行比较,但此时它只是失败了。php app/console doctrine:schema:update --dump-sql以完全相同的方式失败。所以这很尴尬,因为它告诉我我的模式是有效的,但它不能正确使用它。

错误:

[ErrorException]
警告:array_keys() 期望参数 1 为数组,/vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Index.php 第 95 行中给出的 null

一旦我将 InheritanceType 和 DiscriminatorColumn 注释添加到类 B 和 C 中,就会出现错误。事情是它告诉我我的模式是有效的。

如果我做错了什么,有人知道吗?或者它绝对是 Doctrine 中的一个错误?您是否有任何其他想法可以带来至少与我当前解决方案一样多的灵活性?

艾略提

编辑:我将拥有方更改为抽象类 B 和 C,因为根据文档,拥有方是具有外键的一方,并且必须使用 inversedBy 属性。即使进行了这些更改,我的架构仍然有效,并且仍然会发生相同的错误。

EDIT2:如果我在 B(和 C)中创建另一个字段来保存实体的身份而不是一对一关联,则错误会消失,但它不再像我的有效模式。

EDIT3:我与 Doctrine 开发团队的一名成员聊天,他告诉我这绝对看起来像一个错误。错误报告在这里