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_code
colonna, che mantiene i valori "Repubblicano" e "Democratico", essendo la vera chiave della tabella, è impostata con un vincolo UNICO, ma ho facoltativamente aggiunto party_code_idn
e definito come il PK della tabella (anche se, logicamente parlando , party_code
può 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 :
- Leggibile per l'utente finale (+)
- Facile da importare / esportare tra i sistemi (+)
- Difficile cambiare il valore in quanto necessita di modifiche in tutte le tabelle di riferimento (-)
- 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:
- Non leggibile per l'utente finale (-)
- Difficile import-export quanto dobbiamo de-referenziarlo (-)
- Valori facili da modificare, poiché stiamo memorizzando solo riferimenti nelle tabelle delle transazioni (+)
- 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.