Suppongo che tu stia parlando di vincoli di chiave esterna applicati dal database . Probabilmente stai già usando chiavi esterne, semplicemente non l'hai detto al database.
Supponiamo che un programmatore lo stia già facendo nel modo giusto, allora abbiamo davvero bisogno del concetto di chiavi esterne?
Teoricamente no. Tuttavia, non c'è mai stato un software senza bug.
I bug nel codice dell'applicazione in genere non sono così pericolosi: identifichi il bug e lo risolvi, dopodiché l'applicazione funziona di nuovo senza problemi. Ma se un bug consente ai dati in corso di esecuzione di entrare nel database, allora sei bloccato! È molto difficile ripristinare i dati danneggiati nel database.
Considera se un bug sottile in FogBugz ha consentito la scrittura di una chiave esterna corrotta nel database. Potrebbe essere facile correggere il bug e inviare rapidamente la correzione ai clienti in una versione di correzione di bug. Tuttavia, come dovrebbero essere corretti i dati corrotti in dozzine di database? Corretta codice potrebbe ora interrompersi improvvisamente perché i presupposti sull'integrità delle chiavi esterne non sono più validi.
Nelle applicazioni web in genere hai un solo programma che parla al database, quindi c'è solo un posto in cui i bug possono danneggiare i dati. In un'applicazione aziendale potrebbero esserci diverse applicazioni indipendenti che parlano allo stesso database (per non parlare delle persone che lavorano direttamente con la shell del database). Non c'è modo di essere sicuri che tutte le applicazioni seguano gli stessi presupposti senza bug, sempre e per sempre.
Se i vincoli sono codificati nel database, la cosa peggiore che può accadere con i bug è che all'utente viene mostrato un brutto messaggio di errore su alcuni vincoli SQL non soddisfatti. Questo è molto preferibile al lasciare che i dati correnti entrino nel database aziendale, dove a sua volta interromperà tutte le tue applicazioni o porterà semplicemente a tutti i tipi di output errati o fuorvianti.
Oh, e anche i vincoli di chiave esterna migliorano le prestazioni perché sono indicizzati per impostazione predefinita. Non riesco a pensare a nessun motivo per non utilizzare vincoli di chiave esterna.