1个主键指向多个列

时间:2016-03-28 18:07:12

标签: mysql database database-design visual-paradigm

我的目的是让COLUMNS ("assignedTo" , "loggedBy" , "completedBy" )引用多个"Employee""ID"的记录,我不得不假设它会是多对多的关系但是我&# 39; m不知道应该如何实施。

这是我的ERD的屏幕截图,展示了我的数据库目前的样子:

Screenshot of ERD

2 个答案:

答案 0 :(得分:1)

如果"assignedTo""loggedBy""completedBy"中的每一个都可以由多名员工行使(这也意味着员工可以有多个"assignedTo""loggedBy""completedBy")这意味着它是一个多对多的关系(正如你的建议)。要做到这一点,你要建立一个多对多的关系,联合起来。每个"assignedTo""loggedBy""completedBy"的表格(这将用'联合表格替换您的列)。您可以使用与'EmployeeTask'表相同的方式执行此操作。这个'联合' table也被称为'关联实体'。见维基百科:https://en.wikipedia.org/wiki/Associative_entity

注意:ERD不应包含' join'表。使用两个“乌鸦脚”模拟多对多关系。在两边。这些联合'表格只会出现在“物理数据模型”中。 (PDM)。

答案 1 :(得分:1)

看起来您需要按照@Bas的建议使用连接/联结表。

我相信创建所需关系的实际表格需要看起来像这样:

An example database structure using junction tables for 3 many to many relationships.

(我的图表遗漏了一些其他表格,我认为这些表格对于说明使用联结表的多对多关系的概念非常重要。)

您注意到我已从您的任务表中删除了loggedBy,assignedTo和completedBy列。当做多对多的关系时,你不需要它们。有关表之间连接的信息存储在联结表中。

为什么我们必须这样做?

让我们以AssignedTo关系为例......

由于我们不知道可以为一个任务分配多少员工,因此我们无法为员工制作专栏'任务表中的ID。同样,由于我们不知道可以为员工分配多少任务,因此我们无法为任务提供列。 Employees表中的ID。如果我们尝试,我们可能没有足够的列,或者我们可能有太多列。这些都不是好问题。

相反,每当我们想要在具有多对多关系的表之间建立连接时,我们在相关的联结表中放入一个新条目。我们可以毫无问题地添加任意数量的连接或连接数。

希望这更有意义。当您尝试在关系数据库中建立多对多关系模型时,事情看起来会更加混乱。