假设我有一个PlantGroups表。它们依赖于Plants表,并具有外键PlantId。每个工厂组仅包含一个工厂。
PlantGroups
==========
...data...
PlantId
Plants
======
PlantId
如果删除或要求删除Plants表中的记录,应采取什么程序来确保PlantGroups的数据完整性?
此外,如果相应PlantGroups记录中的其他数据(取决于请求删除的Plants记录)仍然相关且值得保留,该怎么办?
如果PlantGroups可以有多个Plant,那么您应该有一个额外的表,其中包含PlantGroupID和PlantID。
根据您试图实现的目标,您可能需要一个逻辑,如果PlantGroup没有Plant,则该逻辑将删除该PlantGroup。然而,在某些情况下,添加忽略空白组的逻辑可能会更容易,例如查找空白组,但在人们需要将植物添加到组中时显示空白组。
对于其他问题,您应该研究级联删除。其他人可能会提供更多信息。
我要选择Option Other
。虽然我读过的任何数据完整性指南中都没有定义,包括Oracle(只列出NULL、CASCADE、RESTRICT、NO ACTION、DEFAULT作为选项),但我将推出自己的指南。
以下是将要发生的事情,除非其他人说服我采取更好的方法。
PlantGroups
===========
... data ...
PlantId
Plant
=====
PlantId
bool isActive
删除Plant时,isActive将设置为false。这将导致在数据库的管理中包括许多额外的逻辑,但允许对这些依赖字段进行浅层删除。级联删除选项可能会作为最终选项,用于处理超过一定年限的弃用数据。
或者
我还可以有一个第二个数据库,它与第一个数据库的模式相同,并保存已删除的数据。