posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Persistenza e database

Un progetto la cui architettura sta emergendo in questi giorni, ha evidenziato una problematica ricorrente che riguarda la necessità o meno di strutturare i dati in modo relazionale nel database.
Per evitare di farla troppo lunga, partiamo da un esempio. Diciamo quindi di avere un modulo di una applicazione che deve eseguire del logging sulle attività svolte da un utente all'interno di un sito.

L'attività da loggare è ha un inizio, i dati da loggare cambiano a seconda di come opera l'utente nell'applicazione, termina quando l'utente ha completato un determinato task, il log deve essere cancellato dopo un certo tempo perché lo storico non sia eccessivo e per rispettare la privacy.

Il database è lo strumento ideale per mantenere questi dati? Se consideriamo il modo "classico" di gestione del database la mia risposta è no.

Facciamo un passo indietro e domandiamoci perché si sceglie il database. I motivi in cima alla lista sono: gestione "gratis" della concorrenza nell'accesso ai dati, ottime performance nella ricerca dei dati, capacità di relazionare set di dati eterogenei, etc.
Ma nel nostro esempio cosa ci serve di tutto ciò? Più che altro ci serve la gestione della concorrenza per cui sarebbe da pazzi eseguire la persistenza su un file xml.

Quale altra tecnologia ci permette di rispondere a quelle domande per lo specifico problema in esempio? Workflow Foundation non solo risponde a questi requisiti ma semplifica di parecchio lo sviluppo della soluzione:

  • Alla crezione del nuovo log, viene creato una nuova istanza di workflow
  • Dalla versione 4.0 possiamo gestire la logica del nostro esempio di logging (e i relativi dati) secondo una Flowchart, cosa particolarmente familiare a qualsiasi developer, quindi meno prona ad errori.
  • I workflow possono essere "long-running" e sarà l'engine a gestirne la persistenza sul "media" che il developer ha stabilito. La persistenza può anche finire in un blob così come su un db relazionale. Il tutto è "nascosto" all'applicazione e come ogni disaccoppiamento questo è un grosso beneficio.
  • L'avanzamento dell'attività dell'utente si ottiene dall'object model di Workflow, anche da una applicazione esterna di amministrazione. A partire dalla versione 4.0 ci sono anche gli strumenti già pronti come la dashboard di "Dublin".
  • Il workflow può avere come ultimo stadio una "Sleep" di 2 mesi e poi decidere di cancellare la persistenza. Quei due mesi non sono altro che un blob posteggiato da qualche parte. In memoria non c'è nulla ma il runtime sa che, tascorso quel tempo, deve riattivare quell'istanza e farla proseguire. Il suo ultimo stadio è quello della cancellazione dello storico.

In sostanza basta disegnare graficamente il workflow, oops flowchart,  (magari dopo aver sviluppato delle adeguate custom activity) e dirgli che ci serve il servizio di persistenza, e il gioco è fatto.

Magari abbiamo configurato la persistenza di WF su un db relazionale, o magari abbiamo usato Table o Blob di Windows Azure, ma quel che più importa è che non abbiamo disegnato un db, non abbiamo scritto query o sp, non abbiamo un datalayer per questa specifica parte dell'applicazione.

Ovviamente il concetto è trasportabile anche a molti altri esempi ma non è generalizzabile anche se ritengo che l'abitudine ad usare il db per tutta la persistenza nasconda soluzioni più brillanti.

Print | posted on lunedì 21 dicembre 2009 20:48 |

Feedback

Gravatar

# re: Persistenza e database

Ottimo esempio di come a volte la persistenza possa far "esplodere" il design di un sistema. Penso che la questione riguardi più un fatto, come dire, mentale nell'approccio al problema, dando per scontato, quasi sempre, che il db sia l'unico oggetto, giusto o sbagliato che sia, da usare per la persistenza.

Bisogna allenare la mente :)
22/12/2009 11:20 | Tommaso Caldarola
Gravatar

# re: Persistenza e database

Quanta voglia di usare tecnologie ancora in beta... Auguri! :-)
22/12/2009 12:17 | AlessandroD
Gravatar

# re: Persistenza e database

@Tommaso. "Allenare la mente" ... ah quanto è vero, troppo spesso la gente si siede su vecchi concetti che si sgretolano.

@AlessandroD. Non si usano solo perché sono in beta, si usano se servono.
Le provi e se ti fanno risparmiare tempo, le usi.
L'ho fatto spesso in passato, per esempio ho usato WPF e WCF in beta, ma non mi sono fidato di EntityV1 o di Sliverlight V1 e il tempo mi ha dato ragione.
22/12/2009 13:29 | Raffaele Rialdi
Gravatar

# re: Persistenza e database

Bho, per loggare le attività su db serviranno 3 tabelle e 3 sp, dubito che il tempo necessario a provare una tecnologia in beta sia minore dell'implementazione "classica". Quando poi la tecnlogia è in beta ancor di più, visto che è tutto fuorché sicuro che poi con il tempo uno non debba rimettere mano a quanto già fatto usando la beta perchè la versione ufficiale è "diversa".
Poi per carità, oguno usa il suo tempo come più gli piace!
E, di nuovo, tu non fai media... :-)
22/12/2009 15:08 | AlessandroD
Gravatar

# re: Persistenza e database

Si, credo ne valga la pena. Innanzitutto questo è un esempio e il "pattern" è applicabile a molti altri casi meno ovvi.
In secondo luogo la grossa differenza è tra una soluzione di tipo imperativo (sql-based) a quella dichiarativa (wf-based).
Con la soluzione sql devi creare uno schema, preparare un data layer, eseguire test specifici classe per classe, e il tutto si ripete ad ogni cambiamento, seppure lieve, dei requisiti.
Con la soluzione wf il lavoro è tutto su un dsl dove sbagliare è molto più difficile, i test sono decisamente più semplici, e la parte di persistenza è totalmente parte dell'infrastruttura e quindi "invisibile".

