数据库设计:两个表之间的多个非标识关系

时间:2013-05-17 21:35:38

标签: sql database database-design

我是数据库设计的新手,对于如何最好地模拟这个特定案例有一些不确定性。对于这个相当简单的场景,我很感激。

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

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

如果我们在任务与人之间有很多关系,我会创建某种复杂的关系结构来描述他们之间的关系(作为制作人,质量保证人,监督者等),但在这里我觉得虽然在“任务”表中将两个人的ID粘贴在生产人员和质量保证人员的单独列中是明智的。这是不是因为我看不到的某些原因?

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

2 个答案:

答案 0 :(得分:2)

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

enter image description here

这声明强制执行完全两个人始终与任务相关联,仅使用联结表就不容易实现(正如您已经注意到的那样)。

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


我不熟悉DBDesigner,因此对您的特定问题不熟悉,但在一般的ER建模中,与同一实体的多个关系通过其“角色名称”来区分,这些角色决定了迁移属性的名称(请参阅有关ERwin Methods Guide第3章中的“Rolenames”。尝试在工具的UI中找到沿着这些行的内容。

答案 1 :(得分:0)

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

但是,如果声明“任何一个人可以随时换掉另一个人”。意味着您需要知道之前担任该角色的人是否考虑过3表设计

Task; TaskID, <other details>

Assignee; TaskID, PeopleID, role, start_date, end_date

People; PeopleID, <other details>

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