首先,我承認我是DDD的新手,需要閱讀「blue book」。DDD - 聚合根 - 處理效率和併發
我正在構建一個具有「Match」類型的AggregateRoot的系統。每個Match可以包含「投票」的集合,並且具有隻讀的「VoteCount」屬性,當用戶對Match進行投票或反對投票時,該屬性會增加。
由於許多用戶可能同時在Match上進行投票,因此必須將Vote添加到匹配中,並且VoteCount必須作爲一個涉及寫入鎖的原子操作增加/減少(鎖由D B)。 (我需要VoteCount作爲數據庫中的一個靜態值,以便由其他進程/組件有效查詢)。
在我看來,如果我堅持嚴格的DDD,那麼我將編碼此操作:
應用服務會收到一個投票請求對象 服務會從Match Repository中檢索Match對象 然後服務會調用Match對象上的某種方法來添加投票到集合並更新VoteCount。 資源庫,然後將堅持那場比賽的實例回到DB 然而,這種方法是不是我的2個主要原因應用是可行的,因爲我看到:
我使用的是後端的MongoDB,並不能完成這個讀 - 將操作寫入事務以防止對Match數據及其相關投票和VoteCount的髒讀。
效率非常低。我拉回整個對象圖只是爲了添加投票並增加VoteCount。雖然這在文檔數據庫中比在關係數據庫中更有效,但我仍在執行不必要的讀取操作。
問題1 & 2將單個Vote對象發送到存儲庫並對Mongo執行一條原子更新語句時不會出現問題。
可能投票,在這種情況下被視爲一個「聚合」,並應該得到自己的存儲庫和聚合狀態?
謝謝!然而,如果我「正常化」數據,將Votes和Matches存儲爲單獨的集合,那麼我將無法將它們「加入」到單個查詢中,是否正確?我必須循環縮小投票結果並獲得關聯的匹配? – drogon
Vernon關於聚合設計的鏈接(http://dddcommunity.org/library/vernon_2011/)已經真正解決了問題。感謝您的鏈接(來自其他職位)和這個答案。再次感謝! – drogon