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

Database design 数据库中的循环父/子关系,database-design,Database Design,我的父母有很多孩子,这很好。针对每个父项,我尝试存储一个默认的子项。我想使默认的_子项成为强制性的,但是我想不出怎么做 首先创建父项将意味着违反强制默认的子项条件。首先创建子对象将意味着违反其FK条件 其他人如何处理这个问题?谢谢 父母在生孩子之前必须存在。真实的生活;在数据库中为true 如果希望确保插入到表中的每个项在默认情况下都得到一个子项,那么可以使用在插入父记录后立即执行的触发器来执行此操作 但是要小心:如果父记录和子记录在同一个表中,那么每次插入子记录时,触发器都会再次触发,从而创建

我的父母有很多孩子,这很好。针对每个父项,我尝试存储一个默认的子项。我想使默认的_子项成为强制性的,但是我想不出怎么做

首先创建父项将意味着违反强制默认的子项条件。首先创建子对象将意味着违反其FK条件


其他人如何处理这个问题?谢谢

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

如果希望确保插入到表中的每个项在默认情况下都得到一个子项,那么可以使用在插入父记录后立即执行的触发器来执行此操作


但是要小心:如果父记录和子记录在同一个表中,那么每次插入子记录时,触发器都会再次触发,从而创建该子记录的子记录;这将触发插入子项的子项…

约束通常可以标记为“可延迟”,这意味着您可以要求数据库将检查延迟到提交时。这使您能够解决这样的情况:在建立事务时需要暂时违反约束,但在准备提交时会再次得到满足。

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

SQL的一个基本限制是它不能支持这一点。您可以得到的最接近的方法是暂时禁用一个或多个约束—例如,通过使用可延迟约束


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

谢谢Wyzard。只是查看了MySQL手册,没有看到任何关于Delerable的引用。你知道MySQL是否支持它吗?Kim,你是对的,看起来MySQL不支持延迟约束。“父母必须在生孩子之前存在。”这在数据库中并不完全正确。原则上,外键约束只意味着没有对应父行的子行。换句话说,它们必须同时存在,而不一定是一个在另一个之前。不幸的是,SQL不能支持这一点,事实上需要先使用父行。这似乎是一个小细节,但实际上SQL的引用完整性支持由于这一简单限制而被严重削弱。