簡體   English   中英

DDD:用戶聚合根與其他聚合中幾乎所有實體之間的一對多關系

[英]DDD: one-to-many relationship between user aggregate root and almost all entities in other aggregates

我有以下 DDD 場景,分為以下聚合:

用戶,
朋友(用戶協會),
文件(供用戶上傳),
畫廊(文件分組),
消息(用戶通信),
組(用戶可以創建,其他成員可以加入),
GroupMessages(發送給組內所有成員的消息),
GroupForums(小組成員可以討論各種主題)

這就是令人困惑的地方。 用戶與 GroupForums 的所有內容相關聯。 必須通過用戶存儲庫才能訪問其他聚合似乎不合邏輯,盡管從級聯的角度來看,如果我刪除了用戶,從技術上講,與用戶關聯的記錄也應該消失。

似乎我也不應該將此處存在的所有一對多關聯都添加到用戶實體中,因為從數據庫中補水似乎很荒謬,尤其是當我嘗試提取與用戶關聯的每條記錄時。 組織聚合和存儲庫的推薦策略是什么,以及處理給定實體的大量一對多關系的正確方法是什么?

您在句子“A user is associated with everything...”中使用了“關聯”一詞,這一事實非常有線索。 聚合根被關聯甚至一個“屬於”另一個是絕對好的。 但是,您需要查看一個實體是否可以在沒有 AR 的情況下存在。 如果可以的話,它可能有自己的生命周期,應該是一個 AR。 如果不能,則它是聚合的一部分。 這可能很難蒸餾。

你需要在你的 AR 周圍有一個非常清晰的界限。 例如,即使論壇可能需要用戶創建它,但這並不意味着在刪除用戶時需要(甚至可以)刪除論壇。 因此,論壇中的用戶可能會成為僅包含用戶名和 id 的ForumCreator (一個值對象)。 刪除用戶后,論壇可以繼續存在。

在 Order/OrderLine/Product 場景中,如果您選擇刪除包含特定產品的所有訂單行,則刪除它沒有多大意義。 我知道一個產品可能永遠不應該被刪除,但我們會以它為例。 您只需將相關產品數據“非規范化”到訂單行中,例如:產品 ID、產品名稱。 因此,即使產品名稱發生更改,也不意味着所有訂單行都需要更新,甚至應該更新。 事實上,訂單行代表一個時間點,應該保留“原始”產品名稱。 購買者可能訂購了“Some lirril product”,然后名稱更改為“Little product”。 不一樣的東西,雖然它是完全相同的產品。 購買者只記得原件。

我希望這是有道理的,並在某種程度上有所幫助。 你肯定需要找到你的對象圖的那些硬邊才能得到真正的聚合。

在 IDDD 書中,Aggregate 是一致性邊界,如果這些實體沒有事務一致性需求,它們可能是不同的 Aggregate。 我們不應該通過依賴項來設計聚合。 如果是這樣,您將擁有大型集群聚合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM