1 指向多列的主键

1 Primary Key pointing to multiple colums

我的意图是让 COLUMNS("assignedTo" , "loggedBy" , "completedBy" ) 引用 "Employee" 的多个记录,"ID" 我不得不假设它是多对多的关系我不知道应该如何实施。

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

如果每个 "assignedTo" , "loggedBy" , "completedBy" 可以由多个员工行使(这也意味着一个员工可以有多个 "assignedTo", "loggedBy""completedBy") 这意味着它是多对多关系(如您所建议的)。为此,您为 "assignedTo""loggedBy""completedBy" 建立多对多关系 'joint' table(这会将您的列替换为 'joint' tables)。您以与 'EmployeeTask' table 相同的方式执行此操作。这个'joint'table又叫'Associative entity'。参见维基百科:https://en.wikipedia.org/wiki/Associative_entity

注意:ERD 不应包含 'join' table。多对多关系是在两侧使用两个 'crow foots' 建模的。这些 'joint' table 只会出现在 'Physical Data Model' (PDM) 中。

看来您需要按照@Bas 的建议使用 join/junction table。

我相信实际 table 创建您想要的关系需要看起来像这样:

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

您会注意到我已经从您的任务中删除了 loggedBy、assignedTo 和 completedBy 列 table。在建立多对多关系时,您不需要它们。有关 tables 之间的那些连接的信息存储在 tables.

的结点中

我们为什么要这样做?

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

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

相反,每次我们想要在具有多对多关系的 table 之间建立连接时,我们都会在相关联结 table 中放置一个新条目。我们可以根据需要添加任意数量的连接,没有任何问题。

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