数据库设计 - 多个实体的类似联系信息

时间:2010-09-03 13:12:33

标签: database-design relational-database contact erd

我意识到这些类型问题的答案往往“取决于”,但我仍然想知道普遍的共识可能是什么。

我正在处理多个实体,例如

  1. 公司
  2. 慈善
  3. 审计员
  4. Stocktaker
  5. 等等......

    所有这些都有联系信息,如电子邮件,电话和地址。

    我想要存储联系信息的两种设计方法是

    方法1)在联系表与公司,慈善机构,审计员和盘点工作者之间创建角色表。

    • dbo.Company - > dbo.CompanyAddress< - dbo.Address
    • dbo.Company - > dbo.Companytelephone< - dbo.telephone
    • dbo.Company - > dbo.Companyaddress< - dbo.email

    • dbo.Auditor-> dbo.AuditorAddress< - dbo.Address

    • dbo.Auditor-> dbo.Auditortelephone< - dbo.telephone
    • dbo.Auditor-> dbo.Auditoraddress< - dbo.email

    优点是,数据库中只需要一个地址,电话和电子邮件表,每个实体类型的所有电话号码,地址和电子邮件都存储在一个地方 缺点是它创建了许多关联表

    方法2)为每家公司,慈善机构,审计员和清单

    创建一个单独的联系表
    • dbo.Company - > dbo.CompanyContactAddress
    • dbo.Company - > dbo.CompanyContacttelephone
    • dbo.Company - > dbo.CompanyContactaddress

    • dbo.Auditor - > dbo.AuditorContactAddress

    • dbo.Auditor - > dbo.AuditorContacttelephone
    • dbo.Auditor - > dbo.AuditorContactaddress

    这样做的优点更容易实现和维护 缺点是联系人详细信息存储在整个数据库的多个位置。

    如果有人有任何其他想法,将不胜感激。

    非常感谢

3 个答案:

答案 0 :(得分:1)

当你说“它取决于”时你是对的。这取决于您将用于OLTP的数据,您将看到标准化设计,以及报告系统,您希望数据通过与其他数据组件内联的联系信息进行反规范化。

在规范化数据库中,也可以讨论规范化水平。有些人会说你的第一个场景中的联系信息就像你一样。我喜欢走“中间路线”我会在一张桌子上提供所有联系信息,包括地址,电话和电子邮件。

Contact
ID, Address, Address2, City, State, Zip, Phone, Email

然后用单独的表创建一个关系

CompanyContact
ID, CompanyID, ContactID

这也可以集成到公司表中,只需在公司表中添加ContactID并避免单独的关系并加入。

您还可以使用ContactTypes实现表格。

ContactType 
ID, ContactType
1, Company
2, Charity
3, Auditor
....

然后你可以在CompanyContact表中指定并删除对关系的需要。虽然它适合您每种类型1个联系人的情况,但它没有留下增长空间。

答案 1 :(得分:0)

我更喜欢你的方法2,但它仍然看起来太多了。为什么不只是有一个PhoneNumber,Address等...存储所有地址,电话号码,whatevers的表格,然后从公司,审计员等参考......?我可能就是这样做的。

答案 2 :(得分:0)

您可以为所有人使用单个表,并使用如下所示的数据类型。 alt text