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