Sql 数据库设计:两个表之间的多个非标识关系
我对数据库设计还不熟悉,对于如何最好地对这个特殊情况建模,我有一些不确定因素。对于这个相当简单的场景,如果有任何建议,我将不胜感激 当生产任务开始时,始终有两个人参与。一个负责生产,另一个负责质量保证。对于数据库中的任何任务,必须能够识别这两个人。它们都存在于Person表中,并且都有ID,所以我只想找到将它们与生产任务关联起来的最佳方法。存在以下规则:Sql 数据库设计:两个表之间的多个非标识关系,sql,database,database-design,Sql,Database,Database Design,我对数据库设计还不熟悉,对于如何最好地对这个特殊情况建模,我有一些不确定因素。对于这个相当简单的场景,如果有任何建议,我将不胜感激 当生产任务开始时,始终有两个人参与。一个负责生产,另一个负责质量保证。对于数据库中的任何任务,必须能够识别这两个人。它们都存在于Person表中,并且都有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最好的解决办法是移动问题。