Есть две таблицы:
- пользователь
- Адрес
Пользователь содержит ссылку на адрес.
Адрес содержит столбцы CreatedBy и ModifiedBy, которые являются ссылкой на пользователя.
Как мне спроектировать эту базу данных, чтобы избежать циклической зависимости?
Есть две таблицы:
Пользователь содержит ссылку на адрес.
Адрес содержит столбцы CreatedBy и ModifiedBy, которые являются ссылкой на пользователя.
Как мне спроектировать эту базу данных, чтобы избежать циклической зависимости?
Ответы:
Вместо того, чтобы искать подсказки и хитрости (включая отложенные ограничения), я бы предложил вам просто спроектировать выход из этой «блокировки ссылок» - так что попробуйте что-то вроде этого:
факты
(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 операциях, как показано ниже, потому что одна таблица не существует при создании первой.
CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));
ALTER TABLE A ADD B_FK INT;
Если вы хотите избежать циклической зависимости. Затем вам нужно удалить одно ограничение REFERENCES или вы можете добавить ссылку DELETE и UPDATE CASCADE одним способом. Вы также можете реализовать TRIGGER, если ваша логика несколько сложна.