Mysql 1个主键指向多个列

Mysql 1个主键指向多个列,mysql,database,database-design,visual-paradigm,Mysql,Database,Database Design,Visual Paradigm,我在这里的目的是让列(“assignedTo”、“loggedBy”、“completedBy”)引用“Employee”,“ID”的多个记录,我不得不假设这是一个多对多关系,但我不知道应该如何实现它 下面是我的ERD的屏幕截图,展示了我的数据库当前的样子: 如果多个员工都可以执行“assignedTo”、“loggedBy”、“completedBy”(这也意味着一个员工可以有多个“assignedTo”、“loggedBy”或“completedBy”)这意味着这是一种多对多关系(如您所建议

我在这里的目的是让列
(“assignedTo”、“loggedBy”、“completedBy”)
引用
“Employee”
“ID”
的多个记录,我不得不假设这是一个多对多关系,但我不知道应该如何实现它

下面是我的ERD的屏幕截图,展示了我的数据库当前的样子:

如果多个员工都可以执行
“assignedTo”
“loggedBy”
“completedBy”
(这也意味着一个员工可以有多个
“assignedTo”
“loggedBy”
“completedBy”
)这意味着这是一种多对多关系(如您所建议的)。为此,您为
“assignedTo”
“loggedBy”
“completedBy”
分别创建一个多对多关系“联合”表(这将用“联合”表替换列)。您可以使用与
'EmployeeTask'
表相同的方法执行此操作。此“关节”表也称为“关联实体”。见维基百科:


注意:ERD不应包含“联接”表。在两侧使用两个“鱼尾纹”对多对多关系进行建模。这些“连接”表将仅出现在“物理数据模型”(PDM)中。

看起来您需要使用@Bas建议的连接/连接表

我相信创建所需关系的实际表需要如下所示:

(我的图表省略了其他一些表,我认为这些表对于说明使用连接表的多对多关系的概念并不重要。)

您会注意到,我已经从任务表中删除了loggedBy、assignedTo和completedBy列。当进行多对多关系时,你不需要他们。有关表之间这些连接的信息存储在连接表中

我们为什么要这样做

让我们以AssignedTo关系为例

由于我们不知道有多少员工可能被分配到一项任务,因此无法在Tasks表中为员工ID创建列。同样,由于我们不知道一名员工可能被分配到多少任务,因此无法在Employees表中为任务ID创建列。如果我们尝试这样做,我们可能没有足够的列,或者可能有太多的列。这两个问题都不是好问题

相反,每当我们想要在具有多对多关系的表之间建立连接时,我们都会在相关的连接表中放入一个新条目。我们可以添加任意多的连接或任意少的连接,而不会出现任何问题


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

这是否需要我在表
任务
中设置
主键“assignedTo”、“loggedBy”和“completedBy”
主键?@T.Pilvelis不,不要这样做。看看外键:。Wikipedia在这里对许多to may表进行了很好的解释:实际上,您的ERD似乎已经有了非常类似于连接/联接表的东西,即
EmployeeTask
表。那张桌子的用途是什么?它似乎试图表明一个任务可以属于许多员工,一个员工可以有许多任务。要实现您描述的3对多关系,您需要3个连接表,如@Bas所建议的。@Bas@ec抱歉,我不太确定我是否理解这个概念。如果我与
Employee
Task
创建多对多关系,则将使用两个表中的主键来创建联合表。当然,为了实现这一点,我必须将
“assignedTo”“loggedBy”和“completedBy”
PK'设置为实际情况,您只需使用任务的主键和员工的主键,并将其放在连接表中。不再需要这三列
(“assignedTo”“loggedBy”和“completedBy”)
。请看我的答案,了解原因。听起来你是说一项任务可以由多个员工记录、分配或完成,同样,一个员工可以有多件他们记录、分配或完成的事情?这是对问题的正确理解吗?我终于明白了这是如何工作的xD花了一些时间,但值得。非常感谢你的帮助和时间。太好了。很高兴听到这有道理!