Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 与多个表的多对多关系_Sql_Database_Database Design - Fatal编程技术网

Sql 与多个表的多对多关系

Sql 与多个表的多对多关系,sql,database,database-design,Sql,Database,Database Design,我有下列表格 公司: 身份证,姓名 人: 身份证,姓名 一家公司可以有一名或多名董事。董事可以是其他公司或个人。 要链接它们,我有一个表控制器: 董事:Id,公司Id,董事公司Id,个人Id 如果公司是董事,则DirectorCompanyId具有值且PersonId为空,或者如果某人是董事,则PersonId具有值且DirectorCompanyId为空 但我觉得这不是一个正确的设计。你是对的,这不是一个正确的设计。要将M:M关系分解为两个1:M关系,需要第三个表: CompanyPerson

我有下列表格

公司: 身份证,姓名

人: 身份证,姓名

一家公司可以有一名或多名董事。董事可以是其他公司或个人。 要链接它们,我有一个表控制器:

董事:Id,公司Id,董事公司Id,个人Id

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


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

你是对的,这不是一个正确的设计。要将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是此表的复合主键

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


注意:您可以将此表称为Employee,因为它实际上就是其中的人员,但我倾向于发现,这些中间人表格(在另外两个表格之间创建关联)最好称为Table1Table2,因为与称为更抽象的东西(如Employee)相比,您可以更清楚地看到/理解表格的关系/用途。下面的设计似乎与之对应要求

另一种选择是使用继承:

Director <-- CompanyDirector
         <-- PersonDirector

董事公司也可以是董事,而不仅仅是个人。这与您发布的设计不符感谢您的回复。如果有更多像公司这样的实体呢。需要为每个新实体创建n个表。这将使您无法查询是使用与特定类型对应的单个表连接,还是使用包含所有类型链接的视图(虚拟表)连接。谢谢您的回复。假设您还有两个实体(基金会和协会)。两者都可以设置为公司董事。所以现在公司的董事可以是公司、个人、基金会或协会。你能更新图表来显示你的意思吗?@codejunkie添加新实体需要添加两个表
things
things\u directorship
,因为它是为
公司
-
公司\u directorship
个人
执行的,可能与你的职位重复问题?你认为哪些部分是正确的?请参阅并点击“谷歌stackexchange作业”。PS这是子类型/继承的反模式。