与多个表的多对多关系

时间:2018-11-29 13:42:12

标签: sql database database-design

我有下表

公司: ID,名称

人员: ID,名称

一家公司可以有一个或多个董事。董事可以是另一家公司或个人。 要链接它们,我有一个表主管:

导演:Id,CompanyId,DirectorCompanyId,PersonId

如果公司是董事,则DirectorCompanyId具有值,PersonId为null,或者如果人是董事,PersonId具有值,DirectorCompanyId为null

但是我觉得这不是一个正确的设计。

2 个答案:

答案 0 :(得分:0)

您是对的,这不是正确的设计。要将M:M关系分解为两个1:M关系,您需要第三个表:

CompanyPerson

--these columns are vital to decompose the many:many relationship
--the PK of this table should be a compound of these two columns
--so that the same person cannot twice work for the same company
--with different roles etc
PersonID -> FK to Person.ID
CompanyID -> FK to Company.ID

--plus other properties like:
RoleID -> FK to Role table --if roles are a defined set of options
StartDate -> --when the person began this employment
ManagerPersonId -> --the person's mananger.. etc

PersonID + CompanyID是此表的组合主键

它将人员映射到公司及其在每个公司中的角色。也可以具有其他信息,例如开始日期,该公司的经理等。(如果某人将离开并回到同一公司,并且您想回收PersonID,则可能还需要将开始日期作为主键的一部分)

注意:您可以将此表称为Employee,因为它实际上就是表中的人,但是我倾向于发现这些在其他两个表之间建立关联的中间人表最好叫做Table1Table2,因为它对您有帮助可以比使用诸如Employee之类的更抽象的东西更清楚地了解/理解表的关系/目的

答案 1 :(得分:0)

以下设计似乎符合要求

enter image description here

另一个选择是使用继承:

Director <-- CompanyDirector
         <-- PersonDirector