2011-10-19 27 views
8

这不是一个具体的问题,更多的是一般的疑惑。两难困境:级联删除或加入删除

如果您必须以1:M关系对多个表进行删除,最好是使用级联删除来创建FK约束,或者在删除语句中连接表。

我有一个旧的项目,有相关表单独的删除语句,有些语句没有执行,数据完整性受到影响。我必须在两者之间作出决定,所以我想了一下,这会是一个更好的解决方案。

还有一个选项可用于创建存储过程或事务。

所以我正在寻找意见或建议......?

回答

4

如果您的数据库有适当的RI定义,那么不应该有任何数据完整性受损的情况。你所有的相关表都应该有声明性的RI,这意味着你不能删除父母,同时它仍然有孩子。另外,如果你的代码只是在某些时候只删除了一些行,那么这就是编码差和测试不良。这些行为应该是单一交易。你使用存储过程的建议是解决这个问题的一个很好的方法,而且非常标准。

如前所述,级联触发器有删除某些人不打算删除的行的危险。考虑到有时人们可能会从应用程序之外的某个地方访问您的数据,尤其是在修复数据问题时。当有人不小心尝试删除错误的父节点并获得好的RI错误时。当他们不小心尝试删除错误的父母,并且它不仅删除了那个父母,而且还删除了另外5个表中的20个孩子,那很糟糕。

另外,级联删除非常隐蔽。如果开发人员为父代编写了删除代码,那么他们应该知道他们必须使用删除存储过程来照顾孩子。开发人员没有对代码进行编码,发现错误,修复代码(或者意识到他并不真的想要完成所有的删除操作)比开发人员进行删除并拥有更多没有人意识到,直到代码生效之前它才会杀死孩子。

海事组织,我更愿意让我的开发人员了解应用程序,而不是让他们更容易对其不了解。

7

我想说使用级联删除更安全。如果你决定使用联接,你必须记住每次从父表中删除任何东西时使用它们;即使你有足够的纪律去做,你也不能确定你的同事或将来支持你的软件的人。此外,不止一次编码有关表关系的知识违反了DRY原则。

如果您使用级联删除,但没有人需要记住任何内容,并且根据需要始终删除子行。

+0

完全。很好的答案和良好的表达。数据完整性一直没有引起足够的重视,通常会在几年之后开始出现,通常会导致许多公司扼杀 - 由于很久以前关于数据收集的糟糕决策,他们无法进行创新和改变。 –

+0

由于在手动删除数据时可能发生意外,似乎存在与级联删除相关的一些瑕疵。就我个人而言,我遇到了一些不好的经历,但我仍然认为,保持严格的数据完整性是一种更安全的方式。另一方面,我仍然尝试避免使用级联。 –

4

级联删除会导致很多问题,因此非常危险。我不会推荐使用它。首先,假设我需要删除拥有数百万个子记录的记录。您可以锁定数据库并使其无法使用数小时。我知道有很少的dbas会允许在他们的数据库中使用级联删除。

接下来,如果您定义了FK,它对数据完整性没有帮助。删除子女档案仍然存在将失败这是一个的事情。如果客户现有订单,我希望客户删除失败。无意中使用级联删除(通常以我的经验),可能会导致删除您真正不想删除的内容。

0

同时使用!

“联合”手动删除通常更适合避免死锁和其他争用问题,因为您可以将删除分解为更小的工作单元。如果您确实有争议,那么肯定会更容易找到冲突的原因。

如前所述,“删除级联”将绝对保证参照完整性。

因此,请同时使用 - 在连接的sqls中显式删除“children”以避免死锁和性能问题。但留下“CASCADE DELETE”启用可以捕获任何你错过的东西。由于在删除父母时不应该有孩子离开,所以这不会让你付出任何代价,除非你删除了一个错误,在这种情况下,为了维护你的参考完整性,费用是值得的。

+0

任何外键都保证参照完整性 –