以下情况的正确设计是什么:
我有人(t_people)有电话号码(t_numbers)。
在数字表中看起来与一个外键的简单的一对多关系。 EER diagram 1
但不仅人们可以拥有电话号码 - 公司(t_companies)也可以拥有电话号码。
我只想使用一个电话号码表。看起来我需要两个一对多的关系,一个表(t_numbers)引用t_people OR到t_companies。
我应该使用两个外键,允许它们都为NULL。 EER diagram 2
或者我根本不应该使用外键? 例如。我可以有一个"参考栏"使用一个或另一个表的ID,以及存储第一列所引用的表的第二个表。 [我不允许发布第三张图片......]
这个问题通常如何解决?
(或者shoudl我只是放弃了我只有一个电话号码表的计划,为人们制作一个,为comapnies制作一个。)
答案 0 :(得分:0)
我认为您应该坚持使用第一个图表,只需在t_people表中添加一个类型(人员或公司)列(可能会将表重命名为更通用的表格)。
如果你想要它标准化(你会)最好创建一个至少有2行(人和公司)的实体类型表,并将这个表与“t_people”联系起来
答案 1 :(得分:0)
同一家庭的两名成员可以拥有相同的电话号码吗?一个人可以列出他的公司电话吗?
但是...
在我们很好地了解需要SELECTs
等之前,我们不要设计架构。
如果您只需要显示“给定实体的所有电话号码”,那么VARCHAR
可能会有一个数字的电子邮件。
如果您需要回答“这个号码属于谁/什么”,那么您需要关注电话号码表作为主导表。 可以为同一个电话号码拥有多行。或者可能有多对多表(或多个表)将电话号码映射到实体。
或者“实体”可能是焦点。实体可以是个人或公司。这有点像3个表 - 实体,人和公司。
推迟考虑外国钥匙;首先获得正确的逻辑,然后FK将落实到位。