我的意图是让 COLUMNS("assignedTo" , "loggedBy" , "completedBy" )
引用 的多个记录"Employee"
,"ID"
我不得不假设这将是多对多的关系,但是我不知道应该如何实现它。
这是我的 ERD 的屏幕截图,展示了我的数据库当前的样子:
我的意图是让 COLUMNS("assignedTo" , "loggedBy" , "completedBy" )
引用 的多个记录"Employee"
,"ID"
我不得不假设这将是多对多的关系,但是我不知道应该如何实现它。
这是我的 ERD 的屏幕截图,展示了我的数据库当前的样子:
如果每个"assignedTo"
, "loggedBy"
,"completedBy"
可以由多个员工行使(这也意味着一个员工可以有多个"assignedTo"
,"loggedBy"
或"completedBy"
)这意味着它是一个多对多的关系(如您所建议的)。"assignedTo"
为此,您为"loggedBy"
和each创建了一个多对多关系“联合”表"completedBy"
(这将用“联合”表替换您的列)。你这样做的方式和你的'EmployeeTask'
桌子一样。这个“联合”表也称为“关联实体”。参见维基百科:https ://en.wikipedia.org/wiki/Associative_entity
注意:ERD 不应包含“连接”表。多对多关系是使用两侧的两个“乌鸦脚”来建模的。这些“联合”表只会出现在“物理数据模型”(PDM) 中。
看起来您需要按照@Bas 的建议使用连接/连接表。
我相信创建您想要的关系的实际表将需要如下所示:
(我的图表省略了一些其他表,我认为这些表对于说明使用联结表的多对多关系的概念并不重要。)
您会注意到我已经从您的任务表中删除了 loggedBy、assignedTo 和 completedBy 列。在进行多对多关系时,您不需要它们。有关表之间这些连接的信息存储在联结表中。
为什么我们必须这样做?
让我们以 AssignedTo 关系为例...
因为我们不知道有多少员工可能被分配给一个任务,所以我们不能在任务表中为员工的 ID 创建列。同样,由于我们不知道员工可能分配给多少个任务,我们无法在员工表中为任务的 ID 创建列。如果我们尝试这样做,我们可能没有足够的列,或者我们可能有太多的列。这些都不是好问题。
相反,每次我们想要在具有多对多关系的表之间建立连接时,我们都会在相关联结表中添加一个新条目。我们可以根据需要添加尽可能多的连接或尽可能少的连接,而不会出现任何问题。
希望这更有意义。当您尝试在关系数据库中建模多对多关系时,事情肯定会看起来更加混乱。