鉴于:
小组有很多人
但是关系是独立的(即人员可以存在而不属于某个组),如果删除组时人员表中的外键(即group_id)是否设置为0(或NULL)?如果你不这样做,那么该人将尝试属于一个不存在的群体。
我问的原因是这是Cakephp中的默认行为。如果将依赖项设置为true,则会删除关联的模型,但如果将其设置为false,则会保持关联的模型不受影响。
答案 0 :(得分:3)
是的,外键应设置为NULL(或0,如果这是您选择的'无组'值)或您丢失参照完整性。如果您的数据库支持它,您应该能够在框架中设置“On delete”触发器或级联规则来强制执行此操作。 CakePHP中的行为似乎是正确的。如果该值是依赖的,则应在删除时删除它。如果它不依赖,则需要为正确的操作提供额外的行为逻辑(在这种情况下,您希望将所有值设置为NULL。在其他情况下,您可能希望设置为“默认”组等等)
答案 1 :(得分:1)
总之,是的。将外键留在人员表上将导致数据库中referential integrity丢失。
答案 2 :(得分:0)
>如果不这样做,该人将尝试属于不存在的群体。
还有一个更糟糕的情况:将来会出现一个新的B组,它将重复使用已删除的A组的ID。然后所有前A组的用户将“神奇地”加入新的B组。
答案 3 :(得分:0)
实现两个实体都是独立的情况的另一种更稳定的方法是完全从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.'
)
)
);