Tsql 继承与普通(命名和类型相同)列?

Tsql 继承与普通(命名和类型相同)列?,tsql,entity-framework,database-design,Tsql,Entity Framework,Database Design,哪种型号比较好?A还是B? 考虑到我现在有更多的公共栏5实际上,更多60岁以上的实体和更多的关系,虽然大多数表只是简单的字典,枚举了名称集,没有自己的列。我肯定会使用示例A。您的所有查询都将变得更加复杂,并且在每次查找时都必须加入名称属性,这很可能要慢得多 即使您的ORM完全抽象了这种继承关系,我敢打赌,在某个时候您将不得不编写一个原始SQL查询,并且必须将NamedEntity连接到每个表上将是一个巨大的痛苦。我同意Andy的观点。把不同领域的东西从客户名称、城市名称、国家名称中混合在一个列中

哪种型号比较好?A还是B?
考虑到我现在有更多的公共栏5实际上,更多60岁以上的实体和更多的关系,虽然大多数表只是简单的字典,枚举了名称集,没有自己的列。

我肯定会使用示例A。您的所有查询都将变得更加复杂,并且在每次查找时都必须加入名称属性,这很可能要慢得多


即使您的ORM完全抽象了这种继承关系,我敢打赌,在某个时候您将不得不编写一个原始SQL查询,并且必须将NamedEntity连接到每个表上将是一个巨大的痛苦。

我同意Andy的观点。把不同领域的东西从客户名称、城市名称、国家名称中混合在一个列中,这样做是没有意义的。这将使选择数据类型、完整性约束、引用约束和查询变得不必要的复杂和低效

我会将这些共享字段放在ComplexType中,然后向每个实体添加该类型的属性

使用ORM时的继承应该遵守与正常OO中相同的规则,即当您具有is a关系时

因此,将repitition封装在复杂类型中,并避免继承


尽管名称可能不应包含在那个复杂类型中,但它似乎是实体的核心属性。

有一种称为泛化-专门化的通用模式。OO通过继承的方式处理genspec。对于OO思维来说,这似乎简单而自然

SQL和SQL背后的关系数据模型是构建现实的非常强大的工具。但这种思维方式与面向对象有很大不同。有一种方法可以为genspec模式设计表,它非常有用和强大。它不像继承那么简单,而且在介绍数据库设计的教程中经常被忽略


如果你在网上搜索泛化专门化关系建模,你会发现至少有十几篇好文章,有些不太好,用于设计表格以模拟gen spec模式。

但我有60多个实体,共有5个字段,没有提到Id。不要重复自己的原则让我紧张,我复制粘贴了5个字段中的每一个60次。我不确定您的公共列是什么,但就Id和其他公共列(如CreateDate)而言,最后,我一定会把这些放在每张桌子上。你是对的,这里有重复,但是相信我,不要太喜欢数据继承关系。如果您有60多个实体共享同一个域相关列(即非审核列),则可能值得考虑在数据库中使用不同的继承模型,例如“每个层次结构的表”。@Zoe您刚刚编辑了一个与此问题相关的链接,其内容对其至关重要。并不是说应该有联系。在该链接中的任何文本/表格/ERD都应该是问题中的文本而不是图像。请从其他文本中转述或引用。仅将图像用于不能表示为文本或扩充文本的内容。无法搜索或剪切粘贴图像。包括带有图像的图例/图例和说明。使你的文章独立。使用编辑功能插入图像/链接。@philipxy尽管我很想恢复它,但我不能。Yfrog是一个失效的重定向服务,它不存在于internet存档中。我现在删除了一些yfrog链接,我在互联网档案中找到了大约40个链接中的两个。一个没有4xx或其他状态代码,另一个没有包含图像。不管链接是否存在,它都是无效的,不会给任何东西增加任何价值。另请参见-因此,除非您有恢复不可恢复图像的想法,否则我的编辑仍然有效。@Zoe当然可以,但如果您要删除链接&没有任何东西可以放在它的位置,那么您可以留下一个指示或注释,而不是每个读者都必须查看编辑历史来查看发生了什么。