posts - 462, comments - 1513, trackbacks - 139

Mappare 1:1 le entity sulle tabelle del db? No grazie

Mi riferisco al post di Diego sui tool di generazione di entities a partire dallo schema del database.

Ma siamo veramente sicuri che generare entities partendo dalle tabelle del db abbia senso?
In OOP un object model è un modello di un problema reale e il db è un modo molto conveniente per gestire la persistenza. Il db è bravo a cercare, ordinare, mantenere integro, gestire la concorrenza e la transazionalità delle modifiche, etc. ma il resto è ben altra cosa.

Se per molti (semplici) problemi entities e tabelle del db possono coincidere, a mio avviso non è vero da un punto di vista generale.
Voglio dire che i dati su db necessitano di essere organizzati in righe, colonne e relazioni perché questo è il sistema più efficiente che oggi abbiamo. Ma non credo che la costruzione di entities a partire da una tabella bidimensionale possa essere esaustiva per la costruzione di un modello.

I modelli infatti per loro natura non possono essere righe e colonne, tantomeno alberi ma a tutti gli effetti sono grafi complessi. Guardiamo l'object model dell'XML oppure del DHTML o ancora di Office ma potremo continuare la lista con quello di Visual Studio e così via.

Un modello deve essere agnosta e non sapere quale sia la forma della sua persistenza. Il primo motivo è che la persistenza non è necessariamente solo una. Con remoting o i web services devo serializzare l'entity; con un database devo mappare lo stato dell'oggetto sulle tabelle del db; con workflow foundation l'oggetto viene persistito ancora diversamente.
Inoltre l'oggetto può anche avere uno stato in memoria che sia radicalmente nella forma e nell'aspetto a ciò che deve essere persistito. Basti pensare ai dati che devono essere criptati, alla forma compatta che il dato può avere in memoria (bit flag in memoria versus id di una tabella di lookup sul database) etc.
Poi la persistenza tra layer dell'applicazione è ancora differente: il fx 2.0 ci impone di segnare con [Serializable] (o ISerializable o ancora IXmlSerializable) le nostre entities. Con il fx 3.0 possiamo usare la peristenza XAML che è decisamente più bella a vedersi grazie anche alle markup extensions. Un domani cambierà ancora.

Un altro aspetto importante è che posso avere differenti applicazioni che si "cibano" dello stesso database. Le applicazioni possono avere bisogno di oggetti molto differenti perché il problema che devono risolvere è differente.
A problema reale differente consegue un modello differente. E quindi la rappresentazione dell'oggetto customer può essere diverso da applicazione ad applicazione anche se condividono lo stesso database.

La parola d'ordine è encapsulation e secondo me un mapping diretto tra tabelle ed entities è spesso un errore di disegno che può funzionare in quanto caso particolare della soluzione ideale.

Print | posted on martedì 14 novembre 2006 16.48 |

Feedback

Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Raf++;
14/11/2006 16.57 | David
Gravatar

# Re: Mappare 1:1 le entity sulle tabelle del db? No grazie

quoto tutto al 100%. La prima cosa che ho detto a mio fratello quando l'ho introdotto alla programmazione OOP è stata: dimenticati del database, in questo momento tu devi modellare il dominio applicativo! Devi modellare gli oggetti, devi organizzarli, aggregarli, devi decidere ogni oggetto cosa fa e cosa non fa, cosa espone e cosa non espone. Per me non è stato difficile, però dopo anni ed anni passati a disegnare prima il db, eliminare questo approccio è arduo. Quoto in pieno, perchè il mio domain model non deve essere affatto legato alla sua logica di persistenza, anzi...meno ne sa, meglio è!!! Non solo posso avere 2 apps diverse che accedono allo stesso db con scopi diversi, ma è anche vero l'inverso: la stessa app può decidere di persistere in un modo piuttosto che in un altro.
14/11/2006 17.04 | Igor Damiani
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Quello che dici è giustissimo, ma il discorso IMHO è un altro:
quel progetto, come anche i vari MonoRail, RubyOnRails ecc.., partono da alcune "condizioni al contorno" per poter offrire un modello di sviluppo veloce ed affidabile... basandosi su ActiveRecord per la persistenza dei dati è "necessario" avere un rapporto diretto tra SQL e codice, cosa che per alcuni progetti (nel caso di MonoRail/RoR, le applicazioni web di un certo tipo) può essere accettabile ma chiaramente in altri contesti non può essere accettabile.
Il discorso è: verificare se e a quali condizioni è possibile adottare questo modello di sviluppo.
La risposta alla domanda: "Ma siamo veramente sicuri che generare entities partendo dalle tabelle del db abbia senso?" IMHO è:
ha senso se la si considera come una alternativa che va ponderata attentamente...
14/11/2006 17.34 | Diego Guidi
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Ciao,

anch'io quoto al 100%.
L'unica eccezione la pongo per quei progetti relativamente semplici, in cui non si voglia perdere tempo a sviluppare un domain model e quindi un DAL apposito, con tanto di query etc...

Laddove bisogna semplicemente mostrare banali interfacce di comunicazione con un db, per editing e ricerche varie, direi che è molto comodo.

Non sono aggiornato, ma sapete come si comporta invece LINQ in questo senso ?
14/11/2006 17.44 | theEvil
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Io credo che il mapping diretto può avere senso in un progetto RAD, dove la versione due non vedrà mai la luce. Un progetto usa e getta per cui anche il dataset è stra-indicato. Con questo mi riferisco sia a quello che dice Diego quando parla di alternativa che theEvil quando parla di progetti semplici.

