Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Vincolo di chiave esterna bidirezionale

"Credo che sia impossibile. Non puoi creare un record di indirizzo finché non conosci l'ID della persona e non puoi inserire il record della persona finché non conosci un AddressId per il campo PrimaryAddressId."

A prima vista, tale affermazione sembra COSÌ attraente. Tuttavia, è abbastanza propositivo.

Questo è un tipo di problema molto comune che i fornitori di DBMS SQL tentano di attaccare già da forse decenni.

La chiave è che tutto il controllo dei vincoli deve essere "differito" fino a quando non vengono eseguiti entrambi gli inserimenti. Ciò può essere ottenuto sotto diverse forme. Le transazioni del database possono offrire la possibilità di fare qualcosa come "IMPOSTARE il controllo del vincolo differito ATTIVO" e il gioco è fatto (se non fosse per il fatto che in questo particolare esempio, probabilmente dovresti pasticciare molto con il tuo progetto in ordine per poter semplicemente DEFINIRE i due vincoli FK, perché uno di essi semplicemente NON È un 'vero' FK in senso SQL!).

Le soluzioni basate su trigger descritte qui ottengono essenzialmente lo stesso effetto, ma sono esposte a tutti i problemi di manutenzione che esistono con l'integrità applicata dall'applicazione.

Nel loro lavoro, Chris Date e Hugh Darwen descrivono quella che è la vera soluzione al problema:l'assegnazione multipla. Cioè, essenzialmente, la possibilità di comporre diverse istruzioni di aggiornamento distinte e fare in modo che il DBMS agisca su di esse come se fosse una singola istruzione. Esistono implementazioni di questo concetto, ma non ne troverai nessuna che parli di SQL.