2012-05-29 22 views
7

我正在使用SQL Server,並且大多數表具有類型爲int的標識列。而現在,我剛剛遇到了一本書,說明使用這種機制並不是一個好主意。使用NHibernate作爲ORM時,使用身份列的優缺點是什麼?使用NHibernate的SQL Server標識列 - 要使用還是不使用

+0

那麼從數據庫的角度來看,專家是有一個唯一標識表中的行的強大方式,特別是考慮到該表可以有成千上萬或數百萬行等等。你還可以區分行嗎?是否有其他唯一的ID /參考列?唯一性是使用UNIQUE約束強制執行的嗎? –

+2

@ChrisCannon這個問題和建議是基於**不是關於刪除主鍵,而是關於如何生成主鍵的值。當NHibernate自己管理主鍵生成時,它可以更高效地工作。 –

+1

我已經挖遍了谷歌,我沒有看到這個問題很好的答案。我認爲這個問題是開放的。 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

回答

5

我不是NHibernate的專家,但據我瞭解,使用標識列打破UnitOfWork並導致數據庫的額外往返。

法比奧Maulo (當時的NHibernate的項目負責人,我不知道,如果他今天仍然是)有一個博客帖子裏,他解釋對此進行了詳細:
Identity: The never ending story

這裏是另一個(長)博客文章與示例代碼:
NH2.1.0: generators behavior explained

但是,請注意,這兩個博客帖子大約三歲談論NH 2.1.0,而當前版本今天是NH 3.3。但我認爲法比奧所描述的問題今天仍然存在。

+1

我認爲存在一個更大的問題....是的,「工作單元」的概念和一切都很重要。但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

+0

沒有理由說明爲什麼NHibernate無法生成SQL,它會在創建記錄的同一行中返回新插入的標識列。 –

+0

不,重點是:當您在UnitOfWork中創建20個新對象時,NH必須爲每個數據庫進行往返數據庫以便通過標識獲取ID ...哪種類型打破了UnitOfWork的用途。使用其他ID生成策略,NH只需要在最後進行** 1 **單程往返。 –

4

如果它們是一個識別列,它沒有區別。 ORM的作用是將數據實體映射到數據庫,而不是規定數據庫結構/設計。我使用了標識列的實現,它工作正常。

+5

是的,它的工作原理。這是一個效率問題。使用標識列或其他數據庫控制的主鍵生成器可防止NHibernate批量處理INSERT語句。 –

+1

@Oskar - 你應該寫一個答案:)謝謝 – dragonfly

+0

大多數數據庫都支持以返回標識列的方式進行批量插入。以SQL Server中的'Output'子句爲例。 (不管NHibernate做的事情是另一回事。) –