Следите за [удалить (каскад / ограничить)] и обновить (каскад / ограничить)

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

2 ответа

Использование каскадных операторов в ограничениях внешнего ключа является горячей темой.

Теоретически, если вы точно знаете, что удаление родительского объекта будет также автоматически означать удаление всех его дочерних объектов, то каскадное удаление в связи между дочерней и родительской таблицами может иметь смысл.

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

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

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

Это помогает вообще? Какая-то конкретная деталь, о которой вы все еще неясны?

Мое мнение таково: хотя в теории это отличная идея, большинство разработчиков на самом деле не используют ее в режиме реального времени - большинство разработчиков решат использовать это в коде доступа к данным, что дает им полный и явный контроль над тем, что получает. удален (или обновлен).

Как и то, что говорит marc_s..

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

Другие вопросы по тегам