鉴于:

  

小组有很多人

但是关系是独立的(即人员可以存在而不属于某个组),如果删除组时人员表中的外键(即group_id)是否设置为0(或NULL)?如果你不这样做,那么该人将尝试属于一个不存在的群体。

我问的原因是这是Cakephp中的默认行为。如果将依赖项设置为true,则会删除关联的模型,但如果将其设置为false,则会保持关联的模型不受影响。

有帮助吗?

解决方案

是的,外键应设置为NULL(或0,如果这是您选择的'无组'值)或您丢失参照完整性。如果您的数据库支持它,您应该能够在框架中设置“On delete”触发器或级联规则来强制执行此操作。 CakePHP中的行为似乎是正确的。如果该值是依赖的,则应在删除时删除它。如果它不依赖,则需要为正确的操作提供额外的行为逻辑(在这种情况下,您希望将所有值设置为NULL。在其他情况下,您可能希望设置为“默认”组等等)

其他提示

总之,是的。将外键留在人员表上将导致数据库中的参照完整性丢失。

>如果不这样做,该人将尝试属于不存在的群体。

还有一个更糟糕的情况:将来会出现一个新的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.'
        )
    )
);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top