Заявлено:
- У каждой компании может быть много адресов
- Каждый контакт может иметь много адресов
Это также означает, что каждый адрес может использоваться повторно несколько раз:
- В каждом адресе может быть много компаний / контактов
Если это так, то вам действительно нужна таблица ссылок, допускающая множество: много связей. И в вашем случае у меня будет таблица ссылок для Company (CompanyID, AddressID) и таблица ссылок для Contact (ContactID, AddressID).
Вы можете настроить параметры так, чтобы удаление адреса удаляло все соответствующие записи в таблицах ссылок. Но для удаления и адреса, если все сопоставленные компании и контакты удалены, для этого потребуется триггер.
Если адрес фактически используется только один раз, и вы явно хотите, чтобы удаление компании / контакта удаляло связанные адреса ...
1. Снова используйте триггер
2. Иметь таблицу ContactAddress и таблицу CompanyAddress
Мне не известны какие-либо хитрости, которые позволят одной таблице использовать внешний ключ для двух разных таблиц и разрешить каскадное удаление обеих основных таблиц в одну внешнюю таблицу. Это категорически запрещено в SQL Server для предотвращения каскадного удаления по циклическим ссылкам.