Database design 如何使用其他几个表中的外键对表进行建模

Database design 如何使用其他几个表中的外键对表进行建模,database-design,data-modeling,Database Design,Data Modeling,我正在尝试创建一个联系人应用程序,它有两个主要实体:个人和公司。一个人可以有许多电子邮件、号码和地址。一家公司也可以有许多电子邮件、号码和地址。我正在尝试为这个场景确定合适的设计 选项#1-多个外键 电子邮件、号码和地址将有两列,分别称为person_id和company_id。根据数据所属的实体,其中一列将为空,另一列将包含链接回父级的id 选项2-每个实体每种类型一个表 我复制每个表,这样就有一个公司地址表和一个人地址表。我会有两倍多的表,但这是目前最有意义的解决方案 选项3-一个链接表 我

我正在尝试创建一个联系人应用程序,它有两个主要实体:个人和公司。一个人可以有许多电子邮件、号码和地址。一家公司也可以有许多电子邮件、号码和地址。我正在尝试为这个场景确定合适的设计

选项#1-多个外键
电子邮件、号码和地址将有两列,分别称为person_id和company_id。根据数据所属的实体,其中一列将为空,另一列将包含链接回父级的id

选项2-每个实体每种类型一个表
我复制每个表,这样就有一个公司地址表和一个人地址表。我会有两倍多的表,但这是目前最有意义的解决方案

选项3-一个链接表
我创建了一个表-“链接”。此表将包含四列:source\u id、source\u entity、dest\u id、dest\u entity。所以,如果一家公司得到一个新的数字,你会有一行像:1,数字,2,公司

选项4-多个链接表
我为每种链接类型(公司地址、个人地址、公司电子邮件、个人电子邮件等)创建一个表

您会选择哪个选项?

选项2或我会这样做:

您可以创建一个EntityTable来定义Id和实体类型,然后您可以将您的地址、电子邮件表链接到该表

然后创建引用回实体的Person&Company表。换句话说,就是你的子类实体

选项#1-我过去就用过这个,随着事情变得复杂和发展,它可能会成为一个让人头疼的问题


选项#3-您不能使用引用完整性,并且您从节省几个按键来执行选项#2所带来的成本不值得清理坏数据或处理额外的复杂性

你提到了一些我认为你应该避免的做法。我写了更多关于这方面的文章(如独家弧)

至于你的问题,我实际上不会选择任何一个选项。你正蹒跚地走向一个新的世界。基本上,您有一个具有子类型(如个人和组织)的政党实体。联系人将参与方ID作为外键。普通超类/超实体的使用要比这深刻得多,但是您会发现,您还可以将其用于许多其他事情(例如整个角色概念)

很多这样的数据库设计建模问题都有成熟的解决方案,但程序员们从来没有教过这样的问题。我强烈建议你去读这本书,书中详细介绍了如何为人和组织建模,以及许多其他典型问题


这里要记住的关键点是,您所做的事情以前已经做过。

谢谢cletus-我认为这是以前做过的事情,考虑到示例的简单性,我认为有一种设计实践是围绕这一点进行的。我会查看链接和书籍。快告诉我,这正是我要建议的,但我怀疑写得更好一些。我一定会查看链接。