2010-11-27 90 views
10

我在choosing a primary key上發現了這個閱讀材料。如何選擇我的主鍵?

  • 有關於如何選擇給定表的主鍵的指南/博客文章?
  • 我應該使用自動遞增/生成的密鑰,還是應該將主鍵基於正在建模的數據(假設它具有真正唯一的字段)?
  • 爲了性能的緣故,主鍵總是要長一些,還是我可以將一個外部唯一ID作爲主鍵,即使它是一個字符串?

回答

10

我相信在實踐中使用natural key幾乎不會比surrogate key更好。

以下是使用自然鍵作爲主鍵的主要缺點:

  • 你可能有一個不正確的鍵值,或者你只是想重命名鍵值。要編輯它,你必須更新所有將使用它作爲外鍵的表。

  • 通常很難有一個真正的unique自然鑰匙。

  • 自然鍵通常是字符串。數字字段上的索引比字符串字段上的索引要緊湊得多。

對主鍵的數據類型應該是什麼沒有硬性規定。數字鍵通常表現更好,但可以使用字符串,尤其是在表格不大的情況下,引用它的表格也不大。

+0

+1 - 我從數據庫中使用自然鍵和管理員個人組閤中堅持重複使用客戶ID的組合並沒有結束,因爲如果只有12個活躍的Joe博客,他們不想要joeblogs13 ......儘管它使每一個可能的報告錯誤,並留在我們的網站的每個頁面上的競爭條件... – tobyodavies 2010-11-27 15:14:10

-4

我總是選擇uuid作爲主鍵。與int/long鍵相比,有一點點的開銷,但有很多好處:不能遇到類型溢出,以後可以在不更改主鍵的情況下對數據庫進行分片,可以與其他系統集成並確保您的主鍵始終是唯一的,UUID不能猜到等

+0

-1對於downvote感到抱歉,但「總是選擇一個uuid」與「適當使用uuid」4個字節與36 - hmmm,填充這些緩衝區! – 2010-11-27 14:22:50

0

我有很多不同的工作專業系統中的數據模型(主要是銀行軟件)及其他e是不同的解決方案。有我看過的GUID解決方案,它似乎沒有太多影響性能。我已經看到「由服務提供的號碼作爲系統範圍的唯一號碼」。我已經看到了提供類似於「更短」的GUID的算法。我也看到,使用的商業密鑰(如帳號)是不好的設計和造成的問題,我不會推薦它。我已經看到每個表的自動遞增鍵。

我最喜歡什麼?由服務提供的號碼作爲系統寬帶號碼。它運作良好。並且通過簡單的密鑰轉換表,可以使用用戶密鑰(如賬號)來找出什麼樣的唯一編號以及什麼類型的數據對象(不一定是表格,因爲如果數據對象根據其類型分成不同的表格)。

那麼有沒有博客或什麼?那麼我有一本書可以推薦Graeme Simsion和Graham Witt所着的「Data Modeling Essentials」。他們可能不會提出我的首選解決方案,但他們提供了許多真實的實例,並展示了可能的各種解決方案。

1

我使用替代密鑰,常被稱爲無意義的密鑰,由一個自動產生的INT/Bigint數據類型的。

以下是我喜歡使用這些鍵的一些原因。

  • 當從列表(如舊的電子郵件),你可以提供一個逗號刪去幾個項目分開的整數,而不是GUID的或自然鍵列表
  • 我覺得它使得編寫你自己的級聯刪除更容易
  • 我認爲內連接在整數字段上更快
  • 它可以使學習一個新的系統而不需要文檔更容易理解。
1

關鍵是一組具有兩個基本特徵的屬性:唯一性和最小性。最小性意味着密鑰只有確保唯一性所需的最少數量的屬性。

有來選擇一個好的鍵三個標準普遍應用爲導向:

  • 熟悉 - 鍵應該是有意義的,熟悉的人誰使用它們的人
  • 簡單 - 鍵應該是簡單和簡潔地
  • 穩定性 - 鍵值應該經常改變

這些都是很好的準則,但不是絕對的要求。在所有情況下,功能需求和數據完整性的需求都應該決定使用哪些密鑰。