Quando rivedo i modelli di database per RDBMS, di solito sono sorpreso di trovare piccoli o nessun vincolo (a parte PK / FK). Ad esempio, la percentuale viene spesso memorizzata in una colonna di tipo int
(mentre tinyint
sarebbe più appropriato) e non vi è alcun CHECK
vincolo per limitare il valore all'intervallo 0..100. Analogamente su SE.SE, le risposte che suggeriscono che i vincoli di controllo ricevono spesso commenti che suggeriscono che il database è il posto sbagliato per i vincoli.
Quando chiedo della decisione di non implementare i vincoli, i membri del team rispondono:
Né che nemmeno sanno che tali funzionalità esistono nel loro database preferito. È comprensibile dai programmatori che utilizzano solo ORM, ma molto meno dai DBA che dichiarano di avere più di 5 anni di esperienza con un determinato RDBMS.
O che impongono tali vincoli a livello di applicazione e duplicare tali regole nel database non è una buona idea, violando SSOT.
Più recentemente, vedo sempre più progetti in cui non vengono utilizzate nemmeno le chiavi esterne. Allo stesso modo, ho visto alcuni commenti qui su SE.SE che mostrano che agli utenti non interessa molto l'integrità referenziale, lasciando che l'applicazione li gestisca.
Quando chiedono ai team la scelta di non usare gli FK, dicono che:
È PITA, ad esempio quando si deve rimuovere un elemento a cui si fa riferimento in altre tabelle.
NoSQL oscilla e non ci sono chiavi esterne lì. Pertanto, non ne abbiamo bisogno in RDBMS.
Non è un grosso problema in termini di prestazioni (il contesto è in genere applicazioni Web Intranet di piccole dimensioni che lavorano su set di dati di piccole dimensioni, quindi, anche gli indici non contano troppo; a nessuno importa se le prestazioni di una determinata query passano da 1,5 s . a 20 ms.)
Quando guardo l'applicazione stessa, noto sistematicamente due schemi:
L'applicazione disinfetta correttamente i dati e li controlla prima di inviarli al database. Ad esempio, non è possibile archiviare un valore
102
come percentuale nell'applicazione.L'applicazione presuppone che tutti i dati che provengono dal database siano perfettamente validi. Cioè, se
102
arriva in percentuale, o qualcosa, un posto andrà in crash o verrà semplicemente visualizzato come è per l'utente, portando a situazioni strane.Mentre oltre il 99% delle query viene eseguito da una singola applicazione, nel tempo iniziano a comparire gli script, sia script eseguiti manualmente quando necessario, sia cron job. Alcune operazioni sui dati vengono eseguite anche manualmente sul database stesso. Sia gli script che le query SQL manuali hanno un rischio elevato di introdurre valori non validi.
Ed ecco che arriva la mia domanda:
Quali sono i motivi per modellare i database relazionali senza vincoli di controllo e infine anche senza chiavi esterne?
Per quel che vale, questa domanda e le risposte che ho ricevuto (in particolare l'interessante discussione con Thomas Kilian) mi hanno portato a scrivere un articolo con le mie conclusioni sull'argomento dei vincoli del database .