2011-07-28 58 views
3

我開始了我的第一個真正的CQRS設置。我正在構建網站的用戶註冊部分,對於來自標準DDD「風格」的域名和寫入方面我非常熟悉。對於讀取模型,我有一個處理AccountCreatedEvent的denormalizer。CQRS第一NF閱讀模型 - 你是否允許重複?

現在 - 對於我正在實施的功能,我只想讓用戶註冊。這涉及檢查電子郵件地址/用戶名的唯一性。

所以,說我專門爲此設計了一個閱讀模型。一個AccountRegistrationReadModel,它只保存我現在感興趣的數據部分:用戶名,電子郵件,HashedPassword

後來,當我開始構建用戶配置文件頁面時,我需要一個AccountProfileReadModel。

該讀模式將共享一些相同的屬性,將有另一種解歸其處理與不斷變化的配置文件數據的事件,也許例如AccountUsernameChangedEvent

此時AccountRegistrationReadModel和AccountProfileReadModel有興趣聽AccountUsernameChangedEvent消息。

我的問題是:這種方法是否正確?我應該保持每個功能的讀取模型?還是應該嘗試對其進行標準化並重新使用數據,並儘可能限制重複?

回答

1

我覺得像大多數設計問題一樣,答案是它取決於你。共享將節省計算資源並限制您隨時間調試的地方數量。但分享也會將事物結合在一起,潛在地不必要地產生不同類型的成本:脆性。在一個有幾千個用戶和無聊查詢的系統中,數據庫中的一個簡單而經典的用戶表可能適用於大多數讀取模型。如果您不得不擴展到大量用戶或大量消息,那麼您可能會發現其他一些視圖(審覈日誌?當前活動的出貨量等)將涉及更有趣的反規範化或實現。

+1

+1 - 正常化會導致脆性...絕對同意。 –

1

我同意@塞巴斯蒂安在他的回答中所說的。我還補充說,在我看來,CQRS模式給你的是快速讀取的能力,其代價是稍微慢一點的修改過程(由於規範化)。你的閱讀不利於平坦的數據;因此,您在數據存儲中有一些重複。但是你的denormalizers處理更新。

因此,正如@塞巴斯蒂安所說,這取決於你。但轉向CQRS的關鍵好處是快速讀取和可擴展性。如果您開始正常化數據並跨模型共享數據,那麼您將回到更傳統的CRUD應用程序。那時,CQRS確實不會幫助你 - 所以使用它可能沒有多大意義。

希望這會有所幫助。祝你好運!

+0

感謝你們兩位的回答。我的感覺是,我喜歡一個領域模型,並根據每個功能來閱讀模型 - 所以一個領域和閱讀模型說'用戶註冊'和一個單獨的領域,並閱讀模型說'用戶個人資料頁面'是正確的方法走?我只是擔心,我打破了太多,並允許太多的重複。我的觀點是,註冊的用戶與個人檔案頁面的用戶不同 - 他們是單獨的問題 - 是好思想還是我在說我的屁股? – iwayneo

+0

嗯,我認爲你可能會考慮一個用戶域對象,最終提供給UserRegistration和UserProfile讀取models/tables/etc。域對象的構造函數可以非常好地支持UserRegistration模型,並且當用戶更新其配置文件時,它們會調用提供UserProfile模型的UpdateUserProfile域對象方法。你不是在說你的屁股 - 但我不認爲你需要1/1的關係b/w域對象和閱讀模型。 –

+0

確實。輕度規範化的SQL數據庫確實可以非常快速和優雅地執行連接。對於您的閱讀模型的某些部分,這可能完全合適且易於實施。你絕對不需要你的域對象和你的查詢模型之間有任何對稱性 - 的確允許你分解它們是關鍵。對於你需要做的每個查詢,找出最簡單的方法是什麼。有時你會發現你從同一視圖模型中提供多個查詢。有時你會建立一個不同的。一個可能是一些SQL表,另一個可能是內存散列表。搖勻。 –