2010-10-26 2 views
2

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

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

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

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

ответ

1

Есть 2 типичных внешних ключей сценариев:

  • ассоциация: ссылка 2 сущности, которые могут существовать на своей собственной
  • Состав: Ссылка на дочернюю сущность его родительского объекта (ребенок субъект делает это существовать без родительский, например: заказ и элемент заказа)

Я бы выбрал каскад только в случае композиции и рассматривал каждый случай ассоциации отдельно.

+0

Я думаю, вы ответили на неправильный вопрос, или, может быть, я неверно истолковал ваш ответ ... Но моя дилемма относится к _both_ вашим делам. Мой вопрос спрашивает: _who_ должен ** принудительно использовать ** целостность - не должен ли он применяться или нет. В обоих случаях одна строка зависит от другой; Вопрос заключается в том, что при удалении кто делает чек - базу данных или приложение? –

+0

Я бы опирался на базу данных для обработки каскадных композиций, потому что не имеет смысла держать детей при удалении родителей. Для ассоциаций логика более сложна и зависит от того, где находятся ваши бизнес-правила. Если они находятся за пределами db, тогда бизнес-уровень (приложение, служба) должен заботиться о каскадировании удалений. Но для таких случаев нет золотого правила. Когда вы удаляете последнего сотрудника, связанного с отделом, вы удаляете отдел? Может быть, возможно, нет, это зависит ... –

+0

Я не ищу золотое правило; Я хочу услышать, как другие люди делают это в _practice_. Тем не менее, спасибо за ввод. –