Nella mia esperienza, molti dei progetti che ho letto in passato non avevano definizioni di relazione nel database, ma li hanno solo definiti nel codice sorgente. Quindi mi chiedo quali sono i vantaggi / svantaggi della definizione delle relazioni tra le tabelle nel database e nel codice sorgente? E la domanda più ampia riguarda altre funzionalità avanzate in database moderni come cascade, trigger, procedure ... Ci sono alcuni punti nei miei pensieri:
Nel database:
-
Correggi i dati dalla progettazione. Previene gli errori dell'applicazione che possono causare dati non validi.
-
Riduci il giro di andata e ritorno della rete all'applicazione quando inserisci / aggiorna i dati poiché l'applicazione deve fare più query per verificare l'integrità dei dati.
Nel codice sorgente:
-
Più flessibile.
-
È meglio quando si ridimensiona su più database, poiché a volte la relazione può essere cross-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 più messaggi di errore 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 l'entità referenziata non esiste), si otterrà un'eccezione SQL con un messaggio. Il modo semplice sarà di restituire 500 al client che c'è un "Errore interno del server" e il client non avrà idea di cosa stia andando storto. Oppure il server può analizzare il messaggio per capire cosa c'è che non va, che è un modo brutto e soggetto a errori secondo me. Se lasci che l'applicazione gestisca questo, il server può generare un messaggio più significativo per il client.
C'è qualcos'altro?
Modifica: come sottolinea Kilian, il mio punto sulle prestazioni e l'amp; l'integrità dei dati è molto fuorviante. Così ho modificato per correggere il mio punto lì. Capisco perfettamente che lasciare che sia il database a gestirlo sarà un approccio più efficiente e robusto. Si prega di verificare la domanda aggiornata e dare qualche idea a riguardo.
Modifica: grazie a tutti. Le risposte che ho ricevuto sottolineano che i vincoli / relazioni dovrebbero essere definiti nel database. :). Ho ancora una domanda, dato che è alquanto fuori dalla portata di questa domanda, l'ho appena postata come una domanda separata: Gestire l'errore del database per il server API . Si prega di lasciare alcuni approfondimenti.