Quali sono le migliori pratiche relative alle tabelle di ricerca nei database relazionali?


14

Le tabelle di ricerca (o tabelle di codici , come alcune persone le chiamano) sono in genere una raccolta dei possibili valori che possono essere forniti per una determinata colonna.

Ad esempio, supponiamo di avere una tabella di ricerca chiamata party(intesa per memorizzare informazioni sui partiti politici) che ha due colonne:

  • party_code_idn, che contiene valori numerici generati dal sistema e (privo di significato del dominio aziendale ) funziona come surrogato della chiave reale.
  • party_code, è la chiave reale o "naturale" della tabella perché mantiene valori che hanno connotazioni di dominio aziendale .

E diciamo che tale tabella conserva i dati che seguono:

 +----------------+------------+
 | party_code_idn | party_code |
 +----------------+------------+
 |              1 | Republican |
 |              2 | Democratic |
 +----------------+------------+

La party_codecolonna, che mantiene i valori "Repubblicano" e "Democratico", essendo la vera chiave della tabella, è impostata con un vincolo UNICO, ma ho facoltativamente aggiunto party_code_idne definito come il PK della tabella (anche se, logicamente parlando , party_codepuò funzionare come PRIMARY KEY [PK]).

Domanda

Quali sono le migliori pratiche per indicare i valori di ricerca dalle tabelle delle transazioni ? Devo stabilire riferimenti a CHIAVE ESTERA (FK) o (a) direttamente al valore naturale e significativo o (b) a valori surrogati?

Opzione (a) , ad esempio,

 +---------------+------------+---------+
 | candidate_idn | party_code |  city   |
 +---------------+------------+---------+
 |             1 | Democratic | Alaska  |
 |             2 | Republican | Memphis |
 +---------------+------------+---------+

ha le seguenti proprietà 1 :

  1. Leggibile per l'utente finale (+)
  2. Facile da importare / esportare tra i sistemi (+)
  3. Difficile cambiare il valore in quanto necessita di modifiche in tutte le tabelle di riferimento (-)
  4. L'aggiunta di un nuovo valore non è costosa (=)

Penso che sia quasi come " passare per valore ", trarre un'analogia dalla chiamata di funzione nel gergo di programmazione dell'applicazione.

Opzione (b) , ad esempio,

 +---------------+----------------+---------+
 | candidate_idn | party_code_idn |  city   |
 +---------------+----------------+---------+
 |             1 |              1 | Alaska  |
 |             2 |              2 | Memphis |
 +---------------+----------------+---------+

ha le proprietà seguenti:

  1. Non leggibile per l'utente finale (-)
  2. Difficile import-export quanto dobbiamo de-referenziarlo (-)
  3. Valori facili da modificare, poiché stiamo memorizzando solo riferimenti nelle tabelle delle transazioni (+)
  4. L'aggiunta di un nuovo valore non è costosa (=)

È molto simile al " passaggio per riferimento ", se paragonato alla chiamata di funzione nel linguaggio di programmazione dell'app.

Import-Export può anche essere fatto in un modo diverso, cioè semplicemente popolando nuovamente la tabella di ricerca e quindi re-seed della colonna surrogata. Spero di capire bene, è qualcosa che ho appena sentito come una possibilità.

1. Notare che +, -e= indicare il beneficio di tali proprietà.

Domanda

Abbastanza importante: c'è una differenza tra una ricerca (o un codice tabella di ) e un riferimento FK se utilizzeremo solo quest'ultimo approccio? Penso che funzionino allo stesso modo.

Risorse correlate

Risposte:


10

Con IDN, intendo che intendi un IDENTITY, SEQUENCEo AUTO_INCREMENTcampo? Dovresti dare un'occhiata qui e qui .

Nota, sezione 5 (Uso improprio di valori di dati come elementi di dati) del primo riferimento, sotto la figura 10

Ovviamente puoi avere una tabella separata per gli addetti alle vendite e quindi fare riferimento a essa usando una chiave esterna, preferibilmente con una semplice chiave surrogata come sales_person_id, mostrata sopra.

Quindi, questo esperto pensa che dovresti "deferire" le chiavi surrogate. È davvero una tecnica SQL di base e non dovrebbe causare problemi nell'SQL quotidiano. Sembra che ci sia un errore nella figura 10: il sales_person in SalesData dovrebbe essere una chiave surrogata (cioè un numero), non testo. Lo deduco dalla citazione sopra.

