【问题标题】:When deleting hasOne or hasMany associations, should the foreignKey be set to NULL?删除hasOne或hasMany关联时,是否应该将foreignKey设置为NULL?
【发布时间】:2010-09-13 23:21:10
【问题描述】:

给定:

组有很多人

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

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

【问题讨论】:

  • 请参阅 this 和引用的工具来为您的表验证这一点。

标签: cakephp associations model-driven


【解决方案1】:

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

【讨论】:

  • 所以你说框架不应该自动执行此操作(这是一个非常自动的系统),但开发人员应该自己处理这些问题?
【解决方案2】:

总之,是的。将外键留在persons表上会导致数据库中referential integrity的丢失。

【讨论】:

    【解决方案3】:

    > 如果你不这样做,这个人会尝试加入一个不存在的群体。

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

    【讨论】:

      【解决方案4】:

      实现两个实体独立的情况的另一种更稳定的方法是从 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.'
              )
          )
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        • 2018-04-23
        • 2022-12-01
        • 2015-03-14
        • 1970-01-01
        • 2019-12-02
        相关资源
        最近更新 更多