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.