代码之家  ›  专栏  ›  技术社区  ›  NinjaCat

数据库设计:如何处理可以被其他两个表引用的表?

  •  1
  • NinjaCat  · 技术社区  · 15 年前

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

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

    客户和员工都可以向WorkItemNotes表添加注释,并且相关的ID将存储在该表中:

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

    4 回复  |  直到 15 年前
        1
  •  3
  •   Marcelo Cantos    15 年前

    最简洁的解决方案是将一个人的存在作为一个事实来建模,区别于他们作为客户或雇员的身份,并将注释与人的关系联系起来:

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

    这还有一个额外的特性(或不符合特性,取决于业务规则),即员工也可以是客户。

        2
  •  1
  •   Pranay Rana    15 年前

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

    在表中再添加一个字段,因为AuthorType对您有用

    • AuthorType=1个客户
    • AuthorType=2名员工
        3
  •  1
  •   Jagmag    15 年前

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

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

    有两个单独的员工和客户表 它们中的每一个都有一个对users表的UserID的FK引用,其中包含客户/员工特定的信息

        4
  •  1
  •   Simon Hughes    15 年前

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

    这种设计只允许一个音符。因此,如果需要n个注释,则需要一个链接表,例如:

    **Notes**
    external_id
    external_type
    note_id