给定:
组有很多人
但是关系是独立的(即个人可以不属于某个组而存在),删除组时是否应该将个人表中的外键(即group_id)设置为0(或NULL)?如果您不这样做,该人将尝试属于一个不存在的组。
我问的原因是这是 Cakephp 中的默认行为。如果将dependent 设置为true,它将删除关联的模型,但如果设置为false,它将保持关联的模型不变。
给定:
组有很多人
但是关系是独立的(即个人可以不属于某个组而存在),删除组时是否应该将个人表中的外键(即group_id)设置为0(或NULL)?如果您不这样做,该人将尝试属于一个不存在的组。
我问的原因是这是 Cakephp 中的默认行为。如果将dependent 设置为true,它将删除关联的模型,但如果设置为false,它将保持关联的模型不变。
是的,外键应设置为 NULL(或 0,如果这是您选择的“无组”值),否则您将失去参照完整性。如果您的数据库支持它,您应该能够在框架中设置“删除时”触发器或级联规则来强制执行此操作。CakePHP 中的行为似乎是正确的。如果该值是依赖的,则应在删除时将其删除。如果它不依赖,那么您需要为要采取的正确操作提供额外的行为逻辑(在这种情况下,您希望将所有值设置为 NULL。在其他情况下,您可能希望设置为“默认”组, ETC)
一句话,是的。将外键留在persons 表上会导致数据库内的参照完整性丢失。
> 如果您不这样做,此人将尝试加入一个不存在的组。
还有一个更糟糕的情况:未来可能会出现一个新的组 B,它会重用已删除的组 A 的 id。然后所有以前 A 组的用户都将“神奇地”加入到新的组 B 中。
实现两个实体独立的情况的另一种更稳定的方法是完全从 Person 中删除外键并创建连接表 group_persons。这样,您在删除组时就不必担心引用的完整性。当您删除一个组时,该关联将从 group_persons 中删除。
桌子看起来像这样
id, group_id, person_id
group_persons 模型看起来像这样
Person hasMany GroupPerson
Group hasMany GroupPerson
GroupPerson belongsTo Person, Group
如果您希望 Person 一次只能在一个组中,请在 GroupPerson 中设置唯一的验证规则。
var $validate=array(
'person_id'=>array(
array(
'rule'=>'isUnique',
'message'=>'This person is already in a group.'
)
)
);