数据库中的循环父/子关系

时间:2010-12-02 01:08:37

标签: database-design

我有一个有很多孩子的父母,这很好。针对每个父母,我试图存储default_child。我想强制使用default_child,但是我想不出怎么做。

首先创建父级意味着违反强制性default_child条件。首先创建孩子意味着违反它的FK条件。

其他人如何处理这件事?谢谢!

4 个答案:

答案 0 :(得分:2)

约束通常可以标记为“可延迟”,这意味着您可以要求数据库推迟检查它们直到提交时间。这使您可以解决类似这样的情况,即在构建事务时需要临时违反约束,但在您准备提交时将再次满足。

答案 1 :(得分:0)

父母必须在生孩子之前存在。生活中真实;在数据库中是真的。

如果要确保在表中插入的每个项目都默认为子项,请使用在插入父记录后立即执行的触发器来执行此操作。

但是要小心:如果您的父母和子女记录在同一张桌子上,那么每次插入一个孩子时,触发器将再次触发,创建该孩子的孩子;这将触发孩子的孩子的插入......

答案 2 :(得分:0)

不确定每个DBMS是否都这样做,但我希望我可以在事务中破坏不变量,并且它只需要在提交点正确。

答案 3 :(得分:0)

SQL的一个基本限制是它无法支持这一点。最接近的是临时禁用一个或多个约束 - 例如使用可延迟约束。

可能的折衷方法是将引用列移除到自己的表中,以便它引用两个当前表。然后,只有在填充其他表后才向该新表插入一行。当然,约束仍然是可选的 - 只是你不需要一个可以为空的列来实现它。