Database design 父表的FK问题

Database design 父表的FK问题,database-design,Database Design,我有这个: 表A 表B(fk至A) 表C(fk至B) 表D(fk至C) 现在,当我在表D上执行INSERT/Updates/DELETE操作时,我假设它将检查表C上的FK,但它将进一步检查父级A还是停止在C上?一个很好的例子是: 国家->州->城市->社区。全部由FK链接。所以,如果我在附近做i/U/D,它会检查多远 这将有助于在我将数据分解为太多子表之前,决定我可以在多大程度上规范化数据。若它将检查所有表,那个么它将减慢系统速度。但是,如果它只检查直接父表,那么我就可以拥有数百个子表而不必担心

我有这个:

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

现在,当我在表D上执行INSERT/Updates/DELETE操作时,我假设它将检查表C上的FK,但它将进一步检查父级A还是停止在C上?一个很好的例子是: 国家->州->城市->社区。全部由FK链接。所以,如果我在附近做i/U/D,它会检查多远


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

否,您在D上的插入/更新和删除将不会对照B和A进行检查。该语句只会对照C进行检查。但是,您在C上的插入将已经过B的检查。因此,您在D上的插入将间接有效。

SqlServer的答案:

在表D中插入记录时,外键会检查是否在表C中找到了数据记录中的cID。如果在表C中找不到cID,则数据记录将成为孤立记录,插入操作将强制失败

带有该cID的cRecord在插入时已检查其出价。它不需要再次检查


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

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


无论如何,在物理数据建模中有很多不同的关注点。例如,阅读:数据仓库中的数据和模式设计是很好的参考资料。

因此,本质上,我可以在嵌套级别中拥有数百个子表,如果我写入、删除或更新除直接父表之外的任何表,都不会有什么不同?是的,数百、数千、数百万。