Istnieją dwie tabele:
- Użytkownik
- Adres
Użytkownik zawiera odniesienie do adresu.
Adres zawiera kolumny CreatedBy i ModifiedBy, które są odniesieniem do użytkownika.
Jak zaprojektować tę bazę danych, aby uniknąć cyklicznej zależności?
Istnieją dwie tabele:
Użytkownik zawiera odniesienie do adresu.
Adres zawiera kolumny CreatedBy i ModifiedBy, które są odniesieniem do użytkownika.
Jak zaprojektować tę bazę danych, aby uniknąć cyklicznej zależności?
Odpowiedzi:
Zamiast szukać wskazówek i sztuczek (w tym odroczonych ograniczeń) sugerowałbym, aby po prostu zaprojektować wyjście z tej „blokady referencyjnej” - spróbuj więc czegoś takiego:
Fakty
(UserID) istnieje.(AddressID) został utworzony przez użytkownika(UserID) .(AddressID) został stworzony na Date(DateCreated) .(AddressID) był ostatnio modyfikowany przez użytkownika(UserID) na Date(ModifiedOn) .(UserID) przebywa pod adresem(AddressID) od daty(ValidFrom) .Ograniczenia
Each Adres został utworzony przez exactly one użytkownika . It is possible that more than one Adres został utworzony przez the same użytkownika .
Each Adres został stworzony na exactly one Date . It is possible that more than one Adres został stworzony na the same Date .
For each Adres and Data , that adres został zmodyfikowany przez at most one użytkownika na that Date .
For each User and Data , that Instrukcja mieszka at most one Adres od that Date .
Logiczny

Jeśli chodzi o adres obowiązkowy, sprawdź, czy na warstwie aplikacji i zawiń instrukcje ładowania w transakcji - w ten sposób otrzymasz wszystko lub nic.
Nie masz wyboru, ale musisz utworzyć zależność cykliczną w 2 operacjach, jak poniżej, ponieważ jedna tabela nie istnieje podczas tworzenia pierwszej.
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;
Jeśli chcesz uniknąć cyklicznej zależności. Następnie musisz usunąć jedno ograniczenie ODNIESIENIA lub możesz dodać odwołanie KASUJ i AKTUALIZUJ w jeden sposób. Możesz również zaimplementować TRIGGER, jeśli twoja logika jest nieco złożona.