Ci sono due tabelle:
- Utente
- Indirizzo
L'utente contiene un riferimento all'indirizzo.
L'indirizzo contiene le colonne CreatedBy e ModifiedBy, che fa riferimento all'utente.
Come posso progettare questo database per evitare una dipendenza ciclica?
Ci sono due tabelle:
L'utente contiene un riferimento all'indirizzo.
L'indirizzo contiene le colonne CreatedBy e ModifiedBy, che fa riferimento all'utente.
Come posso progettare questo database per evitare una dipendenza ciclica?
Risposte:
Invece di cercare suggerimenti e trucchi (inclusi i vincoli differiti), suggerirei di progettare semplicemente la tua via d'uscita da questo "blocco di riferimento" - quindi prova qualcosa del genere:
I fatti
(UserID) esiste.(AddressID) stato creato dall'utente(UserID) .(AddressID) stato creato alla data(DateCreated) .(AddressID) stato modificato da ultimo dall'utente(UserID) alla data(ModifiedOn) .(UserID) risiede Indirizzo(AddressID) dal Data(ValidFrom) .vincoli
Each L'indirizzo è stato creato exactly one dall'utente . It is possible that more than one L'indirizzo è stato creato the same dall'utente .
Each L'indirizzo è stato creato alla exactly one data . It is possible that more than one L'indirizzo è stato creato alla the same data .
For each and Data indirizzo , l' that indirizzo è stato modificato at most one dall'utente alla that data .
For each and Data utente , l' that utente risiede l' at most one indirizzo dalla that data .
Logico

Per quanto riguarda l'indirizzo obbligatorio, verifica che a livello di applicazione e avvolgi le istruzioni di caricamento in una transazione, in questo modo otterrai tutto o niente.
Non hai altra scelta che creare la dipendenza ciclica in 2 operazioni come sotto perché una tabella non esiste quando crei la prima.
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;
Se si desidera evitare la dipendenza ciclica. Quindi è necessario rimuovere un vincolo REFERENCES oppure è possibile aggiungere un riferimento DELETE e UPDATE CASCADE in un modo. Potresti anche implementare un TRIGGER se la tua logica è alquanto complessa.