Mar*_*ski 8 mysql sql rdbms data-integrity
这不是一个特定的问题,更多的是一般的疑惑.
当您必须以1:M关系对多个表进行删除时,最好是使用级联删除制作FK约束还是连接delete语句中的表.
我有一个旧项目,它有相关表的单独删除语句,有些语句没有执行,数据完整性受到损害.我不得不在两者之间做出决定,所以我想了一下什么是更好的解决方案.
还可以选择进行存储过程或事务.
所以我正在寻找意见或建议......?
我想说使用级联删除会更安全.如果您决定使用连接,则必须记住每次从父表中删除任何内容时都使用它们; 即使你有足够的纪律来做到这一点,你也无法确定你的同事或将来会支持你的软件的人.此外,不止一次地编码关于表关系的这种知识违反了DRY原则.
如果您使用级联删除,则无需记住任何内容,并且将始终根据需要删除子行.
如果您的数据库为其定义了正确的 RI,那么就不应该出现任何数据完整性受损的情况。所有相关表都应该具有声明性 RI,这意味着您无法删除仍有子项的父项。
另外,如果您的代码有时仅删除某些行,那么这就是糟糕的编码和糟糕的测试。这些类型的操作应该是单个事务。您使用存储过程的建议是解决该问题的好方法,并且非常标准。
正如已经提到的,级联触发器存在删除某人不打算删除的行的危险。考虑到有时人们可能会从应用程序外部的某个地方访问您的数据,尤其是在修复数据问题时。当有人不小心尝试删除错误的父级并收到 RI 错误时,这很好。当他们不小心尝试删除错误的父表时,它不仅删除了该父表,还删除了其他 5 个表中的 20 个子表,这很糟糕。
而且,级联删除是非常隐蔽的。如果开发人员正在为父级编写删除代码,那么他们应该知道他们必须使用删除存储过程来照顾子级。让开发人员不针对此进行编码,得到错误并修复他的代码(或者意识到他实际上不想执行所有这些删除操作)比让开发人员进行删除并拥有要好得多在代码生效之前,没有人意识到它正在杀死儿童。
IMO,我更愿意让我的开发人员了解该应用程序,而不是让他们更容易对其一无所知。