首页 文章

删除多对一关系的规则

提问于
浏览
12

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

我们使用Apple文档中使用的Employees-Department示例 . 尽管这些规则适用于员工 - 部门关系,但现实生活的影响可能是荒谬的,但作为程序员,我们只是在谈论他们的逻辑含义 .

  • Deny
    如果关系目标中存在对象,则无法删除源对象 .

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

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

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

[ Question :如果是最后一名员工,部门的员工关系是否为空集或为空?]
(由@TechZen回答:一个to-many关系总是返回一个set对象 . 它永远不会是nil . 如果关系的另一边没有对象,则该set为空 . )

  • Cascade 删除关系目的地的对象 .

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

Usage Caveat :它通常会导致"a daisy chain of deletions across the entire object graph",正如@TechZen在他的例子中所描述的那样 . )

  • No Action
    对关系目的地的对象不执行任何操作 .

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

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

2 回答

  • 1

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

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

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

  • 8

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

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

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

    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
    }
    

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

    此外,侧面的多对多关系的可选/必需/小计数不能阻止另一方的对象删除 .

    采取部门< - >>员工关系 . 从部门的角度来看,部门对象必须至少有一名员工 . 如果它只有一名员工,则无法删除该员工 . 如果删除了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的效果 .

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

相关问题