Когда и зачем использовать каскадирование в SQL Server?

jQuery .val ()

  var foo = $('#multiple').val(); 

144
задан Vinko Vrsalovic 16 September 2008 в 18:47
поделиться

9 ответов

Сводка того, что я видел до сих пор:

  • Некоторым людям не нравится располагаться каскадом вообще.

Каскадное удаление

  • Каскадное удаление может иметь смысл, когда семантика отношений может включить эксклюзивное , "часть " описание. Например, запись OrderLine является частью своего родительского порядка, и OrderLines никогда не будет совместно использоваться несколькими заказами. Если бы Порядок состоял в том, чтобы исчезнуть, OrderLine должен также, и строка без Порядка была бы проблемой.
  • каноническим примером для Каскадного удаления является SomeObject и SomeObjectItems, где не имеет никакого смысла для записи объектов когда-либо существовать без соответствующей основной записи.
  • Вы должны не Каскадное удаление использования, если Вы сохраняете историю или используете "мягкий/логичный, удаляют", где Вы только устанавливаете удаленный разрядный столбец на 1/верный.

Каскадное обновление

  • Каскадное обновление может иметь смысл при использовании реального ключа, а не суррогатного ключа (идентификационные данные/столбец автоприращения) через таблицы.
  • канонический пример для Каскадного обновления - когда у Вас есть изменяемый внешний ключ, как имя пользователя, которое может быть изменено.
  • Вы должны не Каскадное обновление использования с ключами, которые являются Идентификационными данными/столбцами автоприращения.
  • Каскадное обновление лучше всего используется в сочетании с ограничением на уникальность данных.

, Когда Использовать Расположение каскадом

  • , можно хотеть вернуть дополнительное сильное подтверждение от пользователя прежде, чем позволить операции располагаться каскадом, но оно зависит от приложения.
  • Расположение каскадом может получить Вас в проблему при установке внешних ключей неправильно. Но необходимо быть хорошо, если Вы делаете это правильно.
  • не мудро использовать расположение каскадом перед пониманием его полностью. Однако это - полезная функция и поэтому стоящий занимания время для понимания.
123
ответ дан Community 16 September 2008 в 18:47
поделиться

Я стараюсь избегать, удаляет или обновления, которые я явно не запрашивал в SQL-сервере.

Или посредством расположения каскадом или с помощью триггеров. Они имеют тенденцию кусать Вас в заднице некоторое время по линии, или при попытке разыскать ошибку или при диагностировании проблем производительности.

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

2
ответ дан pauliephonic 16 September 2008 в 18:47
поделиться

Один пример - когда у Вас есть зависимости между объектами... т.е.: Документ-> DocumentItems (при удалении Документа DocumentItems не имеют причины существовать)

9
ответ дан juan 16 September 2008 в 18:47
поделиться

Я никогда не использую расположение каскадом, удаляет.

, Если я хочу что-то удаленное из базы данных, я хочу явно сказать базу данных, что я хочу вынуть.

, Конечно, они - функция, доступная в базе данных и могут быть времена, когда она должна хорошо использовать их, например, если у Вас есть таблица 'порядка' и 'orderItem' таблица, можно хотеть очистить объекты при удалении порядка.

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

По той же причине я не поклонник триггеров также.

Что-то для замечания - то, что при удалении 'порядка' Вы получите '1 строку, затронутую', сообщают, даже если каскадные удаляют, удалил 50 'orderItem's.

16
ответ дан Loofer 16 September 2008 в 18:47
поделиться

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

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

В целом я избегаю реальный, Удаляет в целом, и используйте логичный, удаляет (т.е. имеющий немного столбца, названного isDeleted, который установлен на истинный), вместо этого.

10
ответ дан Martynnw 16 September 2008 в 18:47
поделиться

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

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

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

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

@Aidan, Та ясность, к которой Вы обращаетесь, прибывает в высокую стоимость, шанс отъезда побочных данных в Вашей базе данных, которая является не маленькая . Мне это - обычно просто отсутствие знакомства с DB и неспособностью найти, какие FKs существуют прежде, чем работать с DB, это способствует тому страху. Или это или постоянное неправильное употребление каскада, с помощью него, где объекты не были концептуально связаны, или где необходимо сохранить историю.

65
ответ дан Vinko Vrsalovic 16 September 2008 в 18:47
поделиться

Одна причина вставить каскадное удаление (вместо того, чтобы делать его в коде) состоит в том, чтобы улучшить производительность.

Случай 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'
3
ответ дан JohnFx 16 September 2008 в 18:47
поделиться

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

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

2
ответ дан Jen A 16 September 2008 в 18:47
поделиться

Я работаю много с расположением каскадом, удаляет.

Это чувствует себя хорошо для знания, кто бы ни работает против базы данных, никогда не мог бы оставлять нежелательные данные. Если зависимости растут, я просто изменяю ограничения в схеме в Studio управления, и я не должен настраивать SP или dataacces.

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

12
ответ дан Mathias F 16 September 2008 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: