假设我有两个表,部门和员工。每个员工只有一个部门。每个部门都有一名或多名员工。
是否有级联删除选项的任何组合可用于强制执行此规则,而无需编写特殊代码?
换句话说,这里有两个规则:
- 仅当部门没有员工时,才能将其删除。
- 当部门中的最后一个员工被删除时,应删除该部门。
如果没有,那么我应该使用哪个集合才能最大程度地帮助我强制执行此业务逻辑?
假设在每个方案运行之前,表中有以下数据:
Sales (Department)
Amy (Employee)
Bob (Employee)
<小时 />场景 1:级联/无效
Employee --(Cascade)--> Department
Department --(Nullify)--> Employee
删除员工:
删除 Bob 将导致销售被删除,并且 Amy 将有一个 NULL 部门。
Amy
删除部门:
如果我们这次重新开始并删除销售,Amy 和 Bob 将留在数据库中,由 NULL 部门组成。
Amy
Bob
<小时 />场景 2:级联/拒绝
Employee --(Cascade)--> Department
Department --(Deny)--> Employee
删除员工:
删除 Bob 将引发异常:The operation couldn’t be completed. (Cocoa error 1600.)
。
删除部门:
如果我们重新开始并删除 Sales 这次,我们会得到异常: The operation couldn’t be completed. (Cocoa error 1600.)
.
场景 3:级联/级联
Employee --(Cascade)--> Department
Department --(Cascade)--> Employee
删除员工:
删除 Bob 将导致删除销售。结果,艾米也被删除了。
(empty DB)
删除部门:
如果我们这次重新开始并删除销售,也会导致所有员工被删除。
(empty DB)
<小时 />场景 4:作废/作废
Employee --(Nullify)--> Department
Department --(Nullify)--> Employee
删除员工:
删除 Bob 不会更改数据库的其余部分。
Sales
Amy
现在删除 Amy 将导致销售人员没有任何员工。
Sales
删除部门:
如果我们这次重新开始并删除销售,将导致艾米和鲍勃的部门为空。
Amy
Bob
<小时 />方案 5:取消/拒绝
Employee --(Nullify)--> Department
Department --(Deny)--> Employee
删除员工:
删除 Bob 不会更改数据库的其余部分。
Sales
Amy
现在删除 Amy 将导致销售人员没有任何员工。
Sales
删除部门:
如果我们这次重新开始并删除 Sales,则会导致异常:The operation couldn’t be completed. (Cocoa error 1600.)
。
方案 6:取消/级联
Employee --(Nullify)--> Department
Department --(Cascade)--> Employee
删除员工:
删除 Bob 不会更改数据库的其余部分。
Sales
Amy
现在删除 Amy 将导致销售人员没有任何员工。
Sales
删除部门:
如果我们重新开始并删除 Sales,它将删除所有员工。
(empty DB)
<小时 />场景 7:拒绝/作废
Employee --(Deny)--> Department
Department --(Nullify)--> Employee
删除员工:
删除 Bob 将导致异常:The operation couldn’t be completed. (Cocoa error 1600.)
。
删除部门:
如果我们这次重新开始并删除销售,将导致艾米和鲍勃的部门为空。
Amy
Bob
<小时 />场景 8:拒绝/拒绝
Employee --(Deny)--> Department
Department --(Deny)--> Employee
删除员工:
删除 Bob 将导致异常:The operation couldn’t be completed. (Cocoa error 1600.)
。
删除部门:
如果我们这次重新开始并删除 Sales,则会导致异常:The operation couldn’t be completed. (Cocoa error 1600.)
。
场景 9:拒绝/级联
Employee --(Deny)--> Department
Department --(Cascade)--> Employee
删除员工:
删除 Bob 将导致异常:The operation couldn’t be completed. (Cocoa error 1600.)
。
删除部门:
如果我们重新开始并删除 Sales,它将删除所有员工。
(empty DB)
<小时 />结论:
因此,似乎最好使用方案 5(Nullify/Deny(,您必须编写自定义代码才能在删除最后一个员工后删除部门。此方案还将确保您不会过早意外删除部门。