database-design - 数据库设计多个表 vs 通用表?

  显示原文与译文双语对照的内容
65 4

我们的数据库设计有问题。我们不得不将客户联系信息架构分成不同的表:Phone table,Email table, Fax table然后我们在主 customer 表和不同的联系表之间有一个 many-to-many 关系。

例如客户在不同的地点工作,并且与其他客户共享不同的联系信息时,可以有很多电话号码。我正在决定创建一个通用表以保存所有形式的联系人数据,并使用 contacts_types 字段的查找表。personal, email,work email,home phone, cell phone, work phone, home fax, work fax,work website etc

你建议哪种设计?

时间:原作者:0个回答

88 0

个人可以有零个或者多个地址,一个地址可以被零或者多个人使用。地址分配可以随时间变化。

这是正确的答案:

Party - <PartyAddress> - Address
PartyAddress{
 partyId
 addressId
 fromDate
 toDate (nullable)
 label -> [work, home, fax,.. .]
 extension (nullable)
}
TelephoneNumber : Address
EmailAddress : Address
WebSite : Address
MailingAddress : Address

对销售订单处理的地址进行抽象是很有用的。这样你就可以在你想要的时候完成一个电子邮件地址的订单。同时也便于"列表中列出所有的通信方法"

原作者:
69 3

作为多年来完成数据库工作的人,创建单独的表。首先,你可能需要不同的字段( 我知道我们的电话表和电子邮件表格有不同的结构) 。第二种模型是一个 EAV模型,它通常是性能和数据完整性的不好选择。

我不会使用EAV表,除非它是可以变的( 就像所有可能的医疗测试的细节),否则我没有它的他选择。

原作者:
91 4

它看起来像你需要一个'联系人'表:

contact id
customer id
first name
surname
... other fields which would have only one value per contact

还有一个电话表

contact id
phone number
phone type (home, office, mobile, fax)

可以能这个表的主键是电话号码,因为这应该是唯一的( 问题是人们输入 false 电话号码) 。

我认为每个联系人只有一个电子邮件地址- 我有三个地址,一个是工作,一个是垃圾邮件。在工作情况下,我只给了我的工作电子邮件,这是一个存储在'联系人'表中的。

这个模式允许每个客户有多个联系人,每个联系人有多个电话号码。

原作者:
...