Efficienza della chiave primaria composita come chiave esterna


12

Ho una tabella con una chiave primaria composita (composta da 4 colonne) che viene utilizzata per garantire che non vengano inseriti duplicati nella tabella. Ora ho bisogno di una nuova tabella che dovrà fare riferimento alle chiavi di questa tabella come chiavi esterne.

La mia domanda è quale approccio è più efficiente per le velocità di ricerca:

1) Creo la nuova tabella includendo tutte e 4 le colonne e le faccio riferimento tutte in una chiave esterna.

o

2) Creo una nuova colonna identità nella tabella Chiave primaria e la utilizzo come chiave esterna nella nuova tabella.

Questo database dovrebbe contenere una grande quantità di dati, quindi l'ho costruito fino ad ora al fine di ridurre al minimo la quantità di dati contenuti in ciascuna tabella. Con questo in mente, l'opzione 2 sarebbe l'approccio migliore poiché salverò 2 colonne int e una colonna datetime per ogni riga, ma voglio evitare di aumentare il tempo di ricerca se non necessario.


1
Personalmente userei quasi sempre una chiave surrogata (es. Un INT IDENTITY) in tal caso - rende molto più semplice fare riferimento e unirmi a quella tabella. Per evitare duplicati, metti un vincolo UNICO su quelle quattro colonne. Inoltre: le chiavi primarie strette sono molto migliori per motivi di prestazioni (se utilizzate come chiave di clustering)
marc_s,

Risposte:


11

Il costo dell'utilizzo di un semplice intero sintetico PK è piccolo e il vantaggio nel tuo caso sarebbe probabilmente piuttosto considerevole.

  • Come fai notare, avrai una relazione FK molto più semplice.
  • Un piccolo PK crea indici piccoli (e veloci). Il tuo spazio tabella totale sarà probabilmente ridotto con l'aggiunta di tale colonna.
  • Se le regole aziendali cambiano, non dovrai riordinare la tabella.

L'unico aspetto negativo materiale che viene in mente è che potresti perdere le prestazioni sulle query che hanno beneficiato del clustering sul PK composito. Se pensi che sia probabilmente significativo, continua a raggruppare la chiave candidata composita, ma metti il ​​PK sulla chiave sintetica.


5

Come spesso accade nel mondo SQL, la risposta è: "Dipende".

Dai un'occhiata a questa domanda per alcuni puntatori: le chiavi naturali forniscono prestazioni superiori o inferiori in SQL Server rispetto alle chiavi intere surrogate?

Ci sono casi che vedono un miglioramento delle prestazioni quando si utilizzano chiavi naturali come chiavi esterne. Tuttavia, nella maggior parte dei casi sarai migliore con chiavi più piccole (leggi: chiavi surrogate).

Se introduci quella colonna IDENTITÀ, la trasformerei addirittura nella chiave primaria e cambierei le colonne "naturali" in modo che diventino UN VINCOLO UNICO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.