1

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

通常,在设计表格时,这意味着应该有一个电话号码表。它应该以一对多的方式链接到个人或家庭或组织。问题是,有人将如何强制电话记录仅由单个父记录拥有,无论该记录是个人记录、家庭记录还是组织记录?

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

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

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

有任何想法吗?

4

2 回答 2

0

通常有两种方法来处理这样的情况:

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

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

另请参阅:“对于可以由两个不同资源拥有并因此需要两个不同外键的数据库表的最佳设计是什么?”

于 2013-08-23T20:15:09.373 回答
0

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

于 2013-08-23T19:50:37.333 回答