2009-08-31 100 views

回答

11

DB生成:

  • 易確保它的獨特
  • 需要額外的往返(你必須閱讀生成的ID後面)
  • 通常非常簡單(序列)
  • 當事務回滾,差距可能出現在序列中(感謝Kristen指出了這一點)。

的App ID生成

  • 可以像你需要(例如,您可以編碼對象類型的ID,如果你想)
  • 很難做出唯一的(除非你使用複雜的UUID)
  • 你甚至可以不說話的DB

[編輯]由於UUID的相當昂貴(在許多數據塊,指數fragmenta沒有原生支持分配ID重刑等),大多數應用程序使用基於數據庫的發電機。

+0

謝謝你的名單。是否有放置Id Generator的最佳做法?數據庫發生器對我來說聽起來更容易 – bastianneu 2009-08-31 09:52:45

+0

查看我的編輯。除非您編寫集羣軟件,否則生成器通常位於數據庫中。 – 2009-08-31 11:28:23

+0

我最喜歡這個答案,導致它的一個簡單的列表,你必須考慮重要的一點。謝謝! – bastianneu 2009-09-01 08:10:44

8

要記住的另一件事是,並非所有數據庫插入都來自應用程序。如果使用應用程序驅動的guid,當您收到新客戶並且必須從最後一個供應商遷移100,000條記錄時,真的會傷害到您。

+0

對不起,我不明白你的答案。任何人都可以清理那個嗎? – bastianneu 2009-08-31 15:42:24

+3

關鍵是,如果您在數據庫之外的任何位置生成標識符,則會使數據處於風險之中。 – HLGEM 2009-08-31 17:50:35

+1

+1,這取決於你的設置以及有多少不同與你互動系統,它可能無法保證所有的在你的數據庫中的記錄會從你的應用程序中產生。您可能會在將來的某個時間點需要合併來自外部數據源的數據,或者作爲一次性遷移(如HLGEM所建議的),或者作爲批量加​​載過程的一部分。無論哪種情況下,如果您的ID來自應用程序中,那麼加載這些記錄將會困難得多。你可以有一個Web服務或其他類型的API,但這會對性能產生影響。 – 2009-08-31 19:37:05

2

我認爲最重要的是你選擇一些可以被你的企業有用的標識符。例如,DMV將您的許可證號碼放在卡片上,如果您忘記了錢包並記住了該號碼,它可以用來驗證您的身份(例如,當警察拉過來時)。你不會在卡上放置UUID。

從您的業務隱藏標識符可能會造成很多混淆,因此選擇一些您不介意告訴客戶,客戶或業務合作伙伴的內容。我並不是說每個人都應該能夠記住它,但是如果你正在查看收據(例如),至少應該可以通過電話向某人閱讀。

當然,性能也有例外,但這些應謹慎使用,不得與業務可見標識符混淆。

查看我的相關blog post

+0

+1不錯的閱讀。感謝您的鏈接 – bastianneu 2009-09-01 08:09:40

+2

請不要混用商業密鑰和技術密鑰。標識符是唯一標識對象的技術鍵(例如在外鍵中)。他們在索引上表現良好,他們很小而且一貫以某種方式。業務鍵(如車牌號碼)是你顯示什麼到外面,但因爲它們是不可靠的(他們可以以任何方式改變,他們遵循的現實,而不是規則),你不能依賴於他們作爲主鍵。想想名字:當你結婚時,你的名字可能會改變。或者您可以在數據庫中擁有兩個具有相同出生日期的「John Smith」。 – 2009-09-01 10:00:12

+0

@Aaron:「請不要混用商業密鑰和技術密鑰。」我沒有把它們混淆,我專門解決了這個區別。 @Aaron:「有兩個約翰史密斯出生日期相同」這是發明新標識符的商業原因,而不是技術原因。 – 2009-09-01 16:43:33