Né SQL né il modello relazionale sono disturbati da chiavi esterne che fanno riferimento a una chiave naturale. In effetti, fare riferimento a chiavi naturali spesso migliora notevolmente le prestazioni. Saresti sorpreso di quanto spesso le informazioni di cui hai bisogno siano completamente contenute in una chiave naturale; facendo riferimento a tale chiave viene scambiato un join per una tabella più ampia (e di conseguenza riduce il numero di righe che è possibile memorizzare in una pagina).
Per definizione, le informazioni di cui hai bisogno sono sempre completamente contenute nella chiave naturale di ogni tabella "lookup". (Il termine tabella di ricerca è informale. Nel modello relazionale, tutte le tabelle sono solo tabelle. Una tabella di codici postali statunitensi potrebbe avere righe simili alle seguenti: {AK, Alaska}, {AL, Alabama}, {AZ, Arizona} , ecc. La maggior parte delle persone chiamerebbe questa tabella di ricerca.)
Sui sistemi di grandi dimensioni, non è insolito trovare tabelle con più chiavi candidate. Inoltre, non è insolito che le tabelle che servono una parte dell'azienda facciano riferimento a una chiave candidata e le tabelle che servono un'altra parte dell'azienda facciano riferimento a una chiave candidata diversa. Questo è uno dei punti di forza del modello relazionale ed è una parte del modello relazionale che SQL supporta abbastanza bene.
Incontrerai due problemi quando fai riferimento a chiavi naturali in tabelle che hanno anche una chiave surrogata.
Innanzitutto, sorprenderai le persone. Anche se di solito faccio pressioni per il Principio della minima sorpresa , questa è una situazione in cui non mi dispiace sorprendere le persone. Quando il problema è che gli sviluppatori sono sorpresi dall'uso logico di chiavi esterne, la soluzione è l'educazione, non la riprogettazione.
In secondo luogo, gli ORM non sono generalmente progettati attorno al modello relazionale e talvolta incarnano ipotesi che non riflettono le migliori pratiche. (In effetti, spesso sembrano essere progettati senza mai avere input da un professionista del database.) La richiesta di un numero ID in ogni tabella è una di quelle ipotesi. Un altro presuppone che l'applicazione ORM "possieda" il database. (Quindi è libero di creare, eliminare e rinominare tabelle e colonne.)
Ho lavorato su un sistema di database che ha fornito dati a centinaia di programmi applicativi scritti in almeno due dozzine di lingue per un periodo di 30 anni. Tale database appartiene all'azienda, non a un ORM.
Una forcella che introduce cambiamenti di rottura dovrebbe essere un punto fermo.
Ho misurato le prestazioni con chiavi sia naturali sia surrogate presso un'azienda in cui lavoravo. C'è un punto di non ritorno in cui le chiavi surrogate iniziano a sovraperformare le chiavi naturali. (Supponendo che nessuno sforzo aggiuntivo per mantenere elevate le prestazioni delle chiavi naturali, come il partizionamento, gli indici parziali, gli indici basati su funzioni, i tablespace aggiuntivi, l'utilizzo di dischi a stato solido, ecc.) Secondo le mie stime per quella società, raggiungeranno quel punto di svolta in circa 2045. Nel frattempo, ottengono prestazioni migliori con tasti naturali.
Altre risposte pertinenti: In Confusione dello schema del database