Data Access Layer vs Stored Procedure?

Il post sulle "superfici di contatto" ha avuto diversi feedback (speravo di più ad esser sincero...si parla parecchio di metodologie di sviluppo qui si UGIdotNET e quindi pensavo che l'argomento interessase ai più...boh), ed ha riportato in auge il dilemma "meglio un data access layer o delle procedure sul database tipo stored procedure?".

Beh, io qui dico la mia, sperando ancora un volta in un ampio feedback in modo da metter sul tavolo un pò di argomenti di discussione interessanti.

La mia idea è che non ci può essere un vincitore a questa domanda. Nessuna delle due opzioni è meglio dell'altra in senso stretto. Devono essere applicate tutte e due se possibile.

Dando per scontato che lo sviluppo di un data access layer è sempre ben visto, il problema è unicamente capire se, quando e come utilizzare degli oggetti di programmazione che stanno *sul* database. Normalmente non si utilizzano gli strumenti di programmazione messi a disposizione del DB (e con questo termine intendo Stored Procedure, Funzioni, Viste e via dicendo) perchè si desidera far si che l'applicazione che si sta sviluppando possa andare bene su qualsiasi database, anche un "semplice" flat-file.

Benissimo, l'idea è corretta...però quello che non mi piace è che quindi devo utilizzare SQL Server, ORACLE ecc ecc come se fossere un flat file. Non mi sembra il massimo dell'efficienza...anzi, per dirla tutta mi sembra di aver buttato via i soldi.

Ovviamente la prima osservazione a quanto detto riguarda la gestione delle transazioni e quindi il supporto delle proprietà ACID, nonchè le facilities di backup, amministrazione e via dicendo.

L'idea si sposta quindi a fare un qualcosa che funzioni bene sia su SQL, che su ORACLE che su DB2 ecc. ecc. Perfetto. Ma se cosi vogliamo dobbiamo rifarci obbligatoriamente all'ANSI SQL Standard, dicendo addio a feature interessanti come, ad esempio, i campi incrementali, e le varie peculiarità di ogni database. Dovrei quindi svilupparmi io un meccanismo per la generezione degli ID delle chiavi primarie (visto che non è sempre possibile, anzi quasi mai, utilizzare come chiavi primare delle chiavi naturali).
Ok, è un pò di fatica in più ma si può fare.

Ma per quanto riguarda il mantenimento dell'integrità sui dati? Dovrei svilupparmi anche quello. E per ciò che concerne la sicurezza? Dovrei svilupparmi anche quello.

Bene...alla fine che cosa ho creato? Un mio personale, piccolo RDBMS! Sicuramente un lavoro di cui essere orgogliosi ma....assolutamente necessario? Secondo me no.

Io avrei adottato (e adotto) questa strategia: creo un data access layer che, tramite il pattern Abstract Factory mi permette di creare tanti piccoli Data Access Layer specializzati per il database alla quale si rivolgono, ed di ognuno di questi utilizzo il massimo delle feature che mi vengono fornite. In questo modo ho un sistema che, anche se non è inizialmente compatibile con tutti i database lo può facilmente diventare, e, allo stesso tempo, so che sfrutterà al massimo ogni tecnologia che mi viene messa a disposizione.

Oltre al "semplice" sfruttamento efficiente della tecnologia degli RDBMS si ottiene anche un grande beneficio: quello di rendere in una certa misura indipendente il mio DAL dallo schema fisico del database. Anche sul database si può effettuare del refactoring...e sarebbe seccante se, dovendo cambiare leggermente lo schema in modo da ottenere un design migliore (magari per uno scopo esterno alla mia applicazione...ad esempio la generazione di un report con i Reporting Services), sia *obbligatorio* anche modificare il DAL. Certo, potrebbe essere una buona idea modificare anche il DAL per assecondare il cambiamento dello schema, ma dal mio punto di vista non deve essere una scelta obbligata.

Concludo dicendo che il tutto deriva dalla mia personale esperienza, ossia lo sviluppo di applicazioni web per intranet, extranet ed internet, che quindi non sono praticamente mai isolate ma devono prima o poi convivere e collaborare con altri sistemi. Credo che da altri punti di vista (lo sviluppo di pacchetti software ad esempio), quello che ho appena detto potrebbe non essere così condivisibile. E' per questo che sono interessato ai feedback. Per capire altre realtà. 

Print | posted on martedì 1 febbraio 2005 8.28

Feedback

# re: Data Access Layer vs Stored Procedure?

Left by Daniele Proietti at 01/02/2005 8.46
Gravatar Davide, che cosa dovrei dire.... praticamente lavoro allo stesso modo (ovviamente quando non ho specifici vincoli di progetto imposti dal cliente), quindi non puoi che trovarmi d'accordo su tutto.
Personalmente ritengo che su ogni database debbano essere sfruttate al massimo tutte le potenzialità per ottenere il massimo delle prestazioni possibili, quindi via libera all'uso di SP, viste e di tutti gli strumenti messi a disposizione; dal punto di vista applicativo invece l'utilizzo di una Server Factory permette l'integrazione di più database; certo ci vuole un poco di lavoro in più ma penso che il risultato ne valga la pena.

Ripeto .... sono d'accordo su tutto

# re: Data Access Layer vs Stored Procedure?

Left by Michele Lorizzo at 01/02/2005 9.00
Gravatar Sono daccordo anche io su tutte le argomentazioni ... a patto che non si spostino sul DB le regole di business (e, ripeto, nella smania di 'SPOSTIAMO TUTTO SUL DB !!' l'ho visto fare).

Per il resto ha solo vantaggi.

Un vantaggio non indifferente si ha quando il DB è condiviso tra applicazioni differenti (o moduli della stessa applicazione) magari scritti con tecnologie diverse e forse alcuni legacy.
Tutti dovrebbero passare dallo stesso DAL (o così dovrebbe essere) ... per esperienza posso dire che non è semplice 'allineare' in questo senso diversi gruppi di lavoro. La cosa peggiore è che codice simile venga duplicato in DAL differenti o peggio che ognuno scelga la sua tecnica : un bel pasticcio !!!

Forse solo quando il motore RDBMS non ha rilevanza tecnologica (JET o simili indifferentemente) si può scegliere di utilizzare il DAL.

# re: Data Access Layer vs Stored Procedure?

Left by Andrea Boschin at 01/02/2005 9.31
Gravatar Anche io non posso che essere daccordo. Per assunzione, ormai da svariati anni non interrogo più il database facendo uso diretto di statement SQL. tutto passa attraverso SP. Questo più di qualche volta mi ha permesso ad esempio di intervenire sulla struttura dei dati senza modificare una sola linea di codice applicativo. Ovviamente il tutto è "filtrato" da uno strato di astrazione del database che permette di sostituire agevolmente il database riscrivendo solamente la parte più bassa, limitatamente ai metodi di accesso ai dati.

# re: Data Access Layer vs Stored Procedure?

Left by Gianluca Carucci at 01/02/2005 9.35
Gravatar Quoto la frase che secondo me è il succo di tutto il tuo post: "Concludo dicendo che il tutto deriva dalla mia personale esperienza". La stessa frase è stata usata anche da Fowler nell'introduzione del libro "Pattern of Enterprise Application".
Tra i vari pattern che illustra ci sono anche il Domain Model e il Table Data Gateway che permettono di ricreare un modello che disaccoppia l'applicazione dal db proprio come hai proposto tu.
Di solito si dice che 3 indizi fanno una prova. Ne manca uno.... Bhè nell'ultimo workshop Andrea (sessione Design Pattern) ha implementato la tua stessa tecnica... Ci siamo! 3 indizi->PROVA!!! APPROVATO!!!!

# re: Data Access Layer vs Stored Procedure?

Left by Simone Greci at 01/02/2005 9.46
Gravatar Presso la SH per cui lavoro questo argomento è emerso molte volte, creando delle piccole divisioni interne tra SQL Developers e OODs.
Negli ultimi tempi abbiamo adottato una strategia di sviluppo che si è dimostrata, secondo me, molto valida.
L'obbiettivo è stato di utilizzare il più possibile tutte quelle propietà intrinseche del db per ottenere l'integrità dei dati (referenziale e non).
Abbiamo quindi speso molto più tempo per il design del database implementando molte Foreign Keys e campi identity.
Tutti i nostri sforzi si sono concentrati su questi aspetti; uno strato di stored procedures molto semplici, "senza intelligenza", permettono al layer superiore di dialogare con le tabelle.
Lo strato superiore non è stato un vero e proprio data layer e non abbiamo applicato nessun particolare pattern. Siamo però riusciti ad ottenere ottimi risultati di performances sul database ed un alto grado di mantenibilità del codice.
La business logic è stato spostata all'interno del nostro data layer ed abbiamo lasciato al db altri tipi di compiti.

D'accordo quindi con Mauri...ma se parliamo di grosse integrazioni con sistemi legacy?

# re: Data Access Layer vs Stored Procedure?

Left by Michele Bernardi at 01/02/2005 10.06
Gravatar Per un'applicazione "windows" o comunque non strettamente legata al web penso in effetti che il bisogno dell'interoperabilità si senta meno e quindi si potrebbe essere tentati di "saltare" uno di questi due passi (DAL e SP) per velocizzare lo sviluppo! Beh, non succederà subito e non succederà sempre, ma prima o poi anche l'applicazione più insospettabile si troverà a dover esporre i propri dati o a dover migrare verso un DB server diverso e voi maledirete il giorno che che non avete sviluppato secondo questo "canone". (Parlo forse per esperienza?! )
Ora, concordo che questa metodologia sia decisamente la migliore, ma... Non vi siete rotti di scrivere ogni volta tutta questa NOIOSISSIMA parte di codice? D'altro canto devo dire che anche l'idea di affidarmi ad prodotto di terze parti che lo faccia per me, vuoi perché non ho ancora trovato quello giusto, vuoi perché poi alla fine non produce il codice come lo vorrei io, non mi garba proprio.
Ridendo e scherzando sono alla terza generazione dei miei generatori di codice per il DAL e non l'avevo ancora finita che già avevo idee per superare i sui limiti! Forse mi muovo "troppo agile", forse faccio troppa poca pianificazione all'inizio, forse dovrei fare una scorpacciata di libri sui pattern prima di partire, o forse soffro solo delle limitazioni del singolo programmatore con un'(in)esperienza troppo settoriale.
Mi piacerebbe che che ci confrontassimo anche su questo tema, ma a questo punto... NON DOVREMMO SPOSTARCI SUL WIKI?!

# re: Data Access Layer vs Stored Procedure?

Left by Alessandro Petrozzelli at 01/02/2005 11.57
Gravatar Sono "molto d'accordo" su tutto.
Pure sul fatto che ci vorrebbe qualcuno di buona volontà e abbastanza disciplinato da aprire una sezione sul wiki, dato che è un tema ricorrente e che accende gli animi più di altri...segno che la discussione può essere molto fertile.
Comunque ho un dubbio riguardo alla posizione della logica: come mai sembra essere diffuso il rifiuto verso una integrazione dentro il db?
Io sono dell'opinione che quando la logica è "strutturale" dovrebbe essere integrata nel database.
Per strutturale intendo la logica che modella dei presupposti sui quali si fonda il funzionamento globale dell'applicazione ad esempio la gestione degli stati...
Ai trigger ad esempio che ruolo è relegato?
Consentono di avere a che fare con un componente che "reagisce" attivamente agli eventi...e quindi contiene logica.
Poi come si concilia la logica dentro un assembly con client diversi da .NET? Penso ad esempio ad ambienti legacy con batch notturni preesistenti, o front-end web in Java...
In tutti questi casi è richiesta la duplicazione della logica? Dispendioso oltre che pericoloso.
O c'è qualcosa che mi sfugge?
Insomma sono ancora dubbioso sulla suddivisione delle responsabilità.

# re: Data Access Layer vs Stored Procedure?

Left by Alessandro Petrozzelli at 01/02/2005 12.17
Gravatar Mentre ero in bagno mi è balzata alla mente la definizione "ecosistema di applicazioni"...
L'ho sempre sostenuto che l'ambiente influenza la capacità di pensiero!

;-P

# re: Data Access Layer vs Stored Procedure?

Left by Maccari Claudio at 01/02/2005 21.28
Gravatar Anch'io dico la mia...
Sulla riduzione delle superfici di contatto io ci vedo bene viste e funzioni piuttosto che le sp perchè prima o poi si finisce per infilarci della logica che non dovrebbe stare lì.

Per quanto riguarda lo spreco delle potenzialità sono d'accordo perchè fare un DAL che operi sia su DB che su file è una gran cosa se ti serve ma in molti casi è del tutto inutile ed il prezzo da pagare è troppo elevato.Magari mi basta fare un DAL che va su qualche DB diverso ma sempre RDBMS è.
A questo punto qualcuno potrebbe insorgere dicendo che questo non segue alla lettera i pattern. Ok ma ogni pattern va seguito alla lettera ma adattato alle proprie esigenze/necessita (questo lo dice FOWLER non io).

# re: Data Access Layer vs Stored Procedure?

Left by Davide Mauri at 01/02/2005 21.58
Gravatar Ottimo! Grazie mille per i commenti che avete lasciato! Credo che la condivisione delle esperienze e delle proprie idee, come è avvenuto in questo caso, non possa essere che benefica per tutti, aiutandoci ad essere molto più coscienti e consapevoli delle decisioni architetturali da prendere, valutando in modo più obiettivo pro e contro di ogni cosa.

Sono molto contento del risulatato di questo post! Appena trovo un pò di tempo, mettero nel mia coda di finalizzazione la scrittura di una pagina in wiki sull'argomento!

# re: Data Access Layer vs Stored Procedure?

Left by Javier Luna at 24/05/2005 0.55
Gravatar I believe that any DataLayer must be a simple code block, that they allow operations against DB.

That code block would not have to know on the Business Entities. Single to specialize it is to execute the operations (Store Procedures and SQL Sentences) against the engine DB (SQL, Oracle, DB2, etc.), with which this setting.

Finally, I invite to you to download the DataLayer.Primitives Public Version.

This is very cool Data Layer :)

DataLayer.Primitives - Readme!
http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=1389

Cheers,

Javier Luna
http://guydotnetxmlwebservices.blogspot.com/

# re: Data Access Layer vs Stored Procedure?

Left by mauro at 27/11/2005 12.22
Gravatar concordo per i data layer specializzati , che adotto come soluzione universale da anni , sia nello sviluppo internet che gestionale. nella fattspecie ogni data layer implemnta una interfaccia comune che è 'unico oggetto visibile dal businness layer. questo vale sia come logica di connessione che come logica di funzionalità.
a parer mio però la difficoltà piu' grossa non è quella a livello progettuale e implementativo ma quella a livello umano: non è facile convincere e introdurre clienti , datori di lavoro e colleghi vari alla programmazione ad oggetti e , anche se ormai un po' tutti parlano di .net , la magior parte delle persone ragiona ancora dal punto di vista procedurale..
ciaoo

# Riguardo l'uso delle stored procedure

Left by .NET Tools Blog at 12/11/2006 0.46
Gravatar

# re: Data Access Layer vs Stored Procedure?

Left by SILENT KILLER at 18/06/2008 12.36
Gravatar العاب اطفالالعاب اطفال جميلة اجمل العاب الأطفال الفلاش العاب فلاش اطفال
العاب سياراتالعاب سيارات العاب سيارات فلاش جميلة عالم المغامرة والسباق والتحدي
العاب رياضيةالعاب رياضية العاب رياضة كرة قدم وتنس والعاب قوي عالم الألعاب الرياضية فلاش
العاب جميلة العاب جميلة جدا روعة العاب جميلة فلاش العاب فلاش جميلة
العاب كرتون نتوركالعاب كرتون نتورك اجمل العاب افلام الكرتون نتورك العاب فلاش كرتونية
العاب كمبيوترالعاب كمبيوتر فلاش العاب الكمبيوتر روعة اجمل العاب الكمبيوتر منتدي العاب
العاب اكس بوكسالعاب اكس بوكس اجمل العاب اكس بوكس العاب روعة اكس بوكس
العاب اكشنالعاب اكشن جديدة العاب اكشن فلاش مغامرات وقتال العاب فلاش
العاب قتالالعاب قتال خطيرة روعة العاب قتل وقتال فلاش
العاب حربيةالعاب حربية العاب حرب العاب قتال حرب العاب فلاش
العاب ذكاءالعاب ذكاء جميلة قم بالتحدي العاب ذكاء تحتاج الي التركيز الشديد اجمل العاب ذكاء
العاب ديزنيالعاب ديزني عالم والت ديزني العاب فلاش العاب كرتون ديزني
العاب بلاي ستيشنالعاب بلاي ستيشن العاب بلاي ستيشن روعة تمتع بأجمل العاب بلاي ستيشن
العاب نايتندو ويالعاب نايتندو وي اجمل العاب نايتندو وي جميلة تمتع بألعاب نايتندو وي
العاب ديكورالعاب ديكور جديدة العاب ديكور البنات اجمل العاب ديكور
العاب باربيالعاب باربي البنت الجميلة باربي العاب فلاش باربي اجمل العاب باربي
العاب مكياجالعاب مكياج اجمل العاب مكياج بنات تزيين بنات روعة
العاب طبخالعاب طبخ العاب فلاش طبخ طهي العاب روعة فلاش

as
Comments have been closed on this topic.

Copyright © Davide Mauri

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski