Есть две таблицы:
- пользователь
- Адрес
Пользователь содержит ссылку на адрес.
Адрес содержит столбцы 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, если ваша логика несколько сложна.