#sql #sql-server #sql-server-2005 #constraints
#sql #sql-server #sql-server-2005 #ограничения
Вопрос:
Предположим, что у меня есть две родительские таблицы: Company
и Contact
. Предположим, что обе Company
Contact
записи and должны иметь 0 или более адресов, записанных для них, где формат адресов для обоих типов записей идентичен. Это означает, что существует необходимость в третьей таблице Address
, где должны храниться адреса.
Мой вопрос в том, как связь между Company
и Contact
и Address
может быть выражена с использованием ограничений внешнего ключа, чтобы такие вещи, как CASCADE DELETE
будут работать? (Я предполагаю, что это означает, что у меня не может быть OwnerTable
поля в адресе).
Я использую SQL Server 2005.
Ответ №1:
Указано:
— У каждой компании может быть много адресов
— У каждого контакта может быть много адресов
Это также, по-видимому, подразумевает, что каждый адрес может использоваться повторно несколько раз:
— У каждого адреса может быть много компаний / контактов
Если это так, то вам действительно нужна таблица ссылок, позволяющая использовать многие: многие отношения. И в вашем случае у меня была бы таблица ссылок для Company (CompanyID, AddressID) и таблица ссылок для Contact (ContactID, AddressID).
Вы могли бы настроить вещи таким образом, чтобы удаление адреса удаляло все соответствующие записи в таблицах ссылок. Но для удаления и адреса, если все сопоставленные компании и контакты удалены, для этого потребуется триггер.
Если адрес фактически используется только один раз, и вы явно хотите, чтобы удаление компании / контакта удаляло связанные адреса …
1. Снова используйте триггер
2. Имейте таблицу ContactAddress и companyaddressstable
Я не знаю ни о каких хитростях, которые позволят одной таблице использовать внешний ключ для двух разных таблиц и позволят обеим основным таблицам каскадно удалять в одну внешнюю таблицу. Это явно запрещено в SQL Server для предотвращения каскадных удалений по циклическим ссылкам.
Комментарии:
1. Спасибо, я думаю, что это прекрасно описывает мою ситуацию и подход, который нужно предпринять.
Ответ №2:
Должен ли работать автоматический каскад, если адрес является общим? Вы могли бы использовать триггер ВМЕСТО DELETE для правильной реализации этого специального каскада.