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

Come creare una vera relazione uno-a-uno in SQL Server

Sono abbastanza sicuro che sia tecnicamente impossibile in SQL Server avere una relazione True 1 a 1, poiché ciò significherebbe che avresti per inserire entrambi i record contemporaneamente (altrimenti avresti un errore di vincolo all'inserimento), in entrambe le tabelle, con entrambe le tabelle che hanno una relazione di chiave esterna tra loro.

Detto questo, la progettazione del database descritta con una chiave esterna è una relazione da 1 a 0..1. Non è possibile alcun vincolo che richieda un record nella tabellaB. Puoi avere una pseudo-relazione con un trigger che crea il record nella tabellaB.

Quindi ci sono alcune pseudo-soluzioni

Innanzitutto, archivia tutti i dati in un'unica tabella. Allora non avrai problemi in EF.

In secondo luogo, la tua entità deve essere abbastanza intelligente da non consentire un inserimento a meno che non abbia un record associato.

O in terzo luogo, e molto probabilmente, hai un problema che stai cercando di risolvere e ci stai chiedendo perché la tua soluzione non funziona invece del problema reale che stai cercando di risolvere (un problema XY).

AGGIORNAMENTO

Per spiegare in REALITÀ come le relazioni 1 a 1 non funzionano, userò l'analogia del dilemma del pollo o dell'uovo. Non intendo risolvere questo dilemma, ma se dovessi avere un vincolo che dice per aggiungere un uovo alla tabella delle uova, la relazione del pollo deve esistere e il pollo deve esistere nella tabella, allora non è stato possibile aggiungere un uovo alla tabella delle uova. È vero anche il contrario. Non puoi aggiungere un pollo alla tabella delle galline senza che sia la relazione con l'uovo che l'uovo esistano nella tabella delle uova. Quindi nessun record può essere creato in un database senza violare una delle regole/vincoli.

nomenclatura del database di una relazione uno-a-uno è fuorviante. Tutte le relazioni che ho visto (quindi la mia esperienza) sarebbero più descrittive come relazioni uno a (zero o uno).