L'approccio dichiarativo ha certamente un overhead ma è trascurabile in problemi come questo. Se si trattasse di sviluppare un algoritmo di ottimizzazione delle consegne di una logistica, crearlo in logica dichiarativa sarebbe un grave errore perché le performance ne risentirebbero certamente.

Ma qui parliamo di long-running workflow dove ogni activity consuma una parte minimale di tempo in rapporto alla totalità dell'operazione.
Inoltre se anche ci sono 10000 workflow, avrò in memoria solo quelli degli utenti realmente attivi, il che fa crescere l'overhead di memoria in minima parte. Infine, parlando specificamente di logging, è una attività facilmente demandabile ad un servizio ad-hoc, che può girare anche su un application server separato, invocato in asincrono, che non aggravi in alcun modo neppure il db usato per il resto.
E poi l'ultima delle motivazioni è che se lo sviluppo (inteso come ciclo di vita, quindi compreso di manutenzione) costa meno, la soluzione è certamente preferibile per il cliente.
22/12/2009 17:19 | Raffaele Rialdi
Gravatar

# re: Persistenza e database

Aggiungo solo che il fatto che la persistenza vada *comunque* su db, è falso.
La persistenza custom esiste e su un ambiente come Azure dove ho la gestione della concorrenza e transazionalità anche su "cosi" che non siano database, la faccenda è molto interessante.
22/12/2009 17:21 | Raffaele Rialdi
Gravatar

# re: Persistenza e database

Raf, intervengo solo per correggere una cosa: SQL non è linguaggio imperativo, ma è un linguaggio dichiarativo.......(e da qui anche le soluzioni)
22/12/2009 20:09 | Davide Mauri
Gravatar

# re: Persistenza e database

Davide, ho scritto che è la soluzione basata su sql ad essere imperativa, non ho scritto che è il linguaggio sql ad esserlo.

Poi possiamo stare a discutere sul fatto che puoi scrivere codice sql in modo assolutamente imperativo ma questo è un altro discorso.
22/12/2009 21:19 | Raffaele Rialdi
Gravatar

# re: Persistenza e database

Non intendo affatto mettere in discussone la validità del modello relazionale. Che poi è un modello e come tale è difficilmente contestabile di per se.

Per quanto concerne il tuo esempio ritengo che esistano altri modi per realizzare un'agenda telefonica e che la scelta della persistenza dipenda dal contesto e non dal fatto che qualcuno un giorno ha detto che si fa così e basta.

E sul fatto che il mondo delle entità di business sia intrisecamente relazionale è del tutto riduttivo. Gli object model sono grafi e le teorie dei grafi parlano da sole senza che sia i qui a doverle sostenere.

La persistenza di un modello viene riportata spesso (e giustamente) in un db relazionale perché su grosse moli di dati sono un sistema estremamente efficiente per rispondere a concorrenza, ricerca e molto altro.

La mia non è una battaglia contro i db che svolgono ottimamente il loro mestiere. Semplicemente credo che la scelta di usare un db dipenda dal contesto del progetto e che in molti casi in cui viene usato, in realtà si possa risolvere in modo più semplice e comunque rispondente ai requisiti i progetto.

Infine il log è solo un esempio, e non vuole essere un esempio "chiave" per demolire un bel niente. È il classico esempio di una cosa che è sempre stata fatta con un db e invece si può fare in modo differente con un complessivo costo inferiore sul ciclo di vita di sviluppo. E questo è il parametro che conta con un cliente.
23/12/2009 23:45 | Raffaele Rialdi
Gravatar

# re: Persistenza e database

Ovviamente non sono d'accordo su praticamente nulla di quello che hai detto (a partire dfal fatto che mi parli da un piedistallo). In particolare qui mi sembra importante sottolineare che il costo non dovrebbe essere l'unico e solo fattore, ne' per il tecnico e nemmeno per il cliente, quando e' degno di tale titolo.

-LV
24/12/2009 00:53 | LudovicoVan
Gravatar

# re: Persistenza e database

Trovo il post interessante per il fatto che, con due righe, ho capito che WF può assolvere alcuni compiti, e mi verrebbe voglia di fare dei test. Lo vedo come uno spunto, non come un dogma scritto nella pietra. Insomma, ne parliamo, è il bello di internet.
@LudovicoVan
E' indubbio che Raf sia un programmatore autorevole, ed avrebbe titolo a parlare da "dove vuole". Tuttavia, se rileggi il post, frasi come "Se consideriamo il modo "classico" di gestione del database la mia risposta è no." si riferiscono alla sua riflessione, parla di "mia" risposta, non certo "della risposta".
Stica ragazzi.. :)

>In particolare qui mi sembra importante sottolineare che il costo non dovrebbe essere l'unico e solo fattore, ne' per il tecnico e nemmeno per il cliente, quando e' degno di tale titolo.
Beh, appunto direi :) un cliente intelligente valuta i suggerimenti di un buon tecnico, sull'adozione di una tecnologia "diversa", che possa fargli risparmiare nel medio periodo. Un po' come l'adozione del ORM potrei dire..
24/12/2009 02:14 | novecento.alessio.leoncini
Gravatar

# re: Persistenza e database

@Ludovico. Non so dove vedi i piedistalli. Ho parlato di contesto e, come ti ha già fatto notare Alessio che ringrazio, ho parlato di "mia risposta".
Buone feste a tutti
24/12/2009 23:39 | Raffaele Rialdi
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET