Для чего используют способ cascade

Система управления базами данных SQLite. Изучаем язык запросов SQL и реляционные базы данных на примере библиотекой SQLite3. Курс для начинающих.

Часть 11.6: Каскадное удаления данных в базах данных SQLite

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

Каскадное удаления данных в базах данных SQLite

Из этой записи вы узнаете для чего нужно каскадное удаление данных в реляционных базах данных и, как каскадное удаление облегчает жизнь разработчику. И увидите пример работы каскадного удаления данных из базы данных под управлением SQLite в таблицах, связанных связью многие ко многим, в общем, увидите в действие конструкцию ON DELETE CASCADE.

Каскадное удаление данных из базы данных SQLite

Мы уже рассмотрели всевозможные способы обеспечения целостности данных в базах данных под управлением SQLite. Успели разобраться с ограничениями уровня столбца и ограничениями уровня таблицы и чуть ранее рассмотрели каскадное обновление данных. Теперь перейдем к каскадному удалению данных в базах данных SQLite3.

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

Чтобы избежать такой проблемы и не писать лишние SQL запросы в SQLite было реализовано каскадное удаление данных из таблиц, при каскадном удаление данных мы не пишем лишний SQL запрос DELETE, а также гарантируем себе то, что целостность данных в базах данных не будет нарушена.

Операция каскадного удаления данных реализуется при помощи ключевой фразы ON DELETE CASCADE. Фраза ON DELETE CASCADE говорит SQLite о том, что сперва нужно удалить данные из справочника или домена данных, а затем данные нужно удалять из таблицы, которая ссылается на этот справочник.

Чтобы реализовать каскадное удаление данных из таблицы базы данных, нужно записать правило ON DELETE сразу после FOREIGN KEY, тогда SQLite начнет «понимать», что при удалении данных из справочника, ей нужно удалять и данные из связанных таблиц.

Давайте реализуем пример связи многие ко многим и посмотрим, как происходит каскадное удаление данных из базы данных SQLite3 и поймем, как работает конструкция ON DELETE CASCADE.

Примеры каскадного удаления данных из базе данных SQLite. ON DELETE в SQLite3

Чтобы посмотреть, как удалить данные каскадом, давайте создадим три таблицы в базе данных, которые будут связаны связью многие ко многим, воспользуемся командой CREATE:

Источник

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

9 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Когда/Зачем использовать Cascading в SQL Server?

При настройке внешних ключей в SQL Server, при каких обстоятельствах вы должны его каскадировать при удалении или обновлении, и каковы причины этого?

Это, вероятно, относится и к другим базам данных.

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

Резюме того, что я видел до сих пор:

  • Некоторым людям совсем не нравится каскадирование.

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

  • Cascade Delete может иметь смысл, когда семантика отношения может включать эксклюзивное описание “является частью”. Например, запись OrderLine является частью его родительского порядка, а OrderLines никогда не будет использоваться для нескольких заказов. Если Орден должен исчезнуть, OrderLine также должен быть, и строка без ордера будет проблемой.
  • Канонический пример для Cascade Delete – это SomeObject и SomeObjectItems, где не существует смысла для записи записей элементов без соответствующей основной записи.
  • Вы не должны использовать Cascade Delete, если вы сохраняете историю или используете “мягкое/логическое удаление”, где вы устанавливаете только столбец удаленных бит в 1/true.

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

  • Обновление Cascade может иметь смысл, когда вы используете реальный ключ, а не суррогатный ключ (столбец идентификации/автоинкремента) через таблицы.
  • Канонический пример для Cascade Update – это когда у вас есть изменяемый внешний ключ, например, имя пользователя, которое можно изменить.
  • Вы не должны использовать Cascade Update с ключами, которые являются столбцами Identity/autoincrement.
  • Обновление Cascade лучше всего использовать в сочетании с уникальным ограничением.
Читайте также:  Salerm cosmetics kera plus способ применения

Когда использовать каскадный

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

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

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

Пример Хуана Мануэля – это канонический пример, если вы используете код, есть еще много шансов оставить ложные объекты DocumentItems в базе данных, которые придут и укусят вас.

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

@Aidan. Эта ясность, о которой вы говорите, связана с высокой стоимостью, возможностью оставить ложные данные в вашей базе данных, что мало. Для меня обычно просто отсутствие знакомства с БД и невозможность найти, какие FK находятся на месте, прежде чем работать с БД, которые способствуют этому страху. Либо это, либо постоянное злоупотребление каскадом, используя его там, где объекты не были концептуально связаны, или где вам нужно сохранить историю.

Я никогда не использую каскадные удаления.

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

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

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

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

Что-то замечает, что если вы удаляете “заказ”, вы получите отчет “1 строка затронуты”, даже если каскадное удаление удалило 50 “orderItem”.

Я много работаю с каскадным удалением.

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

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

Один пример – когда у вас есть зависимости между объектами… ie: Document → DocumentItems (при удалении документа, DocumentItems не имеют причины для существования)

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

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

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

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

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

ВКЛ. Удалить каскад:

Если вы хотите удалить строки в дочерней таблице, если соответствующая строка будет удалена в родительской таблице.

Если при каскадном удалении не используется, то для ссылочной целостности будет поднята ошибка.

ON Обновить каскад:

Если вы хотите изменить первичный ключ для обновления в чужом ключе

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

Случай 1: с каскадным удалением

Случай 2: без каскадного удаления

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

Я бы включил только каскад, где семантика отношения является “частью”. В противном случае какой-то идиот удалит половину вашей базы данных, когда вы это сделаете:

Читайте также:  Посадка сеянцев механизированным способом

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

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

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

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

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

У меня было это в прошлом, когда администраторы баз данных и/или “Политика компании” запретили использование “On Delete Cascade” (и других) исключительно из-за плохого опыта в прошлом (в одном случае парень написал три триггера, которые в конечном итоге вызывали друг друга – 3 дня для восстановления привели к полному запрету на триггеры – из-за действий одного idjit).

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

Разработчик должен иметь возможность принять решение на основе того, что такое разработка и что говорит спецификация. Запрет на ковер, основанный на плохом опыте, не должен быть критерием. При удалении каскада будут записываться ВСЕ дети, пользовательская сценария триггера/хранилища может не соответствовать, если его неправильно закодировано.

“Никогда не использовать” мыслительный процесс в лучшем случае драконов. Вызов вызова должен выполняться каждый раз, а изменения, производимые по мере изменения бизнес-модели.

Разве это не то, что “Разработка”?

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

Распространение называется каскадным.

Есть два случая:

‣ Если кортеж в S был удален, удалите связанные с ним кортежи R.

‣ Если кортеж в S был обновлен, обновите значение в кортежах R, которые ссылаются на него.

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

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

Это, однако, плохое в таблицах списков перечислений: кто-то удаляет запись 13 – желтый из таблицы “colors”, и все желтые элементы в базе данных удаляются. Кроме того, они иногда обновляются в стиле “все-вставить”, что полностью исключает ссылочную целостность. Конечно, это неправильно, но как вы измените сложное программное обеспечение, которое работает в течение многих лет, с внедрением истинной ссылочной целостности, подверженной риску возникновения неожиданных побочных эффектов?

Другая проблема заключается в том, что исходные значения внешнего ключа должны сохраняться даже после удаления первичного ключа. Можно создать столбец с надгробным камнем и опцию ON DELETE SET NULL для исходного FK, но для этого снова требуются триггеры или специальный код для сохранения избыточного значения (кроме после исключения PK).

Каскадные удаления чрезвычайно полезны при реализации объектов логического супертипа и подтипа в физической базе данных.

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

Удаление каскадов может быть очень полезным инструментом для:

1) Убедитесь, что удаление записи супертипа также удаляет соответствующую запись отдельного подтипа.

2) Убедитесь, что любое удаление записи подтипа также удаляет запись супертипа. Это достигается путем реализации триггера “вместо” в таблице подтипа, который идет и удаляет соответствующую запись супертипа, которая, в свою очередь, каскад удаляет запись подтипа.

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

Источник

Оцените статью
Разные способы