【问题标题】:Delete Rules for Many-to-One Relationship删除多对一关系规则
【发布时间】:2011-09-29 01:27:38
【问题描述】:

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

我们使用 Apple 文档中使用的 Employees-Department 示例。尽管将这些规则应用于员工-部门关系的现实意义可能很荒谬,但作为程序员,我们在这里只讨论它们的逻辑意义。

  • 拒绝
    如果关系目的地有对象,则无法删除源对象。

    例如,如果你想删除一个员工,不管他所在部门是否还有其他员工,都必须确保先删除该部门,否则无法删除该员工。

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

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

    [问题:如果是最后一个员工,部门的员工关系会变成空集还是null?]
    (@TechZen 回答:一对多关系总是返回一个集合对象。它从不为零。如果关系的另一端没有对象,则集合为空。)

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

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

    使用注意事项:它通常会导致“整个对象图中的菊花链删除”,正如@TechZen 在他的示例中所描述的那样。)

  • 无操作
    对关系目标处的对象不执行任何操作。

    例如,如果您删除了一名员工,请让他的部门保持原样,即使它仍然认为自己拥有该员工。

Many-to-Many关系的Delete Rules的含义可以从这里推断出来。

【问题讨论】:

  • 为什么这个例子是从员工的角度思考的......如果你删除一个员工,同时删除他的部门,即使该部门还有其他员工......应该是反向的.....如果删除一个部门,同时删除所有员工,即使该部门还有员工

标签: ios macos core-data


【解决方案1】:

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

  • Nullify - 如果您删除员工,则反向关系设置为 nil,如果是 1 对 1,则字面意思是,在这种情况下,部门的员工减少 1

  • 级联 - 如果您删除员工,其部门将被删除。部门将遵循其所有属性的删除规则,1)如果员工删除规则为级联,则所有员工都将被此操作删除; 2) 如果员工删除规则为 Nullify,则所有员工都将“搁浅”而没有部门

【讨论】:

  • 您能否详细说明 Nullify 规则? “它的部门设置为零”在这里似乎没有意义。为了让事情简单明了,请不要将部门删除规则的反向应用扩展到苹果文档中已经非常清楚地说明的员工关系。谢谢。
  • @an 级联意味着您需要担心被追逐的属性的删除规则是什么。 “部门设置为零”荒谬的,你是对的,编辑来了
【解决方案2】:

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

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

我们以通用标准的部门和员工为例。

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
}

请注意,每个关系,图形模型中的每条箭头线,都有两个以互惠关系附加的描述(这是标准形式)。每个描述都从相关实体之一的“角度”描述关系.因此,每个一对多关系只是匹配多对一关系的反面。

此外,不是一对多关系的可选/必需/mincount 可以阻止删除另一端的对象。

取部门>员工关系。从部门的角度来看,一个部门对象必须至少有一名员工。如果它只有一名员工,则无法删除该员工。如果 Department 对象本身被删除,那么它的所有员工也会被删除。从员工的角度来看,每个员工必须有一个部门。任何为员工对象的部门值保存 nil 值的尝试都会引发验证错误。但是,如果删除了员工对象,则部门对象除了丢失其中一个员工对象外,什么也没有发生。但是,如果员工对象是关系中的唯一员工对象,则部门对象将阻止删除。

顾名思义,级联删除可以在整个对象图中引发菊花链删除。当您删除一个 Department 对象时,它会删除其所有相关的 Employee 对象,每个 Employee 对象又会删除它们的所有 Project 对象。

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

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

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

在这种情况下,删除图中的任何一个对象都会删除与任一 keypath 相关的所有其他对象。删除一个 Beta 对象会删除它的所有 Alpha 对象,而这些 Alpha 对象又会删除它们的所有 Beta 对象,而这些 Beta 对象又会删除它们的所有 Alpha 对象……依此类推,直到所有可访问的相关对象都被删除。

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

总之:

  • 关系由每个实体独立定义在关系的两侧。
  • 删除规则可以被可选性或最小计数覆盖。
  • 了解关系的运行时行为需要结合删除规则、可选性和最小计数的影响。

创建数据模型编辑器的一个原因是对关系规则施加一些限制性逻辑,以防止/警告编码人员创建意外和交叉用途的规则。

【讨论】:

  • 没有明确 minCount 的“必需”对多关系意味着 minCount 为 1?一对多关系的一个令人困惑的地方是 nil 和空集之间的区别,你能详细说明一下吗?
  • 一个 require to-many 会自动获得 1 的 mincount,但它可以有一个更大的值。一对多关系总是返回一个集合对象。它永远不会是零。如果关系的另一端没有对象,则集合为空。
猜你喜欢
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2012-06-12
相关资源
最近更新 更多