Ciò che dovresti evitare a tutti i costi è la tentazione (molto comune per i programmatori di database principianti) di commettere l'errore descritto nella sezione (1) Tabelle di ricerca comuni. Questo è comunemente chiamato l' approccio MUCK ( Massively Unified Code Key ) (non per caso :-) in particolare da Joe Celko , anche sarcasticamente noto come OTLT - One True Lookup Table ) e porta a tutti i tipi di difficoltà. I programmatori principianti sembrano ritenere che un singolo codice / ricerca / qualunque tabella sia "più pulita" e sarà più efficiente quando nulla potrebbe essere più lontano dalla verità.

Dal secondo riferimento sopra:

La normalizzazione elimina i dati ridondanti, rendendo così notevolmente più semplice il compito di imporre l'integrità dei dati, ma il processo di creazione di un MUCK è qualcosa di completamente diverso. I MUCK non eliminano i dati ridondanti, ma piuttosto un'eliminazione di quelli che PERCEPONO DI essere tabelle ridondanti, ma come dimostrerò, un minor numero di tabelle non equivale a semplicità.

Potresti anche dare un'occhiata al paradigma EAV ( Entity Attribute Value ) correlato che tratterò qui .


Per IDN intendevo la chiave esterna generata automaticamente. Non utilizzo tabelle di ricerca comuni, non sei sicuro di come pensavi che lo avessi usato? Usiamo come centinaia di tabelle di codici in realtà. Sembra davvero strano che qualcuno lo farebbe in una tabella unificata. Ma è bene sapere che esiste un modello del genere che dovrebbe essere evitato. EAV sembra interessante. Quindi il consenso è che dovrei dereference usando IDN cioè chiave surrogata?
Nishant,

1
Lo stratagemma di "dereferenziazione" sembra certamente essere l'approccio di maggioranza. Perché non sperimentare un po 'e vedere come vai avanti? Scegli alcune chiavi naturali e guarda come funziona il tuo SQL, quindi specifica un surrogato e scherza con quello per un po '. Celko e Pascal sarebbero rispettati nel mondo SQL / Relazionale, ma ho visto persone litigare con loro dicendo che il loro approccio è troppo dottrinario e purista - e che i sistemi del "mondo reale" devono usare chiavi surrogate. Se la tua chiave naturale è composta da tre campi e si trova FOREIGN KEYin un'altra tabella, può diventare piuttosto disordinata ma YMMV.
Vérace,

Sì, ho avuto questo pensiero purista ed ero come perché ppl usa chiavi surrogate! E poi alcuni casi d'uso sembravano davvero difficili da gestire nel mondo purista. Ho sentito che l'approccio surrogato è più semplice anche se ci sono alcuni svantaggi dell'importazione e dell'esportazione. In effetti lo scenario di combinazione può essere più complicato. Le tabelle di codici BTW non sono molto diverse dalla chiave esterna nello scenario surrogato, giusto? Voglio dire, la distinzione logica esiste ma non è altro che una chiave esterna.
Nishant,

1
Puoi far valere le tue chiavi naturali tramite UNIQUE CONSTRAINTs NOT NULL- beh, le voci della tabella dei codici sono FOREIGN KEYs nelle tabelle che le usano / si riferiscono ad esse - quindi i concetti sono correlati, ma non uguali. La chiave surrogata della tabella dei codici è il campo che appare nella tabella "figlio" - certamente meno leggibile, ma INTnon molto grande - non richiede molto spazio, il che è un vantaggio delle chiavi surrogate.
Vérace,

10

Esiste un terzo approccio che presenta alcuni dei vantaggi delle due opzioni: inserire un codice effettivo nella tabella dei codici. Con questo intendo una breve sequenza di caratteri che cattura l'essenza dell'intero valore ed è unica. Per il tuo esempio, potrebbe essere

Idn: 1
Name: Democrats
Code: D      (or DEM)

Il codice viene portato nelle tabelle transazionali come chiave esterna. È breve, intelligibile e in qualche modo indipendente dai dati "reali". Modifiche incrementali al nome non suggerirebbero una modifica del codice. Se i repubblicani dovessero decampare in massa , tuttavia, potrebbe essere necessario un cambio di codice, con i relativi problemi che un ID surrogato non dovrebbe sostenere.

Questo stile è stato definito una codifica abbreviazione. Posso consigliare la scrittura di Celko su questo. Google books contiene numerosi esempi. Cerca "Codifica Celko".

Altri esempi: codifica a 2 o 3 lettere per paesi, codifica a 3 lettere (GBP, USD, EUR) per i codici valuta. Breve, autoesplicativo e non cambia (e c'è un ISO per loro).

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.