使用guid作爲標識字段而不是自動遞增整數時,實現域驅動設計更容易嗎?使用guid,您不必跳到數據庫即可獲取實際值。在領域驅動設計中,身份領域更好嗎?
回答
好,GUID是容易,看起來像最合適的。他們很喜歡前程序員,因爲他們不必處理數據庫。另一方面,當我們在使用數據庫時不考慮數據庫問題的潛在缺點時,我會盡可能地提醒他們。
問題的確是:你真的需要在存儲在數據庫之前知道實體的ID嗎?真? 爲什麼?
如果你決定去與最終的GUID,如果你使用SQL Server作爲後端數據庫(我不知道有足夠的瞭解其他RDBMS做出明智的建議),我會強烈建議您絕對確保GUID是而不是被用作表上的集羣密鑰。這會扼殺你的表現 - 毫無疑問。
如果確實使用GUID作爲主鍵,請確保使用別的東西,其他一些列對數據庫造成的破壞不會很大,因爲您的集羣鍵 - INT IDENTITY是我的第一選擇。
退房由金佰利特里普這些文章爲什麼一個GUID絕對不是一個好主意,因爲在SQL Server數據庫中的聚集鍵 - 她是最終的大師,當談到索引和性能問題的索引和她能使得這些點好多比我以往任何時候都可以:
- GUIDs as PRIMARY KEYs and/or the clustering key
- The Clustered Index Debate Continues...
- Ever-increasing clustering key - the Clustered Index Debate..........again!
Marc
我並不認爲「在存儲ID之前知道ID」這麼多,因爲域應該是設置ID的域,因爲實體的標識符應該是一個域關注的問題。 PK是數據庫的實現細節,這是域名一無所知。一個與數據庫中的標識非常類似的簡單增量整數的ID是巧合。我認爲這兩個概念需要在DDD中保持獨立 – Sinaesthetic 2016-04-03 06:59:57
如果我在同一事務中發佈事件消息,則可能需要引用聚合根的標識。 – pnschofield 2017-12-13 20:51:03
我推薦Guids,因爲你不知道你在看什麼。另外,我知道這會被當成一個笑話,但我必須調試系統中發生的一個問題,它在尋找uint而不是guid。這會導致Sharepoint中的模板被停用,導致我們無法重新激活它。花了2天時間來發現潛在的問題。所以要回顧Guid's。
我看到GUID在遞增整數上的唯一優點是身份創建的分散。也就是說,遞增整數需要原子增量和讀取共享值,而GUID可以獨立創建,幾乎不用擔心碰撞。
至於你的建議,GUID允許在不諮詢數據庫的情況下解引用一個實體,我不明白這是怎麼回事,如果沒有其他信息沒有在你的問題中提到。您在這裏選擇的是類型之一,而不是是否使用密鑰。如果您手中有密鑰,並且密鑰通過數據庫映射到值或實體,則需要查閱數據庫以解密引用密鑰。
我使用GUID的原因有兩個:
- 的ID是唯一的,不僅在那裏它被創建的上下文中,所以ID的相同類型的數據可以在不同的位置產生。如果您有多個分佈在不同地理位置的互相交換數據或處於斷開連接的情況下的安裝情況,則這種做法很好。
- 它反駁了以邏輯方式處理ID的衝動,而是強制開發人員將該值視爲「公正和ID」。
但是,我不一定會說這些參數僅適用於域驅動設計。
DDD的核心原則之一是持久性無知。所以,是的,GUID是最簡單的方式,無需依賴持久性存儲即可爲您的對象提供唯一標識。
注:如果您使用的GUID很關心數據庫的性能,可以考慮使用梳子(專爲SQL Server索引碎片)
不,絕對不是。 GUID是不應該泄漏到您的域中的實現細節。你需要一個身份值對象,我不在乎你如何實現它。
我認爲這是完全倒退。 guid是實現細節的極性相反; PK將是一個實現細節。在DDD中多次指出實體的標識符應該是全局唯一的標識符。是否將其用作數據庫中的PK是另一回事。 – Sinaesthetic 2016-03-31 09:47:46
@Sinaesthetic再好好想一想。身份可以是一個相關的領域概念,它的實現不是 – 2016-04-02 20:51:22
我甚至不確定這意味着什麼。標識符是領域專家想要的;無論是guid還是int或字符串都是無關緊要的。它不應該是任何將它與數據庫綁定在一起的東西,比如自動遞增的int,因爲數據庫是一個實現細節。 guid只是一個價值,而不是實現細節。 – Sinaesthetic 2016-04-03 00:56:51
- 1. 領域驅動設計 - 設計決策
- 2. 在實體領域驅動設計
- 3. 訪問控制領域驅動設計
- 4. 領域驅動設計方法彙總
- 5. 使用領域驅動設計原則
- 6. Symfony和領域驅動設計
- 7. 領域驅動的設計混亂
- 8. Domain.js的領域驅動設計
- 9. Objective C領域驅動設計
- 10. 瞭解領域驅動設計
- 11. Zend的領域驅動設計
- 12. 領域驅動設計 - 總根
- 13. 領域驅動設計:規範問題
- 14. 如何在領域驅動設計中爲領域模型編寫領域邏輯?
- 15. 域驅動設計 - 它在技術領域有多相關?
- 16. 任何關於領域驅動設計的好書?
- 17. 領域驅動設計 - 訪問修飾符域實體
- 18. 面向對象設計與領域驅動設計
- 19. 在領域驅動設計中實現有界上下文
- 20. 在領域驅動設計中的邏輯地點
- 21. 在.NET中應用領域驅動設計的最佳實踐?
- 22. 對象模型在領域驅動設計中的重要性
- 23. 我可以在沒有領域專家的情況下進行領域驅動設計嗎?
- 24. 計算領域
- 25. 應用領域設計
- 26. 設置領域
- 27. MVC +領域驅動設計中的文件夾結構
- 28. 雙語泛在語言與領域驅動設計項目
- 29. 如何在一個領域驅動設計
- 30. 緩存代碼位置在領域驅動設計
實體的標識符及其在數據庫中的主鍵是互斥概念IMO。 PK是一個實現細節;該域不應該具有對持久層的依賴或知識。如果你接受這一點,那麼選擇答案中的一個點更有意義。實體標識符可以是由域設置的guid,而PK可以是自動遞增的int。 – Sinaesthetic 2016-03-31 09:52:20
在從域中抽象持久化實現方面,問問自己:如果要將數據庫切換到平面文件存儲,您是否還能從平面文件獲取ID?如果你的答案是否定的,那麼你可以看到爲什麼你不應該使用它。通過允許域設置實體的標識符(在本例中是一個GUID),您可以爲域保留該概念。允許數據庫也生成一個可以索引的PK(本例中是一個int);這又是一個實現細節。 – Sinaesthetic 2016-04-03 07:04:02