3 回答

TA贡献1812条经验 获得超5个赞
到目前为止我所看到的摘要:
有些人根本不喜欢级联。
级联删除
当关系的语义可能涉及排他性的“是 ”描述的一部分时,级联删除可能很有意义。例如,OrderLine记录是其父订单的一部分,并且OrderLines永远不会在多个订单之间共享。如果Order消失,OrderLine也应该消失,没有Order的行将成为问题。
级联删除的典型示例是SomeObject和SomeObjectItems,在这种情况下,没有相应的主记录就不会存在项目记录。
你应该不使用级联删除,如果你保存历史或使用“软/逻辑删除”,您只设置一个删除位列1 /真。
级联更新
当您在表之间使用实键而不是代理键(标识/自动增量列)时,级联更新可能会很有意义。
当您具有可变的外键(例如可以更改的用户名)时,Cascade Update的典型示例。
你应该不使用级联更新与被标识/自动增量列键。
级联更新最好与唯一约束结合使用。
何时使用级联
您可能希望在允许操作进行级联之前从用户那里获得额外的确认,但这取决于您的应用程序。
如果您错误地设置了外键,级联会给您带来麻烦。但是,如果您做对的话,您应该可以。
在完全理解之前,使用级联是不明智的。但是,它是一个有用的功能,因此值得花一些时间来理解。

TA贡献1828条经验 获得超13个赞
外键是确保数据库引用完整性的最佳方法。避免由于魔术而导致的级联就像在汇编中编写所有内容一样,因为您不相信编译器背后的魔术。
不好的是错误使用了外键,例如,向后创建外键。
胡安·曼努埃尔(Juan Manuel)的例子就是规范的例子,如果您使用代码,则有更多的机会在数据库中留下伪造的DocumentItem,这些东西会咬你。
级联更新很有用,例如,当您通过可以更改的内容引用数据时,例如说用户表的主键是名称,姓氏组合。然后,您希望该组合中的更改传播到引用的任何位置。
@Aidan,您所指的这种清晰度付出了高昂的代价,即有可能将虚假数据保留在数据库中,这是不小的机会。对我而言,通常只是缺乏对DB的熟悉,并且在与DB合作之前无法找到哪些FK会加剧这种恐惧。要么,要么是不断地滥用级联,在实体在概念上不相关的地方,或者必须保留历史的地方使用级联。

TA贡献1836条经验 获得超3个赞
我从不使用级联删除。
如果我想从数据库中删除某些内容,我想明确地告诉数据库我要取出的内容。
当然,它们是数据库中可用的功能,有时可能可以使用它们,例如,如果您有一个“ order”表和一个“ orderItem”表,则您可能希望在删除某个表时清除它们。订购。
我喜欢从代码(或存储过程)中获得的清晰度,而不是发生“魔术”事件。
出于同样的原因,我也不喜欢触发器。
需要注意的是,即使您删除了一个“订单”,即使级联删除删除了50个“ orderItem”,您也会得到“ 1行受影响”的报告。
- 3 回答
- 0 关注
- 605 浏览
添加回答
举报