1

给定:

组有很多人

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

我问的原因是这是 Cakephp 中的默认行为。如果将dependent 设置为true,它将删除关联的模型,但如果设置为false,它将保持关联的模型不变。

4

4 回答 4

3

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

于 2008-09-29T10:21:01.273 回答
1

一句话,是的。将外键留在persons 表上会导致数据库内的参照完整性丢失。

于 2008-09-29T10:16:58.897 回答
0

> 如果您不这样做,此人将尝试加入一个不存在的组。

还有一个更糟糕的情况:未来可能会出现一个新的组 B,它会重用已删除的组 A 的 id。然后所有以前 A 组的用户都将“神奇地”加入到新的组 B 中。

于 2008-09-29T10:32:35.800 回答
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.'
        )
    )
);
于 2014-03-07T21:36:51.503 回答