Є дві таблиці:
- Користувач
- Адреса
Користувач містить посилання на адресу.
Адреса містить стовпці 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 дати .
Логічні

Що стосується обов'язкової адреси, переконайтеся, що на рівні програми та загортайте оператори завантаження в транзакцію - таким чином ви отримаєте все або нічого.
У вас немає іншого вибору, як створити циклічну залежність у двох операціях, як показано нижче, оскільки одна таблиця не існує при створенні першої.
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, якщо ваша логіка дещо складна.