1

在关系数据库设计中,是否应该担心一个(或多个)“循环图”存在问题?关系数据库设计 - “循环”图

(简体)例如,表

T1(T1_Id,...)
T2(T2_Id,T1_Id_Fk,...)
T3(T1_Id_Fk,T2_Id_Fk,.. )

主键为粗体。

T1中的行有双重作用。 T1行r1可以与T2中的行r2成关系T3,但它也可以是T2中(可能相同)行r2'的父行。这两个关系是正交的。

我想出了这样的事情:

T1_Base(T1_Id,...)
T1_Child1(T1_C1_Id,...)
T1_Child2(T1_C2_Id,...)
T2(T2_Id,T1_C1_Id_Fk,...)
T3(T1_C2_Id_Fk,T2_Id_Fk,...)

其中我们分别在T1_Base和T1_Child1与T1_Child2之间建立一对一的关系,以消除Relational database design cycle这里描述的一些可能的级联问题,但我仍然得到一个循环。

我应该甚至在每个FK都用ON CASCADE NO ACTION定义的环境中担心这个问题吗?

+0

您认为这些设计有哪些周期? – philipxy

+1

@cloud我在你的原始表格中看不到任何循环。函数依赖关系和外键约束都是有方向性的,但这两个集合都不会在你的情况下形成一个循环。还请注意,在关系数据库中,我们不会将行与其他行关联(这是旧的网络数据模型),而是将值或域关联起来。这就是为什么我们说表格代表关系。 – reaanb

+0

FK可以有多列。你没有说清楚你的FK是什么。请编辑你的问题。最好是给出一个类似DDL的声明来说明什么是参考什么。 (虽然你不必声明一个直接引用是其他链的结果。)PS“正交”在这里是不清楚的。请写出你的意思。 – philipxy

回答

1

FK(外键)约束是定向。 FK声明是表列&列列表的子值显示为某些其他“引用”表列表&列列表的子值。当人们谈论FK“周期”时,他们意味着FK参考的周期全部放在尾部。

您在这里似乎没有任何此类循环。尽管它们实际上只是关于在每个数据库状态中都是真的表的声明,尽管每个FK都有一个关联的查询可表表格,它们代表一个关联的查询可表表达式关联关系/关联)。

这样的周期没有逻辑上的问题。发生这种情况时,这些表都具有与那些superkey/UNIQUE列表完全相同的一组subrow值。 (的确,每对表之间都存在双向约束。)在所有FK列列表相同(相同名称,相同顺序)和所有非FK列不同的简单情况下,这意味着不是你可以使用单独的表格来添加一个表格。否则,在适当的列重新渲染之后,您仍然可以只使用一个表格。

但是许多DBMS无法处理正在声明的FK引用周期,因为FK声明对更新时的级联执行双重任务,并且DBMS设计人员尚未向设计人员提供设施时说明应在何时发生什么顺序级联的设施有一个循环。所以,如果你不想要一个单表设计,那么你必须通过删除一个声明性的FK约束来放弃这个循环。尽管可以通过触发器强制约束,但这是SQL DBMS中唯一可用的通用约束工具。

PS由于你的第一个设计可能有T3 (T1_Id_Fk, T2_Id_Fk) references T2 (T1_Id_Fk, T2_Id)T2 (T1_Id_Fk) references T1(T1_Id),你的第二个设计可能没有适当的约束。

+0

非常有用!谢谢! –