Удалить правила для отношений «многие к одному» - PullRequest
12 голосов
/ 05 июля 2011

Документация Apple Правила удаления отношений проста и понятна.Но речь идет только об отношениях один-ко-многим (правила удаления для отношений один-к-одному легко определить).Непонятно, что означают эти правила для отношений Много-к-одному .Итак, давайте уточним их здесь.

Мы используем пример Employees-Department , используемый в документации Apple.Хотя в реальной жизни последствия этих правил, применимых к отношениям Отдел сотрудников , могут быть нелепыми, мы, как программисты, говорим здесь только об их логических значениях.

  • Запретить
    Если в месте назначения отношения есть объект, то исходный объект не может быть удален.

    Например, если вы хотите удалить сотрудника, независимо от того, есть лидругие сотрудники в его отделе все еще должны быть уверены, что сначала отдел будет удален, иначе сотрудник не может быть удален.

  • Обнулить
    Удалить исходный объектот обратной связи объекта в пункте назначения.(См. Краткое объяснение @ bshirley)

    Например, если вы удалите сотрудника, удалите его из отношений сотрудников своего отдела.Это имеет смысл только в том случае, если количество оставшихся сотрудников отдела превышает требуемое минимальное количество или если вы гарантируете, что добавляете новых сотрудников для отдела до следующей операции сохранения.

    [ Вопрос: Если это последний сотрудник, станет ли отношение сотрудников отдела пустым или недействительным?]
    (Отвечено @TechZen: отношение ко многим всегда возвращает установленный объект. Оно никогда не равно нулю. Если естьне являются объектами на другой стороне отношения, набор пуст.)

  • Каскад Удалить объект в месте назначения отношения.

    Например, если вы удаляете сотрудника, одновременно удаляйте его отдел, даже если в отделе все еще есть другие сотрудники.

    ( Предупреждение об использовании : обычно это вызывает«последовательная цепочка удалений по всему графу объектов», как описано @TechZen в его примере.)

  • без действий
    делатьничего к объекту в месте назначения отношений.

    Например, если вы удаляете сотрудника, оставьте его отдел таким, какой он есть, даже если он все еще считает, что владеет этим сотрудником.

Значения правил удаления для отношения многие ко многим могут быть выведены отсюда.

Ответы [ 2 ]

8 голосов
/ 05 июля 2011

Это правила удаления для всех отношений (не атрибутов).Они применимы для отношений к-одному или к-многим .

  • Обнулить - при удалении сотрудника устанавливается обратное отношениедо ноль , если это было 1 к 1, то буквально, в этом случае сотрудники отдела сокращаются на один

  • Каскад - если вы удаляете сотрудника, этоОтдел будет удален.Департамент будет следовать правилу удаления для всех своих свойств: 1) если бы правило удаления сотрудников было каскадным, все сотрудники были бы удалены этим действием;2) если бы правилом удаления сотрудников было Nullify, все сотрудники были бы "заблокированы" без отдела

1 голос
/ 06 июля 2011

Похоже, вы предполагаете, что есть некоторые изменения в поведении правил удаления между «один ко многим» и «многие к одному», но это не так.Все работает точно так же.Если вы думаете об этом, то так должно быть, потому что один-ко-многим - это просто взаимное отношение многих к одному.

Я думаю, что идея взаимных отношений сбивает вас с толку.Каждая сторона отношения определяется отдельно и имеет свое собственное правило удаления, которое может отличаться от правила удаления на другой стороне.

Давайте возьмем для примера общий стандартный отдел и сотрудник.

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 отношения «ко многим» на стороне может блокировать удалениеобъекты на другой стороне.

Возьмите Отдел <- >> Отношения сотрудника.С точки зрения Департамента, объект Департамента должен иметь хотя бы одного сотрудника.Если у него только один сотрудник, этот сотрудник не может быть удален.Если сам объект отдела удаляется, то удаляются и все его сотрудники.С точки зрения сотрудника, каждый сотрудник должен иметь один отдел.Любая попытка сохранить значение nil для значения отдела объекта сотрудника приведет к ошибке проверки.Однако если объект работника удаляется, то с объектом Department вообще ничего не происходит, за исключением того, что он теряет один из своих объектов employee.Однако, если объект сотрудника является единственным объектом сотрудника в отношении, объект Department заблокирует удаление.

Каскадное удаление, как следует из названия, может вызвать последовательную цепочку удалений по всему графу объектов.Когда вы удаляете объект Department, он удаляет все связанные с ним объекты Employee, каждый из которых, в свою очередь, удаляет все свои объекты Project.

Но что, если у вас установлено каскадное правило удаления по обе стороны от многих ко многим?отношения, подобные этому:

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

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

В этом случае удаление какого-либо одного объекта в графе приведет к удалению всех других объектов, связанных с любым путем ключа.Удаление одного бета-объекта приведет к удалению всех его альфа-объектов, что, в свою очередь, приведет к удалению всех их бета-объектов, которые, в свою очередь, удалят все их альфа-объекты ... и так до тех пор, пока не будут удалены все связанные доступные объекты.

Очевидно, что двухсторонние каскадные отношения - хороший способ выстрелить себе в ногу.

Суммируя:

  • Отношения определяются на обеих сторонах отношений каждой сущностью независимо.
  • Правила удаления могут быть переопределены дополнительным или минимальным счетом.
  • Понимание поведения отношений во время выполнения требует сочетания эффектов правил удаления, опциональности и mincounts.

Одной из причин создания редактора модели данных было наложение некоторой ограничительной логики на правила отношений, чтобы не дать кодировщикам / предупредить создание неожиданных и универсальных правил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...