каскадные удаления, вызывающие несколько каскадных путей - PullRequest
4 голосов
/ 20 сентября 2009

Я использую SQlServer 2008, и ниже приведен фрагмент некоторых таблиц:

Пользователи

Id (PK)

UserItems

UserId (PK) ItemId (PK) - (составной ключ из 2 столбцов) ...

UserItemVotes

UserId (PK) ItemId (PK) VoterId (PK) - (составной ключ из 3 столбцов)

У меня определены следующие отношения:

  • User.Id -> UserItems.UserId
  • (UserItems.UserId, UserItems.ItemId) -> (UserItemVotes.UserId, UserItemVotes.ItemId)
  • UserId.Id -> UserItemVotes.VoterId

Теперь у меня возникла проблема при включении каскадного удаления. При добавлении 3-го отношения я получаю ошибку «... может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, или измените другие ограничения FOREIGN KEY». Я действительно не хочу этого делать, в идеале, если пользователь будет удален, я хотел бы удалить его элемент пользователя и / или его голоса.

Это плохой дизайн? Или есть способ получить поведение, которое я хочу от SQL Server?

Ответы [ 3 ]

12 голосов
/ 23 марта 2011

Утвержденный ответ не является хорошим ответом. Описанный сценарий не плохой дизайн, и при этом не «рискованно» полагаться на базу данных для выполнения своей работы.

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

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

0 голосов
/ 21 сентября 2009

"UserItems.ItemId -> UserItemVotes.UserId"

Этот кажется крайне подозрительным.

0 голосов
/ 20 сентября 2009

Я бы привел к плохому дизайну. Хотя большинство СУБД могут управлять каскадным удалением, рискованно использовать эту встроенную функциональность. Ваш сценарий - прекрасный пример того, почему этими типами вещей часто управляют в коде приложения. Там вы можете точно определить, что нужно удалить и в каком порядке.

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