Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 所有实体都从一个主基表继承的优点和缺点是什么?_Sql Server_Entity Framework_Database Design_Entity Framework 4.1 - Fatal编程技术网

Sql server 所有实体都从一个主基表继承的优点和缺点是什么?

Sql server 所有实体都从一个主基表继承的优点和缺点是什么?,sql-server,entity-framework,database-design,entity-framework-4.1,Sql Server,Entity Framework,Database Design,Entity Framework 4.1,我使用实体框架数据库优先的方法来创建我的域模型 我正在考虑创建一个基表EntityBase,其基属性位于: PK CreatedDate CreatedBy ModifiedDate ModifiedBy etc. 使用每种类型的表继承,我将在数据库中得到一个链接到所有其他实体表的表: EntityBase { EntityBase_PK => Identity PK CreatedDate CreatedBy ModifiedDate ModifiedBy }

我使用实体框架数据库优先的方法来创建我的域模型

我正在考虑创建一个基表EntityBase,其基属性位于:

 PK
 CreatedDate
 CreatedBy
 ModifiedDate
 ModifiedBy

 etc.
使用每种类型的表继承,我将在数据库中得到一个链接到所有其他实体表的表:

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
我相信这将与实体框架配合使用,但我担心从数据库的角度来看,这是否是一个好的设计

我能看到的明显好处是,我为整个数据库中的所有实体都获得了一个唯一的PK,但我担心的是,每次更新都会命中EntityBase表,这不仅会影响性能,还会影响表锁定


想法?

面向对象的概念很少转化为关系数据库。作为一名DBA,我花了更多的时间来清理将OO概念硬塞进关系数据库的尝试(这不是因为我是一个纯粹主义者,而是因为它们不起作用)

如果您希望在所有实体中使用唯一的PK,请查看GUID(或顺序GUID)

这些列(CreatedDate、ModifiedDate等)位于每个实体表中不会有任何影响(事实上,这是正确的设计),但是,当您一次又一次地连接回基表时,您会看到糟糕的查询计划

简言之,我建议不要这样做

我能看到的明显好处是,我为所有人都获得了一个独特的PK 整个数据库中的实体


您不能通过对您的身份使用HiLo算法或类似算法来实现这一点吗?

最大的问题将是性能。您所描述的被称为TPT继承,在.NET4.5With发布之前,这将是具有的场景

对于
ObjectContext
API,它还有一个额外的缺点。您不能有派生类型的
ObjectSet
,因此您将以所有实体的单个对象集结束


如果您想要良好的OOP概念,请定义与字段的接口,并在所有实体中实现该接口,但不要使用跨越概念模型和存储模型的继承绑定实体。即使是TPC也不是很好的解决方案,因为它在所有表中仍然需要唯一的主键=>它会导致GUI。

我能说的是,您正在明确地规范化数据。但是,请记住,无论何时需要查询已创建和修改字段的基表,都需要联接基表,每个表中的每一行对应一行。这可能会很贵。也许重新考虑一下目的和您试图解决的问题。您说,“我能看到的明显好处是,我在整个数据库中为所有实体获得了唯一的PK。”我从未见过这样的要求,“用于供应商的ID号不得用于客户、地址、订单、订单行项目、网页或Cat。“@JohnHartsock:创建抽象与规范化没有任何关系。正如ladislav所说,性能将是一个问题,尽管您不必将基类映射到一个表,只需在所有表中创建审核列(纯联接表除外),它还将使dba happyAs在所有实体中都是唯一的键,我同意这不是一个显而易见的好处,但我相信它确实有助于提供跨所有实体的通用实体搜索,例如Salesforce做了类似的事情。我将此标记为答案,因为它与我正在使用的EF直接相关(我编辑了原始问题以澄清这一点)。基于此,我将避免数据库模型中的继承,并研究如何使用对象模型中的接口实现这一点。我如何在T4模板生成的实体上实现intefaces,使其不会在每次重新生成实体时被覆盖?您只需修改模板即可将接口添加到所有实体类(如果所有实体类都使用这些字段)。如果您需要有选择地这样做,最好定义自己的实体类的部分部分来实现接口。感谢DBA对这一点的看法-这是我所怀疑的,因此我不愿意继续。似乎我越是使用EF,它就希望我以一种非常具体的方式来塑造我的数据库,这对于性能或良好的数据库设计来说可能不是最佳的。