Penso che la domanda riguardi la responsabilità della qualità dei dati.
La risposta dipende da come vedi il sistema.
Se vedi il database come un servizio indipendente, distinto e autonomo separato dall'applicazione, allora il database è responsabile di garantire la coerenza e la qualità dei dati che contiene. Essenzialmente perché quel database potrebbe essere utilizzato da un'applicazione diversa, quindi non può fare affidamento su quella seconda applicazione che ha la stessa coerenza e comportamenti di qualità. In queste circostanze, il database deve essere progettato per esporre un'API e un comportamento autonomo. In questa vista ci sono almeno due applicazioni, una è il database e l'altra è l'applicazione che lo utilizza.
Al contrario, il database potrebbe essere considerato una forma complicata di file che è sotto il controllo diretto e totale dell'applicazione. In questo senso il database si trasforma in un semplice strumento di serializzazione e navigazione dei documenti. Può fornire alcuni comportamenti avanzati per supportare le query e la manutenzione dei documenti (come fanno gli strumenti JSON o XML), ma non è necessario (come la maggior parte dei flussi di file). In questo caso è puramente responsabilità dei programmi mantenere il formato e il contenuto corretti all'interno del file. In questa vista esiste un'applicazione.
In entrambe le visualizzazioni, la domanda successiva è come supportare l'utilizzo del database come file di fantasia o come servizio separato. Puoi raggiungere questo obiettivo:
- utilizzando gli strumenti che la piattaforma di database fornisce sotto forma di tabelle / viste / stored procedure / trigger / ecc ...
- avvolgendo il database stesso all'interno di un servizio che tutti i client devono utilizzare per accedere al database
- avvolgendo il database in una libreria che deve essere utilizzata da tutti i client per accedere ai dati.
Ognuno ha i suoi pro / contro e dipenderà dai vincoli architetturali dell'ambiente all'interno del quale il sistema opera.
Indipendentemente da quale vista si prenda, è sempre importante convalidare i dati ai confini.
- Convalida i campi su un'interfaccia utente immessa da un utente
- Convalida la richiesta di rete / API prima che lasci il client
- Convalida la richiesta di rete / API nel server prima di fare qualsiasi cosa
- Convalida i dati passati nelle regole aziendali
- Convalida i dati prima di persistere
- Convalida i dati dopo essere stati recuperati dalla persistenza
- così via e così via
La quantità di convalida garantita su ciascun confine dipende da quanto sia rischioso non convalidarla.
- moltiplicando due numeri insieme?
- ottieni il numero sbagliato è un problema?
- invocare una procedura in una determinata posizione di memoria?
- Cosa c'è in quella posizione di memoria?
- Cosa succede se l'oggetto non esiste o è in cattivo stato?
- usando una regex su una stringa contenente kanji?
- Il modulo regex può gestire unicode?
- Il regex può gestire unicode?
However, why not perform validation of data on the application side before storing them into the database?
bene, questi due non si escludono a vicenda. È probabile che tu convalidi cose diverse su entrambi i lati. Mentre le convalide sul lato dell'applicazione sono incentrate sul business, le convalide sul database sono più incentrate sui dati. Pensa in un database alimentato da diverse e diverse applicazioni.