Per quanto concerne Linq, lo vedo (e ho conferme in questo senso) come un DAL. LinqSql permette di creare delle entity a partire dal linguaggio di query di C#3.0 e permette diverse tipologie di mapping:
- non mappo nulla e lui crea una entity 1:1 con la query (non necessariamente la tabella)
- mappo le corrispondenze con degli attributi sulle proprietà
- mappo le corrispondenze usando un file xml separato (.map)
- creo le entity con un tool da command prompt usando uno dei sistemi sopra.

Linq è quindi neutrale da questo punto di vista ma è anche presto per entrare nei dettagli. Preferisco aspettare la December CTP che a detta di Hejlsberg al TechEd dovrebbe portare novità.
14/11/2006 18.10 | Raffaele Rialdi
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

"Ma siamo veramente sicuri che generare entities partendo dalle tabelle del db abbia senso?"

SIAMO DACCORDO!!! :-)

Non dico altro per non scatenare altre discurssioni (che sto gia facendo con AndreaS qui al mio fianco)

:-)
14/11/2006 22.09 | Davide Mauri
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Devo cominciare a preoccuparmi? :-D
Andrea ... senza pietà ... LOL
14/11/2006 22.26 | Raffaele Rialdi
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

:-DDDDD
14/11/2006 22.33 | Davide Mauri
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Estenderei il concetto anche al layer superiore. Marcare un BO con Serializable espone la stessa BO al pericolo di essere usata come informazione AS IS attraverso un web service o Remoting.

Quindi, se proprio bisogna essere agnostici nei confronti del DB (verso il basso), la stessa regola si applica alla presentation (verso l'alto).
15/11/2006 6.58 | Pierre Greborio
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

L'approccio top-down (dal dominio alla persistenza) è proprio il motivo che mi ha spinto a fare il tool di mapping NHDomainMapper, che al contrario di tutti quelli che vedo, non parte dalle tabelle per creare le classi, ma parte dalle classi esistenti per mappare su tabelle esistenti.
15/11/2006 9.27 | Giancarlo Sudano
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

tutte belle parole e bei discorsi, ma solo se si parla di un progetto da 'zero'.

quando per lavoro ti trovi a dover utilizzare basi dati già esistenti, intoccabili, molto spesso concettualmente sbagliate, manutenute da persone 'discutibili' hai una unica soluzione : mapping 1:1!

oppure puoi fare "l'alternativo" prendendoti dei rischi assurdi in nome di cosa?

la verità, IMHO, è che è tutto bello bello quando fai come ti pare, ma quando ti trovi davanti un DB SQL 2005 importato pari pari da DB2/400 (ed intendo proprio pari pari, non so se mi capite), da una persona che è la prima o seconda volta che installa SQL 2005 (avanti, avanti,avanti, finish)... ce ne vuole di pazienza!

in questi casi la filosofia non paga.

comunque credo che andrò al workshop di UGISS a dicembre, la track dev mi interessa molto.
15/11/2006 9.41 | Luca
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Luca quando dici:

"quando per lavoro ti trovi a dover utilizzare basi dati già esistenti, intoccabili, molto spesso concettualmente sbagliate, manutenute da persone 'discutibili' hai una unica soluzione : mapping 1:1! "

allora l'unico risultato certo che ottieni è di importare 1:1 nella tua applicazione gli errori logici e di progettazione presenti nella base dati.

Proprio quando la base dati è "fatta male" e non puoi correggerla allora è ancora più necessario che lo strato DAL della tua applicazione aggiunga un po' di logica (non logica di business, ma logica di trattamento dei dati) per tenere conto delle incoerenze della base dati, in modo da esporre una interfaccia "pulita" utilizzabile dalla logica di business della tua applicazione senza dover farsi carico dei problemi del DB.
15/11/2006 10.13 | Federico
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

ed è proprio quello che faccio, ma il mapping restrostante è 1:1, poi io ripulisco e riordino la casa, e l'interfaccia pubblica è pulita e linda, ma dietro nasconde il marcio
15/11/2006 11.21 | Luca
Gravatar

# re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Luca, quando ho scritto quesot post avevo proprio in testa applicazioni reali che avevano un db intoccabile. È proprio in questi casi che hai la massima resa.
Se parti dal concetto di poter creare le tabelle come più ti piace allora il mapping 1:1 ti fa meno differenza anche se non è comunque corretto.
Se invece hai un db disastrato è impensabile mappare 1:1 e il tuo DAL svolgerà un ruolo fondamentale.
Mi sono già trovato in casi di questo genere e non tornerei mai indietro mappando 1:1.
15/11/2006 11.35 | Raffaele Rialdi
Gravatar

# Riguardo alla generazione di codice partendo dal Db

16/11/2006 10.53 | mello
Gravatar

# Re: Mappare 1:1 le entity sulle tabelle del db? No grazie

Per il progetto in corso io ho adottato la filosofia tanto incrimanata in questo post. In realtà, il concetto di 1:1 vale in partenza, poi il modello cresce e ogni entità è stata arricchita fino ad avere un Object Model funzionale dal punto di vista degli use case. La soddisfazione l'ho avuta quando dopo l'estate c'è stato un turn.over di ben 3 risorse e l'impatto è stato veramente minimo (il solo periodo di training).
Dopo 11 mesi (progetto ancora in corso), se provo ad immaginare il contrario non penso che mi sarei trovato allo stesso punto, anzi forse avrei pagato qualcosa in più perché oggi mi costa meno arricchire entità che non scorporarle.
16/11/2006 12.16 | Tommaso Caldarola

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 8 and 2 and type the answer here:

Powered by: