0

我是数据库设计的新手,对于如何最好地建模这种特殊情况有一些不确定性。对于这个相当简单的场景,我将不胜感激。

当一项生产任务开始时,始终有两个人参与。一个负责生产,一个负责质量保证。对于数据库中的任何任务,都必须能够识别这两个人。它们都存在于 Person 表中并具有 ID,因此我只想要将它们与生产任务相关联的最佳方式。存在以下规则:

  • 任何一个人都可以随时换成不同的人。
  • 每项任务总是涉及到两个人(这些都不是空的)。
  • 从来没有其他人参与我们想要记录的任务。
  • 每个人都可能参与多项任务,或者根本不参与。

如果我们在任务和人员之间有一大堆关系,我会创建某种复杂的关系结构来描述他们的关系(作为制片人、质量保证人员、监督者等),但在这里我觉得这似乎是明智的只需将两个人的 ID 粘贴在任务表中,分别在生产人员和质量保证人员的列中。由于某种我看不到的原因,这很糟糕吗?

真正引起我的问​​题的是,我正在尝试在 DBDesigner 4 中准确地设计它,我是新手,它只是不喜欢它 - 当我尝试在 Task 之间建立第二个非识别关系时和人,它不会给我第二个领域。它似乎也不允许我重命名 Task 中涉及人员的字段,因此无论如何都无法区分两者。由于似乎没有其他人分享这个问题,我开始怀疑这是否是一个好主意。一旦两个实体之间有两个或多个链接,就引入附加表是标准的吗?如果我想执行上述规则,那会是什么样子?我看不出如何确保 n:m 表始终为从事该任务的两个人提供条目。

4

2 回答 2

2

如果您确信您的要求将永远保持这种刚性,那么只需创建两个 NOT NULL FK:

在此处输入图像描述

这以声明方式强制要求始终有两个人与任务相关联,而仅使用联结表(正如您已经指出的那样)是不容易实现的。

OTOH,如果您预计您的需求可能会在未来的某个时候发生变化,那么联结表增加的灵活性可能比您的业务规则的完全声明式执行更重要。


我不熟悉 DBDesigner,因此不熟悉您的特定问题,但是在一般的 ER 建模中,与同一实体的多个关系由它们的“角色名”来区分,这些“角色名”决定了迁移属性的名称(请参阅“角色名”部分)在ERwin 方法指南的第 3 章中)。尝试在工具的 UI 中沿着这些线定位一些东西。

于 2013-05-17T22:09:56.240 回答
0

如果您想知道当前状态而不是之前担任该角色的人@Branko Dimitrijevic 的解决方案将起作用。

但是,如果“任何人都可能随时被换成不同的人”这句话意味着您需要知道谁之前担任过该角色,请考虑 3 表设计

Task; TaskID, <other details>

Assignee; TaskID, PeopleID, role, start_date, end_date

People; PeopleID, <other details>

然后在受理人表中,您需要约束以确保对于每个 TaskID、角色组合的日期是合理的,例如日期不重叠或有间隙。您每次只有 1 个角色可用于每个任务。要管理这个可能需要触发器或应用程序中的代码。

于 2013-05-17T22:40:26.177 回答