2

我们的数据库设计有问题。我们不得不将我们的客户联系信息模式分解为单独的表: Phone table,Email table, Fax table等等,然后我们在主表和不同的联系表many-to-many之间建立了关系。customer

例如,如果客户在不同地点工作并与其他客户共享不同位的联系信息,则客户可以拥有许多电话号码。我正在尝试在创建一个通用表以保存所有形式的联系人数据和查找contacts_types具有标签值的字段(如personal, email,work email,home phone ,cell phone, work phone , home fax ,work fax,work website etc.

你会建议哪种设计?

4

4 回答 4

2

作为从事数据库工作多年的人,请创建单独的表。首先,最终您可能需要不同的字段(我知道我们的电话表和电子邮件表具有不同的结构)。其次,您描述的模型是EAV 模型,它通常是性能和数据完整性的糟糕选择(很难强制执行您需要的所有 FK)。

我永远不会使用 EAV 表,除非它非常多变(比如所有可能的医学测试的细节)以至于我别无选择。

于 2012-10-05T17:21:05.923 回答
0

要设计这样的数据库,您需要与表创建多对多关系。你会需要

联系人
1 --- * 电话 * --- 1 电话类型
1 --- * 电子邮件 * --- 1 电子邮件类型

如果您需要与其他联系人共享电话或电子邮件,则:

联系人
* --- * 电话 * --- 1 个电话类型
* --- * 电子邮件 * --- 1 个电子邮件类型

这是基本的数据库设计。我建议你阅读一些例子来给你更多的想法。

编辑:我找到了一个简单的图表来帮助:http: //imar.spaanjaars.com/Images/Articles/N-LayerDesign/DatabaseDiagram.jpg

完整的示例在“设计 - 收集要求”部分 http://imar.spaanjaars.com/416/building-layered-web-applications-with-microsoft-aspnet-20-part-1

如果需要参考表,您可以添加 PhoneType(家庭传真、工作传真、家庭电话等)或 EmailType(家庭、工作)表。

于 2012-10-05T13:38:04.113 回答
0

一个人可以有零个或多个地址,一个地址可以被零个或多个人使用。地址分配会随着时间而改变。

这是正确的答案:

Party -< PartyAddress >- Address

PartyAddress{
  partyId
  addressId
  fromDate
  toDate (nullable)
  label -> [work, home, fax, ...]
  extension (nullable)
}

TelephoneNumber : Address
EmailAddress : Address
WebSite : Address
MailingAddress : Address

为销售订单处理抽象地址很有用。这样,您可以根据需要将订单发送到电子邮件地址。还可以轻松“列出与此联系人的所有通信方式”

于 2012-10-05T18:04:20.990 回答
-1

看起来你需要一个“联系人”表:

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)

大概这个表的主键是电话号码,因为这应该是唯一的(问题是人们输入了错误的电话号码)

我认为每个联系人只有一个电子邮件地址 - 而我有三个地址,一个用于工作,一个用于家庭,一个用于垃圾邮件。在工作情况下,我只会给我的工作电子邮件,所以这是存储在“联系人”表中的电子邮件。

此架构允许您为每个客户多个联系人,每个联系人多个电话号码。

于 2012-10-05T15:47:06.747 回答