【问题标题】:Database design: what to do about a table that can be referenced by two other tables?数据库设计:如何处理可以被其他两个表引用的表?
【发布时间】:2011-04-07 18:00:31
【问题描述】:

我有一个名为 WorkItemNotes 的表,并为客户和员工提供了单独的表。

我正在使用 MySQL WorkBench 绘制数据库表和关系,并有几个问题。

Customers 和Employees 都可以在WorkItemNotes 表中添加注释,关联的ID 将存储在表中:

| WorkItemNotes |
| guid/ID       |
| Notes         |
| Author        |

我最好有两张笔记表,客户和员工各一张?或者如果我保留一张表,我如何在 WorkBench 中设置关系。将外键附加到 Customer 和 Employee 表都引用的 Author 字段是否有效?

【问题讨论】:

  • 您的标题具有误导性。实际上,WorkItemNotes 是在您的示例中引用其他表的表...

标签: database-design


【解决方案1】:

最简洁的解决方案是将 Person 的存在建模为事实,与他们作为客户或员工的状态不同,并将 Notes 与 Person 关系联系起来:

Person { PersonID PK, ... }
Customer { PersonID PK FK(Person.PersonID), ... }
Employee { PersonID PK FK(Person.PersonID), ... }
WorkItemNotes { NotesID PK, Notes, AuthorID FK(Person.PersonID) }

这具有员工也可以是客户的附加功能(或错误功能,取决于业务规则)。

【讨论】:

  • 所以在这个模型中,所有参与者的共享属性在 Person 字段中,而功能特定属性存储在 Customer 或 Employee 表中......
  • 从这种方法中,我如何区分客户或员工? Customer 和 Employee 表中的单独字段?
  • 您可以通过它们的发现位置来区分它们。
  • @NinjaCat - 您可以亲自拥有一个 PersonType 字段,它可以为您提供类型,甚至无需加入任何子表。 PersonType 是通用人的一个属性,在这里很适合。此外,此 personType 本身可能是 MASTER 人员类型表中的 FK,该表可能包含您的应用程序中所有可能的人员类型(客户/员工/可能还有其他类型)
  • @Marcelo - 可能是这种情况 - 但在很多情况下,业务逻辑本身取决于用户类型/需要显示不同的页面视图等 - 所以知道类型可能是一个非常有效的要求
【解决方案2】:

你可以这样做

| WorkItemNotes |
| guid/ID       |
| Notes         |
| Author        |
| AuthorType    |

在表中添加一个字段,因为 AuthorType 将为您工作

  • AuthorType =1 客户
  • AuthorType =2 员工

【讨论】:

    【解决方案3】:

    我可能会尝试这样做。

    拥有一个以 UserID 作为 ID 的通用用户表 也许您可以添加一个名为 User Type 的列,它可以是 Employee / Customer / others

    将此用户 ID 作为 FK 链接到 WorkItemNotes。

    有 2 个单独的员工和客户表 他们每个人都有一个对用户表的用户 ID 的 FK 引用,其中包含客户/员工特定信息

    【讨论】:

      【解决方案4】:

      为您的笔记准备一张桌子。 notes 表中的主键,比如 note_id,将存储在您的 customers 和 employees 表中。

      **Note**
      note_id
      notes
      author
      
      **Customers**
      customers_id
      note_id NULL
      ...
      
      **Employees**
      employees_id
      note_id NULL
      

      在员工和便笺之间以及客户和便笺之间建立 FK。 此设计仅允许 1 个音符。所以如果你需要n条笔记,那么你需要一个链接表比如:

      **Notes**
      external_id
      external_type
      note_id
      

      external_type=1 代表客户,2 代表员工。 external_id 是 cusomter_id 或员工 id。

      这种设计允许许多不同的桌子做笔记。 如果您只有两个可以存储笔记的表格,那么只需使用两个笔记表格,但这种设计允许很多。但是,由于链接表能够连接到任何客户或员工表,因此您不能使用 FK。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        • 2015-12-01
        • 2021-02-05
        • 2017-02-28
        • 2012-11-16
        • 1970-01-01
        相关资源
        最近更新 更多