DDD - Duplicazione tra aggregati - dovrei usare una tabella?

4

Capisco che esista una duplicità di dati tra contesti limitati. Il fatto è che non sono veramente sicuro della duplicità dei dati tra le radici di Aggregate.

Esempio: Ho prodotto in aggregato di prodotti e anche aggregato di prodotti nel carrello. Entrambi sono nello stesso BC (ShoppingCart) e condividono pochi campi (nome, descrizione, ...). MySQL è usato come spazio di archiviazione. Il prodotto in entrambi gli aggregati dovrebbe essere conservato in una tabella o separatamente?

Non mi interessa la duplicità, ma in questo caso ci sarebbero n prodotti nel database per n elementi del carrello.

    
posta František Maša 16.06.2015 - 09:23
fonte

1 risposta

3

Penso che tu voglia fare un disegno di normalizzazione all'interno di un Contesto Limitato. Se un aggregato è un sottoinsieme puro dell'altro (ad esempio il prodotto per il carrello è un sottoinsieme del prodotto per prodotto) probabilmente utilizzerei un solo tavolo. Altrimenti, probabilmente utilizzerei una seconda tabella che fa riferimento alla prima tabella piuttosto che duplicare colonne tra due tabelle.

Per quello che vale, non sono convinto che i due diversi prodotti che stai descrivendo siano entrambi aggregati. Uno o entrambi possono essere semplicemente entità o oggetti valore; forse c'è davvero un solo aggregato di prodotto in questo BC.

Aggiorna

In base al tuo diagramma: nel dominio del carrello desideri una raccolta di riferimenti ai prodotti (in base all'ID prodotto). Non chiamerei nemmeno quella raccolta una tabella di prodotto, ma invece la chiamerei tabella di articoli cart. Questa tabella degli articoli del carrello avrebbe campi relativi agli articoli del carrello, come ad esempio: l'ID della voce della tabella del carrello, un riferimento alla chiave esterna della tabella del prodotto, forse insieme a cose applicabili al carrello ma non ai prodotti, come ad esempio il conteggio del numero di questo articolo prodotto viene ordinato, e anche il timestamp di quando aggiunto al carrello (prezzo al momento aggiunto al carrello, ecc ...).

Non vorrei duplicare alcuna colonna della tabella prodotti nella tabella degli articoli del carrello. Quando hai bisogno di un valore di colonna dell'articolo prodotto (come la descrizione), puoi usare un join dalla tabella degli articoli del carrello per ottenerlo.

(Se / quando trovi che per ragioni di prestazione vuoi iniziare a renderle più indipendenti, allora vale la pena di pensare a questi come contesti diversi, perché il disaccoppiamento di queste cose per le prestazioni introduce nuove responsabilità (gestione della coerenza). Tra due diversi contesti, è possibile utilizzare la traduzione, la duplicazione e la memorizzazione nella cache e gli eventi, se necessario quando è possibile eseguire più database per le prestazioni.)

    
risposta data 16.06.2015 - 17:20
fonte

Leggi altre domande sui tag