在标准化设计中处理主要通信记录的最佳方法

时间:2011-04-10 01:52:04

标签: database-design normalization

我在发布此问题之前进行了搜索,但没有找到任何直接相关的内容,所以如果这是重复的话,我会道歉。我正在设计一个业务系统,就像任何业务系统一样,我有一个带有CustomerID PK Identity列的Customers表。

我正在处理电话号码/电子邮件地址表格,我希望这些表格可以规划,以便任何给定的CustomerID可以有多个电话号码和/或电子邮件地址。大多数企业会将一个电话号码关联到任何一个人的帐户,并将其称为主要电话号码。此电话号码可能是任何陈述,报告等上显示的电话号码。与电子邮件地址相同。

如果我想获得带有主要电话和电子邮件地址的客户列表,我开始考虑SELECT查询的工作原理。显然我可以使用内部联接来检索信息,但我只希望每个CustomerID显示一次,如果CustomerID有两个电话号码,那么它们将在列表中显示两次。

所以我最初的想法是创建一个名为CustomerCommunications的表并存储电话号码和电子邮件地址,并在那里添加FlagPrimary列,但这没有多大意义,因为如果一条记录是电话号码或一个电子邮件地址。 (显然,内容会将其丢弃,但从查询的角度来看,这将是一项挑战)。那么我想到为主电话和主电子邮件添加一个带有单独行的CommunicationTypes表。然后在CustomerCommunications表中,我将添加一个名为CommunicationTypeID的外键,这将允许我轻松识别哪个是主要电话,哪个是主要电子邮件。但后来我开始考虑其他电话和电子邮件地址记录的CommunicationTypeID。只是电话和电子邮件?辅助电话和电子邮件?

显然这个问题是主观的,并且取决于自己的设计理念,但基本上我正在寻找的是其他人在使用1到很多表时所使用的想法,但希望能够轻松地为显示或报告目的。

1 个答案:

答案 0 :(得分:1)

首先,您可能需要考虑将电子邮件地址和电话号码保存在单独的表中。根据您的观点,它们具有不同的属性和用途。如果您将它们放在一个表中,那么您应该有一个分区属性来区分信息是电话号码还是电子邮件地址。如果您使用代码作为分区属性,那么您可以选择稍后在需要时添加其他通信类型。

如果您的业务规则是只有一个电话号码和一个地址可以是主要的,并且他们可以拥有任意数量的其他地址,那么使用数据库架构强制执行此操作的方法是将外键置于其上客户表指向主要联系人。这意味着您的PHONE_NUMBER表具有FK到CUSTOMER,并且CUSTOMER具有FK到PHONE_NUMBER(例如,primary_phone_number_id)。电子邮件也是如此。如果您将电子邮件和电话号码混合在同一个表中,您仍然需要触发器或其他一些程序逻辑,以确保您指向每个客户的一个电话号码和一封电子邮件。这是将不同的联系人类型分解为自己的表的另一个优点。 FK可以完成所有繁重的工作,并且您没有任何可能容易出错的程序代码。