我正在尝试创建一个包含两个主要实体的联系人应用程序 - 个人和公司.一个人可以拥有许多电子邮件,号码和地址.公司还可以拥有许多电子邮件,号码和地址.我正在尝试为这种情况确定合适的设计.
选项#1 - 多个外键
电子邮件,号码和地址将有两列名为person_id和company_id.根据数据所属的实体,一个将为null,另一个将包含一个链接回父级的id.
选项#2 - 每个实体每个类型一个表
我复制每个表,因此会有一个company_addresses表和一个person_addresses表.我会有两倍的表,但这是现在最有意义的解决方案.
选项#3 - 一个链接表
我创建了一个表 - "链接".该表将包含四列:source_id,source_entity,dest_id,dest_entity.因此,如果公司获得一个新号码,您将拥有如下行:1,number,2,company.
选项#4 - 多个链接表
我为每种类型的链接创建一个表(company_address,person_address,company_email,person_email等)
你会选择哪个选项?
你已经谈到了一些我认为你会避免的做法.我在AppDevelopers制作的数据库开发错误中写了更多关于此的内容(例如,独占弧).
至于你的问题,我实际上不会选择这些选项.你绊倒的是一个通用的Party模型.基本上,您有一个具有子类型的Party实体,例如Person和Organization.联系人具有Party ID作为外键.使用共同的超类/超级性比这更深刻,因为你会发现你也将它用于许多其他事情(例如整个角色概念).
很多这些数据库设计建模问题都有成熟的解决方案,但它们往往不是程序员所教过的东西.我强烈建议你阅读The Data Model Resource Book,Vol.1:适用于所有企业的通用数据模型库,其中详细介绍了如何为人员和组织建模以及许多其他典型问题.
这里要记住的关键点是你以前做过的事情.