In ogni schema di database ci potrebbero essere molte tabelle.
- In alcune tabelle la chiave naturale è una buona chiave.
- In alcune tabelle non esiste alcuna chiave naturale o non è una buona chiave.
Nel caso 1 dovresti utilizzare la chiave naturale .
In caso 2 dovresti utilizzare una chiave
"Ogni PK deve essere naturale" è un approccio sbagliato e impossibile da raggiungere. Questa è una posizione estrema , ma nessuno la propone.
"Ogni PK deve essere surrogato" è un approccio sbagliato, ma purtroppo realizzabile. Questa è anche una posizione estrema.
Usa naturale quando si adatta allo stato naturale e usa surrogato quando non lo fa .
Il "ogni PK deve essere surrogato" l'approccio porta a molti mal di testa:
-
La migrazione dei dati da un database a un altro è un incubo poiché i surrogati sono sequenze che non sono sincronizzate tra i database.
- I dati sono significativi solo se visualizzati attraverso l'applicazione "the", assumendo un "un paradigma di applicazione - > un database"
-
Le query sono più complesse perché devi unirti a tutte le tabelle dalla tabella più in alto (solo dove è presente la chiave aziendale, fino all'ultima tabella).
-
Gli uomini d'affari parlano gli affari , sanno che una targa di auto è ADFG 237, non sanno che l'auto ha l'ID 155201 nel tavolo dell'auto. Gli incontri con gli utenti / gli uomini d'affari diventano scomodi perché continui a parlare di chiavi che non conoscono e continuano a parlare delle chiavi aziendali che conoscono.
- Gli utenti continueranno a utilizzare la chiave naturale per le ricerche, ovvero dovrai comunque mantenere la chiave naturale indicizzata.
-
Interoperation con qualsiasi sistema esterno ha il sovraccarico di tradurre la chiave aziendale, come il codice LHR ISO / universaly accettato per London Heatrow Airport, nella chiave senza significato surrogato.
Chi difende il "ogni PK deve essere surrogato" l'approccio di solito discute rispetto ai caratteri è inefficiente per i join. Beh, forse era un decennio fa, e loro non riescono a produrre numeri per supportarlo.
Inoltre sostengono il problema di aggiornamento quando la chiave naturale cambia. Se la chiave naturale cambia frequentemente, allora è non una buona chiave . Se cambia ogni dieci anni , questo è ciò che aggiornamento a cascata è incorporato in RDBMS moderno .
Inoltre, qualsiasi problema di prestazioni ipotetiche dell'uso delle chiavi dei caratteri può essere risolto gettandogli dei soldi.
Ma i problemi legati all'utilizzo del "ogni PK devono essere un approccio surrogato" , non possono essere risolti gettando loro denaro.
Si prega di qualcuno di produrre qualsiasi testo canonico o bibliografia che supporti il punto "ogni FK deve essere surrogato". D'altra parte, l'approccio "misto", "surrogati quando necessario" è ben documentato. E le forme normali di Codd esistono ancora.
Il mio suggerimento:
-
Utilizza le chiavi naturali dove ne esiste una abbastanza buona.
-
Utilizza surrogati quando non esiste una chiave naturale sufficientemente buona.
MODIFICA: alcuni dicono che "ogni PK deve essere surrogato" è una decisione di implementazione, e quindi non viola 3NF e 3NFBC, ma li include prima dall'inizio del design, nella fase concettuale, violando 3NF e 3NFBC, che è un errore che viene pagato scrivendo molto più codice del necessario.