Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库设计:两个表之间的多个非标识关系_Sql_Database_Database Design - Fatal编程技术网

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

Sql 数据库设计:两个表之间的多个非标识关系,sql,database,database-design,Sql,Database,Database Design,我对数据库设计还不熟悉,对于如何最好地对这个特殊情况建模,我有一些不确定因素。对于这个相当简单的场景,如果有任何建议,我将不胜感激 当生产任务开始时,始终有两个人参与。一个负责生产,另一个负责质量保证。对于数据库中的任何任务,必须能够识别这两个人。它们都存在于Person表中,并且都有ID,所以我只想找到将它们与生产任务关联起来的最佳方法。存在以下规则: 任何一个人都可以随时换成另一个人 每个任务总是涉及两个人(两个人都不是空的) 我们想记录的任务中没有其他人参与 每个人可能参与多项任务,或者

我对数据库设计还不熟悉,对于如何最好地对这个特殊情况建模,我有一些不确定因素。对于这个相当简单的场景,如果有任何建议,我将不胜感激

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

  • 任何一个人都可以随时换成另一个人
  • 每个任务总是涉及两个人(两个人都不是空的)
  • 我们想记录的任务中没有其他人参与
  • 每个人可能参与多项任务,或者根本不参与
如果我们在任务和人员之间有很多关系,我会创建一些复杂的关系结构来描述他们之间的关系(作为制作人、质量保证人、监工等),但在这里,我觉得将两个人的ID放在任务表中是明智的,在生产人员和质量保证人员的单独栏中。这是因为我看不见的原因吗


真正促使我提出这个问题的是,我正试图在DBDesigner 4中设计它,这是我的新手,它只是不喜欢它——当我试图在Task和Person之间建立第二个非标识关系时,它不会给我第二个字段。它似乎也不允许我重命名任务中引用人员的字段,因此无论如何都无法区分这两个字段。由于似乎没有其他人也有这个问题,我开始怀疑这到底是不是一个好主意。一旦两个实体之间有两个或多个链接,就引入额外的表是标准的吗?如果我想执行上述规则,那会是什么样子?我不知道如何确保一个n:m表中始终有两个用于处理任务的人的条目。

如果您确信您的需求将永远保持不变,那么只需创建两个非空FK:

这声明性地强制执行始终有两个人与任务关联,仅使用连接表是不容易实现的(正如您已经注意到的)

OTOH,如果您预计您的需求可能在将来某个时候发生变化,那么连接表增加的灵活性可能比业务规则的完全声明性实施更重要



我不熟悉DBDesigner,因此也不熟悉您的特定问题,但在ER建模中,通常情况下,具有相同实体的多个关系通过它们的“角色名称”进行区分,这些“角色名称”确定迁移属性的名称(请参阅本手册第3章中关于“角色名称”的部分)。试着在工具的UI中沿着这些线定位一些东西。

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

但是如果“任何人在任何时候都可以换一个不同的人”意味着你需要知道谁以前持有这个角色考虑3表设计

Task; TaskID, <other details>

Assignee; TaskID, PeopleID, role, start_date, end_date

People; PeopleID, <other details>
任务;塔斯基德,
受让人;任务ID、人员ID、角色、开始日期、结束日期
人;人们,

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

在堆栈交换中还有另一个站点,此类问题更常见且更受鼓励:。因此,鼓励提出比设计问题更具体、与代码相关的问题。我不是投反对票或其他什么,只是建议你试着问一下。@Renan,除了,交叉发帖不是很受欢迎吗?@ErikE IMO最好的解决办法是移动问题。