Каковы плюсы и минусы каскадного удаления и обновления?

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

Так может ли кто-нибудь перечислить плюсы и минусы каскадного удаления и обновления? Спасибо.


person Vishal    schedule 26.08.2010    source источник


Ответы (3)


Плюсы:

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

Минусы

  • Возможны сироты
  • Если по ошибке вы удалите строку в родительской таблице, все строки в соответствующих дочерних таблицах будут удалены, и PITA будет выяснять, что вы удалили.
person SQLMenace    schedule 26.08.2010

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

Например: строка счета-фактуры не имеет права на сохранение, если счет-фактура удален.

Но если у вас есть внешний ключ, используемый для отношения «работает на» для отношения между сотрудником и его / ее начальником, хотите ли вы удалить сотрудника, если босс покинет компанию?

Кроме того: техническая проблема заключается в том, что некоторые инструменты ORM (объектно-реляционное сопоставление) сбиваются с толку, если записи зависимой таблицы изменяются без их ответственности за это.

person Frank    schedule 26.08.2010
comment
Я не уверен, что удалил бы босса именно по этой причине, я бы, вероятно, инактивировал ряд - person SQLMenace; 27.08.2010
comment
@SQLMenace Вы бы навсегда сохранили всех бывших сотрудников в таблице сотрудников? Но я надеюсь, вы понимаете суть: бывают ситуации, когда дочерний элемент существует сам по себе, даже если родитель удаляется. - person Frank; 27.08.2010
comment
Я не стучусь в ваш ответ, просто говорю, что я бы сделал ... мы все равно записываем все изменения, и они попадают в таблицу истории ... в зависимости от политики компании вам может быть запрещено когда-либо удалять строки - person SQLMenace; 27.08.2010
comment
@SQLMenance Если вам не разрешено удалять данные, то, конечно, каскадное удаление вообще не имеет смысла, и настройка cascade/restrict/set null в любом случае не имеет значения. - person Frank; 27.08.2010

Плюсы:

  • Целостность данных. Может помочь избежать ситуаций, когда запись ссылается на то, чего больше нет.

Минусы:

  • Производительность. Каскадные удаления/обновления могут быть медленными.
  • Сложность. Кажется, что большинство людей, с которыми я работаю, не привыкли к каскадам, поэтому, когда вы даете им новый проект, в котором он есть, они немного удивляются, когда впервые запускают один из этих каскадов.
  • Как уже упоминали другие, при неправильном использовании может действительно все испортиться.
person FrustratedWithFormsDesigner    schedule 26.08.2010
comment
Или в стандартной форме SLW O20 - person jball; 27.08.2010
comment
Ваше замечание о производительности не имеет смысла. Каскадные удаления/обновления вручную медленнее, чем позволить базе данных обрабатывать это. - person Gili; 10.10.2014