父表的FK问题

时间:2011-01-31 03:47:54

标签: database-design

我有这个:

表格A
表B(fk到A)
表C(fk到B)
表D(fk至C)

现在当我在表D上执行Inserts / Updates / Deletes时,我假设它将检查表C上的FK,但是它会进一步检查父A还是停在C?一个很好的例子是: 国家 - >州 - >城市 - >邻里。全部由FK链接。所以,如果我在邻居上做我/ U / D会检查多远?

这有助于决定在将数据分成太多子表之前,我可以在多大程度上规范化数据。如果它将检查所有表格,那么它将减慢系统速度。但如果它只检查直接父母,那么我可以有数百个子子表而不用担心。

3 个答案:

答案 0 :(得分:2)

不,D上的插入/更新和删除都不会针对B和A进行检查。语句只会针对C进行检查。但是你在C上插入的内容已经用B检查了。因此间接你在D上的插入会是有效的。

答案 1 :(得分:0)

回答SqlServer:

当您在表D中插入记录时,外键会检查表C中是否找到了dRecord中的cID。如果在表c中找不到cID,则dRecord将是孤儿,并且插入强制失败。

带有该cID的cRecord在插入之前已经检查过它的bID。它不需要再次检查。

唯一的“链接”行为是级联删除。如果外键具有级联删除行为,则删除bRecord将删除所有相关的cRecords(具有匹配的bID)以及与这些cRecords相关的所有dRecords(具有匹配的cID)。

答案 2 :(得分:0)

数据库应该只需要检查记录(D)是否有外键返回到表C - 每次在C中插入/更新/删除记录时,都需要验证B中引用的相应记录由于没有记录可以在没有经过验证的情况下进入C,因此当插入D时,只需要检查C。

无论如何,物理数据建模中存在许多不同的问题。阅读Data Modeling,例如:数据仓库中的SnowflakeStar架构设计是对审核的良好参考。