我正在使用SQL Server,並且大多數表具有類型爲int的標識列。而現在,我剛剛遇到了一本書,說明使用這種機制並不是一個好主意。使用NHibernate作爲ORM時,使用身份列的優缺點是什麼?使用NHibernate的SQL Server標識列 - 要使用還是不使用
回答
我不是NHibernate的專家,但據我瞭解,使用標識列打破UnitOfWork並導致數據庫的額外往返。
法比奧Maulo (當時的NHibernate的項目負責人,我不知道,如果他今天仍然是)有一個博客帖子裏,他解釋對此進行了詳細:
Identity: The never ending story
這裏是另一個(長)博客文章與示例代碼:
NH2.1.0: generators behavior explained
但是,請注意,這兩個博客帖子大約三歲談論NH 2.1.0,而當前版本今天是NH 3.3。但我認爲法比奧所描述的問題今天仍然存在。
我認爲存在一個更大的問題....是的,「工作單元」的概念和一切都很重要。但SQL Server的快樂也很重要! GUID在SQL Server中造成不良主鍵(http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx)因此,在NH 3.x中,可以使用身份嗎? (我們需要知道!) – Jonesome
沒有理由說明爲什麼NHibernate無法生成SQL,它會在創建記錄的同一行中返回新插入的標識列。 –
不,重點是:當您在UnitOfWork中創建20個新對象時,NH必須爲每個數據庫進行往返數據庫以便通過標識獲取ID ...哪種類型打破了UnitOfWork的用途。使用其他ID生成策略,NH只需要在最後進行** 1 **單程往返。 –
如果它們是一個識別列,它沒有區別。 ORM的作用是將數據實體映射到數據庫,而不是規定數據庫結構/設計。我使用了標識列的實現,它工作正常。
是的,它的工作原理。這是一個效率問題。使用標識列或其他數據庫控制的主鍵生成器可防止NHibernate批量處理INSERT語句。 –
@Oskar - 你應該寫一個答案:)謝謝 – dragonfly
大多數數據庫都支持以返回標識列的方式進行批量插入。以SQL Server中的'Output'子句爲例。 (不管NHibernate做的事情是另一回事。) –
- 1. 要使用shouldRasterize還是不要使用
- 2. 我使用SQL Server還是SQL Azure?
- 3. NHibernate的返回一個對象不使用標識字段(使用NHibernate 2.0)
- 4. 使用Sql Server中的數據爲現有列添加標識
- 5. 我應該使用Get還是Load - nhibernate?
- 6. 要是不知道具體的列是標識(在SQL Server)
- 7. 在NHibernate,流利NHibernate和SQL Server 2008中使用時間列
- 8. 要使用JNI,還是不要使用JNI(Android性能)
- 9. 在存儲過程中使用@@標識是好還是不好?
- 10. 要使用SQL Server 2008
- 11. 使用SQL Server的序列
- 12. 使用SSIS的標識列
- 13. 在SQL Server和NHibernate中使用GUID
- 14. NHibernate映射哪個標識使用?
- 15. 批量插入到SQL表中,並使用唯一標識列不是標識
- 16. LINQ to SQL - 使用還是不使用這是一個問題
- 17. Apache Mahout,使用還是不使用
- 18. 需要使用鎖還是不行?
- 19. 更新SQL TABLE使用標識列使用GridView更新
- 20. 使用SQL Server 2005還原數據庫
- 21. 使用的TransactionScope不補種標識列
- 22. 如何不要使用SQL
- 23. 如何產生的RowID在SQL Server 2000中不使用標識列
- 24. 使用類還是不使用類
- 25. 使用還是不使用ReleaseMouseCapture()?
- 26. 使用BaseColumns還是不使用ContentProvider?
- 27. NoRM - >使用還是不使用?
- 28. DTO vs VM - 使用還是不使用?
- 29. SQL Server - 表\列使用
- 30. SQL Server 2005 - 使用IDENTITY列
那麼從數據庫的角度來看,專家是有一個唯一標識表中的行的強大方式,特別是考慮到該表可以有成千上萬或數百萬行等等。你還可以區分行嗎?是否有其他唯一的ID /參考列?唯一性是使用UNIQUE約束強制執行的嗎? –
@ChrisCannon這個問題和建議是基於**不是關於刪除主鍵,而是關於如何生成主鍵的值。當NHibernate自己管理主鍵生成時,它可以更高效地工作。 –
我已經挖遍了谷歌,我沒有看到這個問題很好的答案。我認爲這個問題是開放的。 NH想要使用GUID ......但是在SQL Server中GUID是非常可怕的(參見http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering- key.aspx)。在我們的DB中,我們可以通過從GUID改變爲標識來節省GB的DOZENS。現在是更好地寫這個主題的時候了...... – Jonesome