Как представить этот тип отношений FK в SQL Server 2005? - PullRequest
2 голосов
/ 03 ноября 2011

Предположим, у меня есть две родительские таблицы: Company и Contact.Предположим, что записи Company и Contact должны иметь 0 или более адресов, записанных против них, где формат адресов для обоих типов записей идентичен.Это подразумевает, что существует необходимость в третьей таблице Address, в которой должны храниться адреса.

Мой вопрос заключается в том, как можно выразить отношения между Company и Contact и Address с использованием иностранногоключевые ограничения, так что такие вещи, как CASCADE DELETE будет работать?(Я предполагаю, что это означает, что у меня не может быть поля OwnerTable в адресе).

Я использую SQL Server 2005.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Заявлено:
- У каждой компании может быть много адресов
- Каждый контакт может иметь много адресов


Это также означает, что каждый адрес может использоваться повторно несколько раз:
- В каждом адресе может быть много компаний / контактов

Если это так, то вам действительно нужна таблица ссылок, допускающая множество: много связей. И в вашем случае у меня будет таблица ссылок для Company (CompanyID, AddressID) и таблица ссылок для Contact (ContactID, AddressID).

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


Если адрес фактически используется только один раз, и вы явно хотите, чтобы удаление компании / контакта удаляло связанные адреса ...
1. Снова используйте триггер
2. Иметь таблицу ContactAddress и таблицу CompanyAddress

Мне не известны какие-либо хитрости, которые позволят одной таблице использовать внешний ключ для двух разных таблиц и разрешить каскадное удаление обеих основных таблиц в одну внешнюю таблицу. Это категорически запрещено в SQL Server для предотвращения каскадного удаления по циклическим ссылкам.

0 голосов
/ 03 ноября 2011

Должен ли работать автоматический каскад, если адрес является общим?Вы можете использовать триггер INSTEAD OF DELETE , чтобы правильно реализовать этот специальный каскад.

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