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

时间:2010-09-03 08:55:44

标签: database-design

我有一个名为WorkItemNotes的表,以及Customers和Employees的单独表。

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

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

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

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

4 个答案:

答案 0 :(得分:3)

最干净的解决方案是将Person的存在建模为事实,与其作为Customer或Employee的状态不同,并将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) }

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

答案 1 :(得分:1)

你可以做这样的事情

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

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

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

答案 2 :(得分:1)

我可能会尝试这样做。

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

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

拥有2个独立的员工和客户表 它们中的每一个都具有对具有客户/员工特定信息的用户表的用户ID的FK引用

答案 3 :(得分:1)

为您的笔记准备一张桌子。 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。