In generale, sono tentato di rispondere a Mu (nel senso zen), perché lo scenario è sbagliato da una prospettiva DDD. In DDD iniziamo con i requisiti aziendali e gli esperti di dominio e da quelli deriviamo un modello di dominio .
Sebbene sia un punto controverso, il database è quasi solo un artefatto accessorio dei requisiti aziendali (che quasi sempre dichiara che le Entità devono essere mantenute).
Detto questo, cercherò di fare del mio meglio.
Nella maggior parte dei casi, un ordine è un oggetto business piuttosto importante, e ovviamente è necessario conoscere le righe dell'ordine, inclusi i prodotti in ogni riga, quindi sembrerebbe che ci sia bisogno dell'associazione dalla riga ordine (Order_Detail) al prodotto.
Tuttavia, quando viene fornito un determinato prodotto, raramente è necessario sapere in quali ordini è stato incluso, in modo da suggerire una relazione unidirezionale proprio lì. Possiamo navigare dalla linea d'ordine al prodotto, ma non dal prodotto alle righe d'ordine.
Tuttavia, l'analisi di cui sopra può rivelarsi falsa a un livello più profondo. Immaginate la seguente conversazione tra lo sviluppatore e l'esperto di dominio:
Dev:Abbiamo creato questa associazione da ordini di prodotti in modo che sappiamo sempre tutto ciò che riguarda i prodotti in un ordine particolare.
Exp:Che suona bene, ma per quanto riguarda il fornitore?
Dev:Anche questo è incluso.
Exp:Che cosa succede quando si cambia il fornitore per il prodotto?
Dev:Questo si rifletterà in modo implicito nei dati dell'ordine così ...
Exp:che non è quello che vogliamo. Vogliamo che i dati riflettano l'ordine al momento della spedizione.
In questo caso, risulta che c'è effettivamente un errore nello schema del database. Il problema può essere causato dalla segnalazione, perché gli analisti di business potrebbero voler eseguire report su come i diversi fornitori influenzano i guadagni (cosa ne so).
Tale caso può suggerire di tagliare l'associazione dalle righe di ordine al prodotto del tutto. Gli ordini devono contenere dati di prodotto storici (istantanee), non dati di prodotto attuali.
Possiamo anche entroduce un ProductSnapshot
valore dell'oggetto che rispecchia semanticamente un Product
Entity per modellare questo nel Modello di Dominio.
Tutto sommato, sembra sempre più ragionevole modellare Order
come un aggregato di se stesso e linee di ordine (con ProductSnapShots
), ma per quanto riguarda la relazione tra ordini e clienti?
Come attualmente comprendo associazioni e aggregati, le associazioni definiscono gli aggregati. Dato un ordine, vorremmo sapere del cliente? Più probabilmente. Dato un cliente, ti piacerebbe conoscere gli ordini? Probabilmente.
Questo suggerisce una relazione a due vie, che rende Customer
la radice Aggregate. Ciò significa che avresti uno CustomerRepository
, ma non lo OrderRepository
. Ogni volta che hai bisogno di un ordine, devi farlo tramite lo Customer
.
In alcuni casi questo può essere perfettamente sensato, mentre in altre situazioni questo potrebbe risultare molto goffo. Dipende molto dai requisiti aziendali ...
Si può anche considerare di creare un OrderRepository
, ma questo invade il root di Customer
Aggregate. Se lo fai, diventa vago dove si trova la responsabilità per l'Ordine. Cosa succede se si annulla l'ordine dal cliente? Customer
ha un elenco di ordini, ma sono tutti compilati in memoria se si legge l'ordine dal OrderRepository
?
Probabilmente no, ma è probabile che lo siano se si legge il Cliente dallo CustomerRepository
.Il punto qui è che l'analisi di Root aggregati è importante e, una volta definito un aggregato, è necessario rispettarlo e rispettarlo.
Questo mi induce a favore piccoli aggregati oltre grandi aggregati, quindi in questo esempio, vorrei limitare l'aggregato al Order
e le sue linee d'ordine, e non hanno alcuna associazione tra Order
e Customer
.
Non avendo un'associazione formale tra Order
e Customer
non significa che non possiamo riferire loro a tutti, ma abbiamo bisogno di esplicite servizi ci dà tutti gli ordini per un determinato cliente. Non possiamo semplicemente navigare da uno all'altro.
L'esempio non è il migliore. Ovviamente il database Northwind è stato fatto tenendo conto dei dati relazionali. Come hai detto, non conosciamo i requisiti che erano all'inizio di quel database. Ma la tua analisi è molto buona e dettagliata. Mostra come DM dovrebbe essere pensato e modellato. Grazie per il tuo tempo e la risposta dettagliata. –