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

问题描述:

我意识到这些类型的问题的答案通常“取决于”,但我仍然想知道一般共识可能是什么。数据库设计 - 多个实体的类似联系信息

我处理的多个实体如

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

等等...

所有有联系诸如电子邮件,电话等信息ephone和地址。

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

方法1)建立联系表和公司,慈善机构,审计师和stocktaker之间的角色表。

  • 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 < - d bo.telephone
  • dbo.Auditor-> dbo.Auditoraddress < - dbo.email

优势,但仅需要一个地址,电话和电子邮件表,数据库和所有的电话号码,地址和电子邮件的每个实体类型被存储在一个地方 缺点是它产生大量关联表

方法2)创建每个公司,慈善机构,审计和stocktaker一个单独的接触表

  • dbo.Company - > dbo.CompanyContactAddress
  • dbo.Company - > dbo.CompanyContacttelephone
  • dbo.Company - > dbo.CompanyContactaddress

  • dbo.Auditor - > dbo.AuditorContactAddress

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

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

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

非常感谢

当你说“它取决于”时,你是正确的。这取决于你的数据将用于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个联系人的情况,但不会留下增长空间。

+0

干杯达斯汀。我喜欢路中间的想法。我想我会使用这个想法,但我需要迁出地址,因为潜在的各种实体可能有数十个地址。欢呼的建议。 – Pixelated 2010-09-03 13:40:57

我喜欢你的方法2更好,但它似乎仍然太多的工作。为什么不只有一个存储所有地址,电话号码,发信人的电话号码,地址等......表格,然后引用公司,审计员等等......?这可能是我如何做到的。

+0

我确实考虑过这种方法,但假设我有10个不同的实体,所有链接到接触电话表,例如这将创建10个接触电话表中的FK列,每次有9个空值。 – Pixelated 2010-09-03 13:32:03

+0

@FairFunk:我不确定我能得到它......为什么会有一个ContactTelephone中的密钥返回给实体?不应该从另一个方向,从实体到ContactTelephone?那么,如果你真的想要一个反向链接,你可以有实体ID,然后另一个字段告诉你看哪个实体表,所以你只有2个FK列在ContactTelephone而不是10个。 – FrustratedWithFormsDesigner 2010-09-03 13:47:49

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

+0

这是什么数据库?并非所有数据库都支持UDT。 – FrustratedWithFormsDesigner 2010-09-03 13:25:16

+0

没有涉及的UDT,但这一个是SQLite db – Don 2010-09-03 16:00:51