Sfondo
L'approccio "all-PK-must-be-surrogates" non è presente nel modello relazionale di Codd o in qualsiasi standard SQL (ANSI , ISO o altro).
Anche i libri canonici sembrano eludere queste restrizioni.
Lo schema del dizionario dei dati di Oracle utilizza le chiavi naturali in alcune tabelle e le chiavi surrogate in altre tabelle. Lo dico perché queste persone devono sapere una cosa o due sulla progettazione di RDBMS.
PPDM (Professional Petroleum Data Management Association) consiglia gli stessi libri canonici:
Utilizza le chiavi surrogate come chiavi primarie quando:
- Non ci sono chiavi naturali o commerciali
- Le chiavi naturali o commerciali sono cattive (cambiano spesso)
- Il valore della chiave naturale o aziendale non è noto al momento dell'inserimento del record
- Le chiavi naturali a più colonne (in genere diverse FK) superano tre colonne, il che rende i join troppo prolissi.
Inoltre non ho trovato la fonte canonica che dice che le chiavi naturali devono essere immutabili. Tutto quello che trovo è che devono essere molto stabili, cioè devono essere cambiate solo in rare occasioni, se mai.
Cito PPDM perché queste persone devono conoscere una o due cose sulla progettazione di RDBMS.
Le origini dell'approccio "all-surrogates" sembrano venire dalle raccomandazioni di alcuni framework ORM.
È vero che l'approccio consente la modellazione rapida del database non dovendo eseguire molte analisi aziendali, ma a discapito della manutenibilità e della leggibilità del codice SQL. Si fa molta previsione per qualcosa che potrebbe accadere o meno in futuro (il PK naturale è cambiato, quindi dovremo utilizzare la funzionalità di aggiornamento a cascata RDBMS) a scapito delle attività quotidiane, come dover unire più tavoli in ogni interrogare e scrivere codice per importare i dati tra i database, una procedura altrimenti molto veloce (a causa della necessità di evitare le colisioni PK e di dover creare tabelle stage / equivalence in anticipo).
Un altro argomento è che gli indici basati su numeri interi sono più veloci, ma che devono essere supportati con benchmark. Ovviamente, i varchar lunghi e variabili non sono buoni per PK. Ma gli indici basati su varchar di breve durata sono quasi altrettanto veloci degli interi.
Le domande
- Esiste una fonte canonica che supporta l'approccio "all-PK-must-be-surrogates"?
- Il modello relazionale di Codd è stato sostituito da un modello relazionale più recente?