【发布时间】:2015-01-20 20:55:19
【问题描述】:
我试图在数据库模式中建模一个棘手的案例,以避免可能的不一致。下图大致描述了目前的情况,有3张表相互交互,table1和table2是N:M关系,table2和table3还有N:M关系,table1和table3是1:N关系。我需要以某种方式添加一个约束,当 table2 和 table1 之间也存在关系时,table2 和 table3 之间只能存在关系,而 table1 是 table3 的特定实例的外键。
例如,假设我们有以下表格:
鉴于我要施加的约束,table3_has_table2 中的第一行是有效的,因为 table3[0x000020] 有 table1[0x0000A] 作为 FK,而 table2[0x00010] 在 table1_has_table2 中有一个条目和 table1[0x0000A],但是table3_has_table2 中的第二行无效,因为 table2[0x00011] 与 table1_has_table2 中的 table1[0x0000A] 没有关系。
【问题讨论】:
-
在数据库设计中,您只需添加一个完整性约束,即“当 table2 和 table1 之间也存在关系时,table2 和 table3 之间只能存在关系”。如果您想在 sql 中实现该约束,您可以创建一个触发器。我还考虑了数据库设计中的其他替代方案,但我认为所有其他替代方案都违反了其他规则之一,或者有重复的数据(如果您仅在一个关系中表示 table1_has_table2 和 table2_has_table3)。
标签: mysql database database-design relational-database