DDD, Aggregate e FK

I concetti di aggregate e di aggregate root nell’ecosistema di domain driven design ricoprono un ruolo fondamentale: l’aggregate garantisce un raggruppamento logico delle varie entities e value objects. L’aggregate root è il “guardiano” e l’unico punto di accesso ad un aggregate, che identifica una singola unità di persistenza. Il concetto di raggruppamento logico e quindi di aggregate permette di gestire insiemi di entities e value objects come se fossero un’unica entità.

Molto spesso è proprio la mancanza o la non corretta identificazione di aggregate e aggregate root a portare alla falsa sensazione di approcciare lo sviluppo dell’applicazione in DDD e, soprattutto, alla possibilità di evolvere facilmente il nostro dominio. Questo falso sentore si scontra, solitamente, con la realtà nel breve volgere di qualche iterazione.

In un’ottica DDD-oriented anche il database deve essere al servizio del nostro modello e non vincolarne la sua evoluzione imponendo dei limiti dovuti alla necessità di sottostare al modello relazionale: definendo un aggregate vengono implicitamente definiti i confini dell’unità minima di consistenza. Foreign key che valicano i confini di un aggregate sono il sintomo di un qualcosa che non va: bisogna imparare a pensare in termini di “eventual consistency” oppure ripensare e ridisegnare i confini dei nostri aggregate.