2011-01-08 198 views
3

我有一個用戶表,其中有數以百萬計的行,並有一個字段用戶名(varchar),我應該讓它成爲主鍵而不是唯一的索引?添加一個額外的字段user_id(int)並使其成爲主鍵有什麼優點或缺點?我不明白我會在哪裏使用user_id,除非說連接條件,int上的連接會比varchar上的連接快嗎?或是否?(因爲這兩個字段都被索引)數據庫主鍵

更新:假設更改用戶名不是一個選項。

+1

您是否曾希望用戶能夠更改他們的用戶名? VARCHAR有多長?如果後者的關鍵字長度更長,則基於INTEGER的查找可能比VARCHAR上的查找更快。 – Rob 2011-01-08 14:36:23

+0

不,我不希望他們更改用戶名 – user157195 2011-01-08 14:39:22

+1

你絕對,100%肯定這是永遠不會需要的?我希望我能預測未來... – Rob 2011-01-08 14:44:20

回答

3

首先,我第二次感謝弗雷德裏克的評論:我堅信不會將任何商業或功能價值歸於表格的主鍵。現在可能沒有選擇更改用戶名的選項,但可能稍後會有。即使沒有,最好是養成習慣,並與所有表格保持一致,而不是混合範式。

使用數字(或以某種方式順序)主鍵的次要原因是插入和更新速度。雖然這可以更改,但默認情況下,表上的主鍵也是聚簇索引。聚集索引確定表中行的物理順序,因此按順序插入一個值會導致數據庫引擎在所有行之後移動,以便將其插入到適當的位置。對於具有數百萬行的表,這可以是不重要的插入或更新操作。

2

我更喜歡數字PK的原因是我可以很容易地改變用戶名。

如果用戶名也是主鍵,則意味着與該用戶相關的所有記錄也必須在更改用戶名時進行更改。

請注意,您的數據庫可以通過多種方式爲數字PK生成正確的ID。在MySQL上它增加了一個「auto_increment」屬性到字段上,在Postgres和Oracle上它是通過序列。

如果您有數以億計的行,但您是正確的,你可能會更好地使用用戶名。我儘量避免變種PK在表格之間浮動,只會讓那些跟着我進入代碼的人保持整個事情變得更加困難,除非這是絕對必要的。

+0

如果更改用戶名不是一個選項,那麼沒有理由使用額外的數字PK? – user157195 2011-01-08 14:40:32

3

我希望添加一個額外的字段作爲主鍵。

主要原因是-imho-主鍵應該沒有「商業」價值。主鍵只是一個管理項目,它只對數據庫非常重要,因此可以保證完整性。
正如Brian已經提到的那樣,通過添加代理主鍵,您可以 - 在您的情況下 - 允許用戶更改其用戶名而不會出現問題。

主鍵的值不應該改變:否則當你有很多外鍵時更新可能會變得非常昂貴。所有這些變化應該級聯到相關表格。

除此之外,整數例如是4個字節,而您的usename列要大得多。
這不僅意味着您將在相關表格中佔用更多空間,而且這也意味着您的索引將會變大。
構成索引的存儲桶將包含更少的「記錄指針」,這意味着您將擁有更多存儲桶,這意味着您的索引將會變慢。