一个主表作为所有实体的继承表,有哪些优缺点?

5

我正在使用Entity Framework的数据库优先方法来创建领域模型。

我考虑创建一个基础表EntityBase,其中包含基本属性:

 PK
 CreatedDate
 CreatedBy
 ModifiedDate
 ModifiedBy

 etc.

使用“每类型表继承”(Table Per Type inheritance)后,我将在数据库中得到一个与所有其他实体表相连的单个表:
EntityBase {
 EntityBase_PK => Identity PK
 CreatedDate
 CreatedBy
 ModifiedDate
 ModifiedBy
}

DerivedEntity1 {
 DerivedEntity1_PK => FK relationship to EntityBase on EntityBase_PK
 Property1 
 ...etc
}

DerivedEntity2 {
 DerivedEntity2_PK => FK relationship to EntityBase on EntityBase_PK
 Property2 
 ...etc
}

...etc

我认为这个方案可以适用于Entity Framework, 但我担心从数据库设计的角度看,这是否是一个好的设计。
显而易见的好处是,我可以在整个数据库中获得所有实体的唯一主键,但我担心每次更新都会影响到EntityBase表的性能,并且可能会对表锁定产生影响。
您有什么想法吗?

我只能说你肯定在对数据进行规范化。但是请记住,每当您需要查询创建和修改字段的基础时,您将需要加入基础表,该表将为每个表中的每一行提供一行。这可能会很昂贵。也许重新考虑目的和您要解决的问题。 - John Hartsock
1
你说过:“我能看到的明显好处是,我可以为整个数据库中的所有实体获得唯一的PK。” 我从未见过任何要求类似于“用于供应商的ID号码绝不能用于客户、地址、订单、订单行项目、网页或猫”。 - Mike Sherrill 'Cat Recall'
1
@JohnHartsock:创建抽象与规范化没有任何关系。 - Mike Sherrill 'Cat Recall'
正如Ladislav所说,性能可能会成为一个问题,但你并不需要将基类映射到表中,只需在所有表中创建审计列(除了纯连接表),这也会让数据库管理员感到满意。 - np-hard
就所有实体而言,独特的键并不是一个立即显而易见的好处,但我认为它有助于提供跨所有实体的通用实体搜索,例如Salesforce就是这样做的。 - James Close
3个回答

6
OO的概念很难应用到关系型数据库中。作为一个DBA,我花了更多时间清理试图将OO概念塞入关系型数据库中的尝试(并不是因为我是个纯粹主义者,而是因为它们行不通)。
如果你希望所有实体都有唯一主键,请查看guids(或连续的guids)。
那些列(CreatedDate,ModifiedDate等)在每个实体表中都存在也不会有任何问题(事实上,这是正确的设计)。然而,当你反复加入基本表时,你会看到糟糕的查询计划。
总之,我建议不要这样做。

感谢DBA在这方面的观点,正是我所怀疑的,因此我不太愿意继续前进。似乎我使用EF的越多,它就希望我以一种非常特定的方式塑造我的数据库,而这可能并不是性能或良好数据库设计的最佳选择。 - James Close

6
最大的问题将是性能。您所描述的称为TPT继承,在.NET 4.5之前,使用EF的下一个版本,这将是非常低效的查询的情况。
ObjectContext API的情况下,它有一个额外的缺点。您无法拥有派生类型的ObjectSet,因此您将以单个对象集结束所有实体。
如果您想要良好的OOP概念,请定义带有字段的接口,并在所有实体中实现该接口,但不要将实体与跨越概念和存储模型的继承绑定在一起。即使TPC也不是很好的解决方案,因为它仍然需要所有表中的唯一主键=>这会导致GUID。

我将此标记为答案,因为它直接涉及到我正在使用的EF(我已编辑原始问题以明确这一点)。基于此,我将避免在我的数据库模型中使用继承,并研究在对象模型中使用接口的方法。有什么想法如何实现T4模板生成的实体上的接口,以便每次重新生成实体时都不会被覆盖? - James Close
你可以简单地修改模板,为所有实体类添加接口(如果它们都使用这些字段)。如果需要有选择地进行操作,则最好定义自己的实体类部分来实现接口。 - Ladislav Mrnka

0
我能看到的明显好处是,我可以获得整个数据库中所有实体的唯一主键。

你不能通过使用 HiLo 算法或类似算法来为您的标识符实现这一点吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接