Сводка того, что я видел до сих пор:
Я стараюсь избегать, удаляет или обновления, которые я явно не запрашивал в SQL-сервере.
Или посредством расположения каскадом или с помощью триггеров. Они имеют тенденцию кусать Вас в заднице некоторое время по линии, или при попытке разыскать ошибку или при диагностировании проблем производительности.
то, Где я использовал бы их, находится в гарантии непротиворечивости для не очень много усилия. Для получения того же эффекта, необходимо было бы использовать хранимые процедуры.
Один пример - когда у Вас есть зависимости между объектами... т.е.: Документ-> DocumentItems (при удалении Документа DocumentItems не имеют причины существовать)
Я никогда не использую расположение каскадом, удаляет.
, Если я хочу что-то удаленное из базы данных, я хочу явно сказать базу данных, что я хочу вынуть.
, Конечно, они - функция, доступная в базе данных и могут быть времена, когда она должна хорошо использовать их, например, если у Вас есть таблица 'порядка' и 'orderItem' таблица, можно хотеть очистить объекты при удалении порядка.
мне нравится ясность, которую я получаю от выполнения его в коде (или хранимая процедура), а не 'волшебный' случай.
По той же причине я не поклонник триггеров также.
Что-то для замечания - то, что при удалении 'порядка' Вы получите '1 строку, затронутую', сообщают, даже если каскадные удаляют, удалил 50 'orderItem's.
Я делаю много базы данных работает и редко находит, что каскад удаляет полезный. Одно время я использовал их эффективно, находится в базе данных создания отчетов, которая обновляется ночным заданием. Я удостоверяюсь, что любые измененные данные импортируются правильно путем удаления любых высокоуровневых записей, которые изменились начиная с последнего импорта, затем повторно импортируют измененные записи и что-либо, что касается их. Это сохраняет меня от необходимости записать, что много сложных удаляет тот взгляд от нижней части до вершины моей базы данных.
я не полагаю, что каскад удаляет, чтобы быть вполне настолько же плохим как триггеры, как они только удаляют данные, триггеры могут иметь все виды противного материала внутри.
В целом я избегаю реальный, Удаляет в целом, и используйте логичный, удаляет (т.е. имеющий немного столбца, названного isDeleted, который установлен на истинный), вместо этого.
Внешние ключи являются лучшим способом гарантировать ссылочную целостность базы данных. Предотвращение каскадов из-за того, чтобы быть волшебным похоже на запись всего в блоке, потому что Вы не доверяете волшебству позади компиляторов.
то, Что плохо, является неправильным использованием внешних ключей, как создание их назад, например.
примером Juan Manuel является канонический пример при использовании кода существует намного больше возможностей отъезда побочного DocumentItems в базе данных, которая прибудет и укусит Вас.
Каскадные обновления полезны, например, когда у Вас есть ссылки на данные чем-то, что может измениться, сказать, что первичный ключ пользовательской таблицы является именем, lastname комбинация. Тогда Вы хотите, чтобы изменения в той комбинации распространили к тому, везде, где на них ссылаются.
@Aidan, Та ясность, к которой Вы обращаетесь, прибывает в высокую стоимость, шанс отъезда побочных данных в Вашей базе данных, которая является не маленькая . Мне это - обычно просто отсутствие знакомства с DB и неспособностью найти, какие FKs существуют прежде, чем работать с DB, это способствует тому страху. Или это или постоянное неправильное употребление каскада, с помощью него, где объекты не были концептуально связаны, или где необходимо сохранить историю.
Одна причина вставить каскадное удаление (вместо того, чтобы делать его в коде) состоит в том, чтобы улучшить производительность.
Случай 1: С каскадным удалением
DELETE FROM table WHERE SomeDate < 7 years ago;
Случай 2: Без каскадного удаления
FOR EACH R IN (SELECT FROM table WHERE SomeDate < 7 years ago) LOOP
DELETE FROM ChildTable WHERE tableId = R.tableId;
DELETE FROM table WHERE tableId = R.tableid;
/* More child tables here */
NEXT
, Во-вторых, когда Вы добавляете в дополнительной дочерней таблице с каскадным удалением, код в случае, если 1 продолжает работать.
я только вставил бы каскад, где семантика отношений является "частью". Иначе некоторый идиот удалит половину Вашей базы данных, когда Вы сделаете:
DELETE FROM CURRENCY WHERE CurrencyCode = 'USD'
Я, как все остальные здесь, нахожу, что каскад удаляет, действительно только незначительно полезны (это - действительно не так много работы для удаления справочных данных в других таблицах - если существует партия таблиц, Вы просто автоматизируете это со сценарием), но действительно раздражающий, когда кто-то случайно располагается каскадом, удаляет некоторые важные данные, которые трудно восстановить.
единственный случай, где я использовал бы, - то, если данными в таблице таблицы высоко управляют (например, ограниченные полномочия) и только обновляют или удаляют из посредством управляемого процесса (как обновление программного обеспечения), который был проверен.
Я работаю много с расположением каскадом, удаляет.
Это чувствует себя хорошо для знания, кто бы ни работает против базы данных, никогда не мог бы оставлять нежелательные данные. Если зависимости растут, я просто изменяю ограничения в схеме в Studio управления, и я не должен настраивать SP или dataacces.
Однако у меня есть 1 проблема с расположением каскадом, удаляет, и это - циклические ссылки. Это часто приводит к частям базы данных, которые не имеют никакого расположения каскадом, удаляет.