Devo menzionare i problemi con DRY nel mondo dei database relazionali. I database sono progettati per funzionare rapidamente e bene utilizzando la logica basata su set e tramite query di grandi dimensioni. I principi DRY spesso inducono lo sviluppatore a scrivere query non Sargable o utilizzare la logica Row-by-agonizing-Row per sfruttare il codice esistente in più situazioni. DRY e l'ottimizzazione delle prestazioni sono spesso in contrasto e nel mondo del database, le prestazioni sono generalmente molto più critiche della manutenibilità. Questo non significa che non dovresti assolutamente usare i principi DRY, ma solo che devi essere consapevole di come influenzerà l'usabilità complessiva del database. Gli sviluppatori di applicazioni si asciugano per primi e le prestazioni in secondo luogo, gli sviluppatori del database pensano prima l'integrità dei dati, le prestazioni in secondo luogo, la sicurezza dei dati in terzo luogo (le prestazioni e la sicurezza potrebbero scambiare posizioni in alcuni sistemi).
Ho notato in generale che più strati di astrazione vengono inseriti nelle query del database, più lentamente diventano. Non sto dicendo che non desideravo che le persone che progettavano i programmi di basi di dati stesse non avessero fatto un lavoro migliore nel consentire agli sviluppatori di usare DRY senza influire sulle prestazioni del database, ma non progetto software di database a quel livello , quindi forse il conflitto tra astrazione e prestazioni nel database è più difficile da risolvere di quanto suppongo. Tuttavia, dobbiamo lavorare con i sistemi così come sono attualmente costruiti. Possiamo chiedere una migliore implementazione dei principi DRY nelle versioni future che non uccideranno anche le prestazioni (e è migliorata negli anni ma è ancora problematica), ma nel frattempo dobbiamo considerare se DRY è la mossa giusta per questo database A quest'ora.
Ma spesso le stesse funzionalità che si desidera utilizzare per garantire il rispetto del principio DRY sono quelle che causano enormi problemi al database. Non sto dicendo di non usare mai DRY ma non esagerare.
Esempi di cosa sto parlando. È necessario eseguire un'importazione di dati di un milione di record una volta al mese. I record possono già essere aggiunti manualmente tramite l'interfaccia utente chiamando un proc memorizzato. Questo proc, poiché è stato progettato per l'importazione di singoli record, aggiunge un solo record alla volta. Utilizzando DRY per evitare di inserire il codice di inserimento in due punti, si scrive un cursore per chiamare ripetutamente il proc anziché scrivere le importazioni basate su set necessarie. Il tempo per l'importazione va dai 30 minuti che impiegherebbe usando la logica basata su set a 18 ore. Ora il modo giusto di aderire a DRY in questo caso sarebbe quello di riparare il proc per gestire le importazioni di record mulitple. Sfortunatamente, è spesso impossibile o molto difficile inviare un array a un proc (a seconda del back-end db) e cambiando il proc, si finisce per rompere l'applicazione.
Le funzioni scalari e le funzioni con valori di tabella vengono utilizzate anche per implementare i principi DRY e, di nuovo, possono influenzare seriamente le prestazioni, soprattutto se è necessario utilizzarle in modo da impedire che gli indici siano utili.
Le viste sono buone anche per l'implementazione di DRY. Tuttavia, se si implementa DRY attraverso l'uso di viste che richiamano viste che richiamano altre viste, si arriva rapidamente al punto in cui le query scadranno sotto carico. In effetti potresti finire con la necessità di generare set di dati di milioni di record quando ne hai bisogno solo tre alla fine. Pertanto, una vista a un livello di un insieme complesso di join per l'implementazione di DRY può essere eccellente (ne ho uno io stesso che utilizziamo per assicurarci che tutti i report finanziari utilizzino lo stesso set di tabelle e calcoli di base), più di due livelli e devi considerare se stai creando un pasticcio di prestazioni.