DDD e la persistenza di oggetti valore; dobbiamo denormalizzare?

4

Ho letto molto su Domain-Driven Development e sono giunto alla domanda su come preservare la mancanza di identità distinte con oggetti value (VO). Mentre nel mondo DDD, questo è un requisito (ma non sono sicuro di averne compreso appieno la potenza), pone problemi per i livelli ORM inferiori in termini di persistenza.

Le tabelle, per la maggior parte, sembrano essere normalizzate. Rende la vita facile in termini di assenza di anomalie di cancellazione o inserimento. La mia preoccupazione arriva quando si implementano le VO; hanno le chiavi primarie - identità per definizione (e chiavi esterne per i loro genitori). Rendendoli entità sta violando DDD in favore della persistenza. Invece, potrei fare una classe wrapper che accetta un "sacco" di parametri, e quindi li allega alla chiave esterna di ciascun genitore. Anche se meccanicamente disordinato, sembra che funzionerà.

Ho letto molte risposte su Internet (Stack Overflow anche) sulla denormalizzazione delle tabelle. Questo mi preoccupa, perché ora stiamo violando la persistenza per DDD.

Come consentire ai VO di esistere con la loro definizione corretta senza denormalizzazione?

    
posta AdrianGW 05.02.2014 - 05:31
fonte

2 risposte

4

Non penso davvero che ci sia un problema con gli OV che hanno un'identità nel database, a patto che questa identità rimanga nascosta e trasparente nello stesso livello del dominio. Sarei responsabile del livello dati per tenere traccia di tali identità in modo che il dominio non debba preoccuparsene.

Ma i VO ti danno ancora la possibilità di denormalizzare. La denormalizzazione può avere i suoi vantaggi, solitamente per motivi di prestazioni. Quindi puoi usarlo a tuo vantaggio.

    
risposta data 05.02.2014 - 09:09
fonte
2

Questo è un problema se si utilizza un ORM per mappare gli oggetti del dominio direttamente sul DB. Questo cade a pezzi piuttosto rapidamente per tutti tranne che per le applicazioni più banali. Crea invece classi separate per rappresentare il tuo archivio dati e mappali. Avrai bisogno di un codice che associ i BO ai DTO, ma non sarai costretto a compromettere le tue classi di dominio per rendere felice l'ORM, che è invariabilmente ciò che accade. Eviterete anche l'astrazione che perde con l'uso di un ORM.

Considerato quanto sopra, dipende il modo in cui si mantengono gli oggetti valore. Se stai memorizzando, ad esempio, le coordinate geografiche, probabilmente non le normalizzo e le memorizzerò nella stessa tabella dell'entità. Se i tuoi tipi di valore hanno in realtà una propria identità, ciò mi suggerisce che probabilmente non dovrebbero essere oggetti di valore nel tuo livello di dominio. Questo è veramente il che definisce la differenza tra un oggetto valore e un'entità in DDD. Mi piace sempre andare alla fonte per DDD; sfortunatamente molti dei blog che vedrete su internet (specialmente quelli che amano davvero NHibernate) non hanno davvero alcun DDD, e seguendo i loro consigli di solito vi portano al anti-pattern del modello di dominio anemico .

    
risposta data 21.02.2015 - 14:02
fonte