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

Database design 数据库设计:如何处理可以被其他两个表引用的表?,database-design,Database Design,我有一个名为WorkItemNotes的表格,为客户和员工提供单独的表格 我正在使用MySQL WorkBench映射数据库表和关系,并有几个问题 客户和员工都可以向WorkItemNotes表添加注释,相关ID将存储在表中: | WorkItemNotes | | guid/ID | | Notes | | Author | 我最好有两张记录表,客户和员工各一张?或者,如果我保留一个表,如何在WorkBench中设置关系。将foreignkey附加到

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

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

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

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

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

你可以这样做

| WorkItemNotes |
| guid/ID       |
| Notes         |
| Author        |
| AuthorType    |
在表中再添加一个字段,因为AuthorType将为您提供帮助

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

你可以这样做

| WorkItemNotes |
| guid/ID       |
| Notes         |
| Author        |
| AuthorType    |
在表中再添加一个字段,因为AuthorType将为您提供帮助

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

    • 我可能会尝试这样做

      有一个以UserID为ID的通用users表 也许您可以添加一个名为“用户类型”的列,该列可以是雇员/客户/其他人

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

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

      我可能会尝试这样做

      有一个以UserID为ID的通用users表 也许您可以添加一个名为“用户类型”的列,该列可以是雇员/客户/其他人

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

      有两个单独的员工和客户表
      它们中的每一个都有一个FK引用,该引用引用包含客户/员工特定信息的users表的UserID。notes表中的主键(比如note_id)将存储在customers and 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
      
      外部_类型=客户1,员工2。外部id是客户id或员工id

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

      只有一个表用于注释。notes表中的主键(比如note_id)将存储在customers and 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
      
      外部_类型=客户1,员工2。外部id是客户id或员工id

      这种设计允许许多不同的表格做笔记。
      如果只有两个表可以存储注释,那么只需使用两个注释表即可,但这种设计允许使用多个注释表。但是,由于链接表能够连接到任何客户或员工表,因此您不能使用FK。最干净的解决方案是将一个人的存在作为一个事实建模,不同于他们作为客户或员工的状态,并将注释与人员关系联系起来:

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

      这还有一个附加功能(或不符合功能,取决于业务规则),即员工也可以是客户。

      最干净的解决方案是将一个人的存在作为一个事实建模,不同于他们作为客户或员工的状态,并将注释与个人关系联系起来:

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

      这还有一个附加功能(或不符合功能,取决于业务规则),即员工也可以是客户。

      您的头衔具有误导性。实际上,
      WorkItemNotes
      是引用示例中其他表的表……您的标题有误导性。实际上,
      WorkItemNotes
      是引用示例中其他表的表…因此在这个模型中,Person字段中所有参与者的共享属性,而函数特定属性存储在Customer或Employee表中…并且从这个方法,我如何区分客户或员工?在Customer和Employee表中有一个单独的字段?您可以通过找到它们的位置来区分它们。@NinjaCat-您可以亲自创建一个PersonType字段,该字段将为您提供类型,而无需连接到任何子表。PersonType是泛型person的一个属性,在这里非常合适。此外,此personType本身可以是主person type表中的FK,该表中可能包含应用程序中所有可能的人员类型(客户/员工/可能还有其他类型)@Marcelo-可能是这样-但是可能有很多场景,其中业务逻辑本身取决于需要显示的用户类型/页面的不同视图等-因此了解类型可能是一个非常有效的要求因此在该模型中,Person字段中所有参与者的共享属性,当特定于功能的属性存储在Customer或Employee表中时……从这个方法中,我如何区分Customer或Employee?在Customer和Employee表中有一个单独的字段?您可以通过找到它们的位置来区分它们。@NinjaCat-您可以亲自创建一个PersonType字段,该字段将为您提供类型,而无需连接到任何子表。PersonType是泛型person的一个属性,在这里非常合适。此外,此personType本身可以是主person type表中的FK,该表中可能包含应用程序中所有可能的人员类型(客户/员工/可能还有其他类型)@Marcelo-可能是这样-但在许多情况下,业务逻辑可能会