删除多对一关系的规则

时间:2011-07-05 18:39:39

标签: ios macos core-data

Apple的Relationship Delete Rules文档简单明了。但它只涉及一对多关系(一对一关系的删除规则很容易推断)。目前尚不清楚这些规则对于多对一关系意味着什么。所以我们在这里澄清它们。

我们使用Apple文档中使用的 Employees-Department 示例。虽然这些规则适用于员工 - 部门关系的现实意义可能是荒谬的,但作为程序员,我们只是在谈论它们的逻辑含义。

  • 拒绝
    如果关系目标中存在对象,则无法删除源对象。

    例如,如果您要删除员工,无论其部门中是否还有其他员工,您必须确保首先删除该部门,否则无法删除该员工。

  • 抵消
    从目标对象的反向关系中删除源对象。 (参见@ bshirley的简明解释)

    例如,如果您删除了员工,请将其从其部门的员工关系中删除。只有部门的剩余员工数量大于所需的最小数量,或者确保在下一次保存操作之前为部门添加新员工时,才有意义。

    [问题:如果是最后一名员工,部门的员工关系是否为空集或为空?]
    (由@TechZen回答:一个多对多关系总是返回一个设置对象。它永远不会为零。如果关系的另一边没有对象,则该集合为空。)

  • 级联 删除关系目的地的对象。

    例如,如果您删除员工,请同时删除他的部门,即使部门中还有其他员工。

    用法警告:它通常会导致“整个对象图中的菊花链删除”,如@TechZen在其示例中所述。)

  • 无动作
    对关系目的地的对象不做任何事。

    例如,如果您删除了一名员工,请将其部门保留原样,即使它仍然认为该员工拥有该员工。

多对多关系的删除规则的含义可以从这里推断出来。

2 个答案:

答案 0 :(得分:8)

这些是所有关系(不是属性)的删除规则。它们适用于 to-One to-Many 关系。

  • Nullify - 如果您删除员工,则反向关系设置为 nil ,如果它是1比1,那么字面意思,在这种情况下,部门的员工减少一个< / p>

  • 级联 - 如果删除员工,则会删除其部门。部门将对其所有属性执行删除规则,1)如果员工删除规则为Cascade,则此操作将删除所有员工; 2)如果员工删除规则是Nullify,那么所有员工都会被“搁浅”而没有部门

答案 1 :(得分:1)

您似乎假设删除规则在一对多和多对一之间的行为发生了一些变化,但事实并非如此。一切都以完全相同的方式运作。如果你考虑它就必须这样,因为一对多只是多对一的互惠关系。

我认为这是一种互惠关系的想法,让你在这里绊倒。关系的每一面都是单独定义的,并且有自己的删除规则,可以与另一侧的删除规则不同。

让我们以普通标准部门和员工为例。

Department{
  name:string
  employees<--(required,cascade)-->>Employee.department
}

Employee{
  name:string
  department<<--(required, nullify)-->Department.employee
  projects<--(optional,cascade)-->>Project.owner
}

Project{
  name:
  owner<<--(required,nullify)-->Employee.projects
}

请注意,图形模型中的每个关系,每个箭头线,在互惠关系(标准形式)中附加了两个描述。每个描述描述了一个相关实体的“视角”之间的关系。 。因此,每一对多的关系只是匹配多对一关系的另一面。

此外,旁边的多对多关系的可选/必需/小计数不能阻止对方删除对象。

采取部门&lt; - &gt;&gt;员工关系。从部门的角度来看,部门对象必须至少有一名员工。如果它只有一名员工,则无法删除该员工。如果删除了Department对象本身,那么它的所有员工也将被删除。从员工的角度来看,每个员工都必须拥有一个部门。任何为员工对象的部门值保存nil值的尝试都将产生验证错误。但是,如果删除了employee对象,那么除了丢失其一个雇员对象之外,Department对象根本不会发生任何事情。但是,如果employee对象是关系中唯一的employee对象,则Department对象将阻止删除。

级联删除,顾名思义,可以在整个对象图中设置删除的菊花链。删除Department对象时,它会删除所有相关的Employee对象,每个对象都会删除所有Project对象。

但是,如果您在多对多关系的两边都设置了级联删除规则,那会怎么样:

Alpha{
  betas<<--(cascade)-->>Beta.alphas
}

Beta{
  alphas<<--(cascade)-->>Alpha.betas
}

在这种情况下,删除图表中的任何一个对象将删除由任一键路径相关的所有其他对象。删除一个Beta对象将删除其所有Alpha对象,这些对象将依次删除所有Beta对象,这些对象将删除其所有Alpha对象......依此类推,直到删除所有相关对象为止。

显然,一个双方对多,级联关系是一个很好的方式射击自己的脚。

总结:

  • 每个实体独立地在关系的两侧定义关系。
  • 删除规则可以通过可选性或小数量覆盖。
  • 了解关系的运行时行为需要结合删除规则,可选性和mincounts的效果。

创建数据模型编辑器的一个原因是对关系规则施加一些限制性逻辑,以保持/警告编码人员不会创建意外和跨目的规则。