長炭

2014-06-19 28 views
0

主鍵我有這樣長炭

user(#id, login, password) 

一個表,但我想讓它就像

user(#login, password) 

因爲登錄是爲每個用戶

我想唯一知道這是否是一個好的解決方案?它會影響長鍵字(索引)的主鍵的速度(性能)?

回答

0

這總是一個有趣的問題。這實際上是數據庫設計中的一個長期爭論,「自然」與「替代」密鑰。

由於這是問題不僅僅是這個問題的重複,我會提供一個答案,但也有一些鏈接到核心問題,因爲它已被很好的覆蓋。

與最常見的數據庫性能問題一樣,它最終取決於。 :)
如果您的登錄很短,和/或您沒有大量的登錄名,您可能看不到與整數鍵的很多區別。
如果有人被允許更改他們的登錄信息,您可能還會考慮一下......如果是這樣,您需要使用代理整數來保留密鑰。


欲瞭解更多有關這是一個普遍的問題,以及對性能的一些其他人測試:

Deciding between an artificial primary key and a natural key for a Products table

Surrogate vs. natural/business keys

http://en.wikipedia.org/wiki/Surrogate_key

+0

從你的鏈接「恕我直言,總是支持代理主鍵。主鍵應該沒有意義,因爲這個意義可以改變,甚至國家名稱可以改變,國家可以存在和消失,更不用說產品。 ,這可以發生在自然鍵上。「這正是我所建議的,但顯然對此事有強烈而有經驗的意見讓我低估了,而通用的「取決於」的答案卻贏了?顯然用戶登錄可以改變,顯然它可能很大,所以顯然PK應該是一個整數。 –

-1

切勿使用char或varchar主鍵。

使用一個自我遞增的身份作爲一個PK(tinyint,smallint,int甚至bigint),這將用於鏈接到其他表作爲他們的FK,並且會更快。

如果要常用,您仍然可以在登錄字段上創建唯一的非聚簇索引。

+0

* NEVER *是如此惡劣聲明 - ISO國家或貨幣代碼的表格怎麼樣?這些列的CHAR(3)列(例如美國的'USA','RUS'等國家,'USD','CAD','GBP'的貨幣)確實使**優秀**主鍵在SQL服務器表! –

+0

countryID的效果更好。然後是一個帶有簡碼(美國,RUS等)的國家表以及像長名字這樣的相關信息。相當標準的DB設計。你說得對,短的字符不是「不好」(你錯了,他們是優秀的),但沒有什麼效率像一個整數,即使如此,越小越好。 –

+0

爲什麼varchar不能用作FK? – Youssef