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

标签 database-design relational-database contact erd

我意识到这些类型问题的答案通常是“视情况而定”,但我仍然想知道普遍的共识可能是什么。

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

  • 公司
  • 慈善
  • 审核员
  • 收货员

  • 等等等等...

    其中都有联系信息,如电子邮件、电话和地址。

    我正在考虑存储联系信息的两种设计方法是

    方法 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

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

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

    非常感谢

    最佳答案

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

    在规范化数据库中,规范化的级别也可以争论。有些人会说像在第一个场景中那样拥有详细的联系信息。我喜欢走“路中间”我会把所有的联系信息放在一张 table 上,包括地址、电话和电子邮件。

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

    然后创建一个单独的表的关系
    CompanyContact
    ID, CompanyID, ContactID
    

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

    你也可以用 ContactTypes 实现一个表.
    ContactType 
    ID, ContactType
    1, Company
    2, Charity
    3, Auditor
    ....
    

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

    关于database-design - 数据库设计 - 多个实体的类似联系信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3636061/

    相关文章:

    sql - 何时使用自增主键,何时不使用?

    mysql - 每隔 5 分钟计算一次数据库中有多少条目

    ios - 如何从联系人框架ios9导入联系人

    database-design - 数据库设计和外键 : Where should they be added in related tables?

    mysql - 如何在计算机之间更新mysql表

    mysql - 为简单的多语言 CMS 设计数据库

    java - 继续对象序列化还是使用数据库?

    mysql - 使用带外键和不带外键的引用之间的区别?

    c# - Google 通讯录数据 API 401 错误

    android - 从 ContactProvider 的单个查询中获取联系人列表及其主要电子邮件和电话号码