当一个记录可以是多个表的子节点时,如何强制记录只是一个记录的子节点?

时间:2013-08-23 19:42:50

标签: sql-server database-design

我正在集思广益,如何重组数据库的联系信息。如您所知,电话号码可以链接到某个人(手机),家庭(家庭电话),组织/企业等。逻辑上,电话号码是电话号码是电话号码。手机号码和家庭电话号码之间没有真正的区别。一个人可以拥有多部手机,一个家庭可以拥有多条电话线,一个组织可以拥有许多电话线。

通常,在设计表时,这意味着应该有一个电话号码表。它应该与人或家庭或组织中的一对多联系起来。问题是,有人会如何强制执行电话记录仅由单个父记录拥有,无论该记录是个人记录,家庭记录还是组织记录?

在我看来,我发现的唯一两种方法是kludges。我想要一个优雅的解决方案。

首先是创建3个表,PersonPhones,FamilyPhones和OrganizationPhones。然后你有3个表,其任务是存储基本相同的数据。

第二种是创建一个具有奇怪结构的单个电话表。它将具有电话号码,用于个人ID的可空字段,用于家庭ID的另一个字段和用于组织ID的第三个字段。然后添加一个约束,强制执行这3个中的2个为NULL。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您的PhoneTable中可以有3列(Person_Id,Phone_Number和Phone_Details)。在Phone_Details列中,您可以提及其手机,家庭或组织。然后,您可以在Person_Id和Phone_Details的组合上定义唯一键。

答案 1 :(得分:0)

通常有两种方法可以解决这种情况:

  • 一种方法是使用继承 - 创建一个“PhoneOwner”表,该表将是人员,家庭,组织和任何其他需要能够拥有电话的实体的逻辑父级。然后只需将电话链接到PhoneOwner。
  • 另一种方法是使用您已在问题中描述的独占外键

两者都不理想,您必须决定哪一种更适合您的需求。

另请参阅:"What is the best design for a database table that can be owned by two different resources, and therefore needs two different foreign keys?"