Nella mia esperienza, molti dei progetti che ho letto in passato non avevano definizioni di relazioni nel database, ma li definivano solo nel codice sorgente. Quindi mi chiedo quali sono i vantaggi / gli svantaggi della definizione delle relazioni tra le tabelle nel database e nel codice sorgente? E la domanda più ampia riguarda altre funzionalità avanzate nei database moderni come cascata, trigger, procedure ... Ci sono alcuni punti nei miei pensieri:
Nel database:
Dati corretti dalla progettazione. Prevenire errori dell'applicazione che possono causare dati non validi.
Ridurre il round trip di rete all'applicazione quando si inseriscono / aggiornano i dati poiché l'applicazione deve eseguire più query per verificare l'integrità dei dati.
Nel codice sorgente:
Più flessibile.
Meglio quando si esegue il ridimensionamento su più database, poiché a volte la relazione può essere tra database.
Maggiore controllo sull'integrità dei dati. Il database non deve controllare ogni volta che l'applicazione modifica i dati (la complessità può essere O (n) o O (n log n) (?)). Invece, è delegato all'applicazione. E penso che la gestione dell'integrità dei dati nell'applicazione porterà a messaggi di errore più dettagliati rispetto all'utilizzo del database. Ad esempio: quando si crea un server API, se si definiscono le relazioni nel database e qualcosa va storto (come se l'entità a cui si fa riferimento non esiste), si otterrà un'eccezione SQL con un messaggio. Il modo semplice sarà di restituire 500 al client che esiste un "Errore interno del server" e il client non avrà idea di cosa non vada. Oppure il server può analizzare il messaggio per capire cosa c'è che non va, che secondo me è un modo brutto e soggetto a errori. Se lasci che l'applicazione gestisca questo,
C'è niente altro?
Modifica: come sottolinea Kilian, il mio punto su prestazioni e integrità dei dati è molto fuorviante. Quindi ho modificato per correggere il mio punto lì. Capisco perfettamente che lasciare che il database lo gestisca sarà un approccio più efficiente e solido. Controlla la domanda aggiornata e riflettici.
Modifica: grazie a tutti. Le risposte che ho ricevuto sottolineano che i vincoli / le relazioni dovrebbero essere definiti nel database. :). Ho un'altra domanda, poiché è al di fuori dell'ambito di questa domanda, l'ho appena pubblicata come domanda separata: gestire l'errore del database per il server API . Si prega di lasciare alcune intuizioni.