Есть две таблицы:
- пользователь
- Адрес
Пользователь содержит ссылку на адрес.
Адрес содержит столбцы CreatedBy и ModifiedBy, которые являются ссылкой на пользователя.
Как мне спроектировать эту базу данных, чтобы избежать циклической зависимости?
database-design
Шаши
источник
источник
Ответы:
Вместо того, чтобы искать подсказки и хитрости (включая отложенные ограничения), я бы предложил вам просто спроектировать выход из этой «блокировки ссылок» - так что попробуйте что-то вроде этого:
факты
(UserID)
существует.(AddressID)
был создан пользователем(UserID)
.(AddressID)
был создан на дату(DateCreated)
.(AddressID)
был последний раз изменен пользователем(UserID)
на дату(ModifiedOn)
.(UserID)
находится по адресу(AddressID)
с даты(ValidFrom)
.Ограничения
Each
Адрес был созданexactly one
пользователем .It is possible that more than one
Адрес был созданthe same
пользователем .Each
Адрес был создан наexactly one
дату .It is possible that more than one
Адрес был создан наthe same
дату .For each
Адресand
Дата ,that
адрес был измененat most one
пользователем наthat
дату .For each
Пользовательand
Дата ,that
пользователь ПРЕБЫВАЕТat most one
Адрес посколькуthat
дата .логический
Что касается обязательного адреса, проверьте это на прикладном уровне и оберните операторы загрузки в транзакцию - так вы получите все или ничего.
источник
У вас нет выбора, кроме как создать циклическую зависимость в 2 операциях, как показано ниже, потому что одна таблица не существует при создании первой.
Если вы хотите избежать циклической зависимости. Затем вам нужно удалить одно ограничение REFERENCES или вы можете добавить ссылку DELETE и UPDATE CASCADE одним способом. Вы также можете реализовать TRIGGER, если ваша логика несколько сложна.
источник