Viděl jsem tutoriál o DDD, ve které říká, že pokud mám agregát kořen SnackMachine, který má více než 30 podřízené prvky podřízené prvky by měly být v samostatné souhrnné. Například, SnackMachine má spoustu PurshaseLog (více než 30), a to je lepší pro PurshaseLog být v samostatné souhrnné. Proč je, že?
Důvodem pro omezení celkové velikosti úhrnu, protože vždycky zatížení plné agregovat do paměti a vždy budete ukládat plné agregátní transactionally. Velmi velký celek by mohlo způsobit technické problémy.
To znamená, že neexistuje žádná taková "30 podřízené prvky" pravidlo v souhrnné design a zní to jako svévolné pravidlo. Například, má méně velmi velké dítě prvků by mohlo být technicky horší, než mít 30 velmi lehký podřízené prvky. Dobrý způsob ukládání agregátů je jako json dokumenty, vzhledem k tomu, že budete vždy číst a psát dokumenty jako atomické operace. Pokud si myslíte, že tímto způsobem, budete si uvědomit, že souhrnný design, který znamená velmi velké, nebo dokonce někdy-rostoucí dítě sbírka bude nakonec způsobit problémy. A PurhaseLog zní jako stále rostoucí kolekce.
Druhá část pravidlo, které říká, "dejte ji v samostatné souhrnné" je také není správné. Nemusíte vytvářet agregáty, protože budete muset uložit některé údaje, a to nezapadá do stávajícího agregátu. Vytvoření agregátů, protože je třeba provést některé obchodní logiky a logiky bude potřebovat nějaké údaje, takže si dát obě věci dohromady, v celkovém.
Takže, i když to, co chcete vysvětlit ve své otázce, jsou věci, aby vzít v úvahu při navrhování agregáty, aby se zabránilo nutnosti technologických problémů, doporučuji si dát pozor na aktuální povinnosti agregátu.
Ve vašem příkladu, jaké jsou povinnosti SnackMachine? Dělá to opravdu potřebují (plné) seznam PurchaseLogs? Jaké operace bude SnackMachine vystavit? Řekněme, že to odhaluje PurchaseProduct(productId) a LoadProduct(productId, množství). K realizaci své obchodní logiky, tento agregát by třeba seznam výrobků a udržet počet jejich dostupné množství, ale to by nebylo třeba ukládat nákup protokolu. Místo, na každý Nákup, to mohl publikovat událost ProductPurchased(SnackMachineId, ProductId, Datum, AvailableQuantity). Pak externí systémy mohou přihlásit na tuto akci. Jeden účastník může zaregistrovat PurchaseLog pro účely podávání zpráv a další účastník mohl poslat někdo jiný stroj, když akcie byla nižší než X.