Что делает каскадное удаление этой базы данных циклическим? - PullRequest
1 голос
/ 18 сентября 2010

Производитель (PK) - Id
Имя

Стенд (PK) - Id
VendorId - fk - каскадное удаление, если Vendor удален)
Имя

Пункт (PK) - Id
VendorId - (fk - каскадное удаление, если Vendor удален)
Имя
Цена

UnavailableItem (PK) - ItemId - (fk - каскадное удаление, если элемент удален)
(PK) - StandId - (fk - каскадное удаление, если подставка удалена)

База данных выше представляет спортивный стадион.

Существует несколько поставщиков (Пицца Боба, Тако Тома ...) Для каждого Продавца существует несколько Стендов (Бобская пиццерия А, Бобская пиццерия Б ...) Товары настраиваются Продавцом, так как все стенды для конкретного Продавца предлагают одинаковые товары по одинаковым ценам. В стойках может заканчиваться конкретный элемент, поэтому в таблице UnavailableItems есть запись для каждого элемента, который стал недоступен на данном стенде (с использованием составного первичного ключа ItemId и StandId)

Проблема:

Я могу создать все отлично, пока не добавлю последний перечисленный внешний ключ (FK_UnavailableItem_StandId_Stand_Id) с правилом удаления: Cascaded

SQL Compact 3.5 (с использованием VS 2010 Server Explorer) сообщает о следующей ошибке: Ссылочные отношения приведут к циклической ссылке, которая не допускается.

Я понимаю, что если у меня есть запись в таблице UnavailableItem, и ее поставщик удаляется, он попытается удалить ее дважды:

Один раз, потому что ссылка на его элемент была удалена. Однажды, поскольку ссылка на ее стенд была удалена.

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

Спасибо за любую помощь, которую вы можете оказать!

Ответы [ 2 ]

2 голосов
/ 18 сентября 2010

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

1 голос
/ 21 сентября 2010

Предполагая, что SSCE не разрешает каскадное удаление по двум путям, вы можете удалить каскадное удаление для UnavailableItem.StandId.

По крайней мере, он все равно будет каскадным, когда Продавец или Предмет будет удален.

И если UnavailableItem по-прежнему содержит строки для удаленных Стендов, по крайней мере они могут быть отфильтрованы при объединении UnavailableItem со Стендом, при построении заказов на повторное заполнение ...

...