Chiave esterna "Nessuna" o "Non utilizzata" quando si utilizzano GUID come chiave primaria

StackOverflow https://stackoverflow.com/questions/622437

Domanda

Stiamo costruendo un'applicazione che potrebbe dover essere replicata su molti server (spero di no, ma non c'è modo di sapere se i client avranno bisogno della propria copia client / server fino a quando non avremo rilasciato il prodotto online).

Poiché il numero di server è sconosciuto, ho deciso di utilizzare i GUID per qualsiasi ID di tabella transazionale. Poiché ogni client ha il proprio database, intendo utilizzare l'impostazione predefinita NEWSEQUENTIALID () e la tabella più grande non aggiungerà più di 1,5 milioni di righe all'anno (ma in media 15.000 righe), non mi aspetto un grosso problema di prestazioni .

Tuttavia, non sono sicuro di come gestire i casi in cui vogliamo che la chiave esterna indichi "nessuno selezionato". Ad esempio, un client ha un singolo utente amministratore. Questo è impostato come chiave esterna (login_id) in login.id (un GUID). Tuttavia, se un client non ha ancora un utente amministratore, come potremmo facilmente impostare un " Nessuno selezionato " chiave?

Nelle applicazioni precedenti abbiamo utilizzato colonne IDENTITY e inserito una voce fittizia nella maggior parte delle tabelle con un ID di 0. Esiste un approccio accettato per fornire funzionalità simili con un GUID?

È stato utile?

Soluzione

Hai 3 opzioni:

1) Nella tabella di riferimento, aggiungi la riga del valore vuoto con una guida di tutti gli zeri, quindi collega a questo record

2) Basta archiviare un null per i riferimenti vuoti

3) Non avere i record vuoti nella tabella di riferimento, ma memorizzare un guid tutto zero. Ciò può causare problemi se i join vengono eseguiti nel database o con i report. Dovrai scrivere un codice per questo caso speciale.

Direi che 1 e 2 sono le uniche buone opzioni.

Altri suggerimenti

L'unico modo sicuro per farlo è impostare il valore FK su NULL. Se è necessario replicare i dati tra più server, assicurarsi che ogni tabella replicata abbia GUID come chiavi primarie, le relazioni con le chiavi esterne non sono mai un problema.

La replica può funzionare in modo molto semplice in questo modo: replicare inserimenti e aggiornamenti prima nell'ordine da tabella padre a figlio, quindi replicare i record eliminati da figlio a padre. (ordine inverso.)

Spero che questo aiuti.

Potrei mancare qualcosa di veramente ovvio qui, ma non puoi semplicemente impostarlo su NULL?

Rendi il campo chiave esterna nella tabella figlio NULLable e mantieni il campo NULL quando non ci sono utenti admin. Valori magici come " 0 " le colonne di identità sono un disastro in attesa di verificarsi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top