2009-09-27 93 views
0

我正在將一個字符串保存到一個表中,它必須是唯一的,我將在保存之前檢查它是否已經存在。這不是其他領域。單列或兩列?

我可以只有一個字符串作爲主鍵的列表,或者我應該有一個唯一標識符ID列嗎?爲何在這兩種情況下?

回答

6

如果你的字符串是唯一的(並且將永遠是唯一的),那麼把它作爲唯一的列和主鍵就可以了。

我會用一個單獨的ID的唯一原因是,如果任一

  1. 將成爲在未來的某個時刻非唯一的;或
  2. 如果它是一個大字符串,並且您希望另一個表列引用它(外鍵)。

我會將YAGNI原理應用於這兩種情況,並在發生這種情況時擔心。另外,對於數據庫應用程序,最好不要「在保存之前檢查它是否已經存在」。我傾向於試圖保存它,並在存在的情況下捕獲錯誤。由於它是一個主鍵(或唯一約束),這將起作用。

檢查是否存在,然後插入通常會導致競爭條件。

+0

+1依靠一個唯一的約束,而不是編碼手動檢查。 – APC 2009-09-27 23:48:06

2

字符串可以更改嗎? 字符串的長度是多少(重要的是如果其他表將把它用作外鍵)?

通常,如果該值可能發生變化,或者您需要其他表與其相關聯,那麼我會建議有一個指定的ID字段。

1

如果字符串始終是唯一的,那麼應該只使用一列。爲了節省空間(儘管可能很少),您不需要另一個ID列。將唯一ID約束添加到列以僅強制唯一值。

如果您想檢查值是否存在,那麼它取決於您。儘管始終通過唯一的ID錯誤不是檢查表中是否存在該值的正確方法。保存實際錯誤的錯誤處理並手動進行檢查。例外情況可能會造成很小的性能下降,應該保留用於真正的程序例外,而不是常規。

但是,如果由於某種原因,字符串將在另一列中被引用,我會創建一個ID字段。如果字符串長度爲32個字符,則每個記錄需要32個字節的空間(假定爲ASCII)。作爲主鍵的32位int只需要4個字節(32/8 = 4)。因此,如果您在另一個表中引用字符串,則您將通過使用整數ID節省空間。另外,如果您使用整數ID作爲主鍵,您可以查看按字符串對索引進行聚類(如果您將通過字符串而不是ID進行大量查找)。在這種情況下,按字符串而不是主鍵進行分組可能會對性能有很大的影響。

1

你確定這個字符串是唯一的嗎?沒有人會永遠能夠改變它?如果是這樣就沒問題。其他人只需使用編號