database - 关系数据库设计 - "cyclic"图

标签 database database-design foreign-keys relational-database cycle

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

(简体)例如,表格

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 的上下文中,我什至应该担心这一点吗?

最佳答案

FK(外键)约束是定向。 FK 声明是一个声明,表和列列表的子行值显示为其他一些“引用”表和列列表的子行值。当人们谈论 FK“循环”时,他们指的是 FK 引用的循环全部从头到尾。

你这里似乎没有任何这样的循环。

(表示应用程序关系/关联。FK 约束通常称为“关系”,尽管它们实际上只是关于表的语句,在每个数据库状态下都是正确的。尽管每个 FK 都有关联的查询-表示关联关系/关联的可表达表。)

这样的循环没有逻辑问题。当发生这种情况时,对于那些 super 键/UNIQUE 列列表,这些表都具有完全相同的一组子行值。 (事实上​​ ,每对表之间都有一个双向约束。)在所有 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),您的第二个设计可能没有适当约束。

关于database - 关系数据库设计 - "cyclic"图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41546045/

相关文章:

mysql - 如何使用 ER 图创建表和关系?

mongodb - 如何设计我的 Mongo 数据库

sql - 多少个外键太多了?

sql - 表 A 引用表 B,我如何插入(使用 Perl 和 DBI 以及 PostgreSQL)

node.js - 获取 mongoDB API Node Express 中 3 个集合中的所有文档

java - 嵌入式数据库和加密

Excel - 如何连接到另一个 Excel 文件?

sql - C# 访问和显示表中数据的方法

数据库设计,大量参数,非规范化?

php - jQuery AJAX 表单不发布结果