2010-03-31 43 views
15

我目前正在計劃開發音樂流應用程序。我想知道在服務器上的表格中作爲主鍵會更好。 ID int或唯一字符串。數據庫設計Primay Key,ID vs字符串

方法1:

歌曲表: SongID(INT),名稱(字符串),*藝術家**(字符串),長度(INT),*相冊**(串)

流派表 類型(串),名稱(字符串)

SongGenre: *** SongID ****(INT),***戈NRE ****(字符串)

方法2

歌曲表: SongID(INT),名稱(字符串),* ArtistID **(INT),長度(INT) * ** ALBUMID(INT)

流派表 GenreID(INT),名稱(字符串)

SongGenre: *** SongID ****( INT),*** GenreID ****(INT)

重點:大膽 =主鍵,*字段** =外鍵

我目前正在設計使用方法2,因爲我相信它將加快查找性能,並且佔用更少的空間,因爲int需要的空間少於字符串。

是否有任何理由,這是不是一個好主意?有什麼我應該知道的?

回答

16

你是做正確的事 - 標識字段應該是基於數字和不串,既節省空間和性能方面的原因(對字符串匹配關鍵字比對整數匹配慢)。

+1

+1絕對。一個ID應該(幾乎總是)是一個INT - 其他任何東西都沒有什麼意義(除了少數選擇的情況) – 2010-03-31 09:39:31

+0

我會補充說,你應該在類型名稱上加一個唯一索引以防止有名爲「布魯斯」的三種流派。如果存在的話,始終在自然鍵上添加一個唯一索引。 – HLGEM 2010-03-31 17:05:38

+14

-1:這些是做出設計決定的錯誤原因。根據設計是否正確進行設計決策。然後,如果有性能問題,請根據需要進行調整和重新設計。 – 2010-04-16 18:10:30

0

MSSQL可以使用一個int時產生這些ID對你的(見IDENTITY關鍵字)

3

我的建議是:使用IDS。

您可以重命名「流派」有20000首歌曲不破壞任何東西。

這背後的想法是,ID標識表中的行。無論這行有什麼東西在這個問題中都不重要。

+0

如果重命名流派:您不重命名該鍵,則重命名該名稱。那也不會破壞任何東西。 ;-) – Prutswonder 2010-03-31 09:52:56

+0

這將是名爲「Disco Dance」的搖滾樂鍵。但這並不是錯的。 – graffic 2010-04-06 20:27:05

3

這在很大程度上是個人喜好的問題。

我個人的看法和做法是始終使用整數鍵和總是使用代理,而不是自然鍵(所以不要使用像社會安全號碼或直接的流派名稱的任何東西)。

有情況下,自動編號字段是不恰當或不結垢。在這些情況下,使用GUID是有意義的,GUID可以是數據庫中沒有本機數據類型的字符串。

8

這有什麼理由不是個好主意嗎?有什麼我應該知道的?

是的。如果您需要在單個數據庫之外唯一標識相同的數據,那麼整數ID非常糟糕。例如,如果您必須將相同的數據複製到可能存在數據的另一個數據庫系統中,或者您擁有分佈式數據庫。最值得注意的是,像7481這樣的整數在該數據庫之外沒有任何意義。如果以後你需要增加數據庫,那麼在不通過手術去除數據的情況下就不可能。

要記住的另一件事是整數ID不那麼靈活,所以它們不能很容易地用於例外情況。互聯網協議的設計者理解這一點,並通過以某種方式(廣播IP,私有IP,網絡IP)以某種方式分配某些數字塊來採取預防措施。但這是唯一可能的,因爲圍繞這些數字的用法有一個協議。許多數據庫不在這樣一個明確定義的協議內運行。這就好比試圖確定「強類型」編程範例是否比「弱/動態類型」編程範例更好。這將取決於你需要做什麼。

4

從軟件角度來看,全球唯一的GUID更好。從

行情:Primary Keys: IDs versus GUIDs

使用GUID作爲行標識值感覺更natural--和 肯定更真實unique--比32位整數。數據庫大師Joe Celko seems to agree。 GUID主鍵非常適合許多 開發方案(如複製),或者當您需要在數據庫之外生成主鍵時。但它仍然是平衡和 16字節的GUID傳統的4字節整數ID之間的權衡的問題 :

GUID優點

  • 獨特的橫跨每個表,每個數據庫,每個服務器
  • 允許輕鬆合併來自不同數據庫的記錄
  • 允許在多個服務器上輕鬆分發數據庫
  • 您可以生成ID在任何地方,而不必往返於數據庫
  • 大多數複製方案需要GUID列反正

GUID缺點

  • 它比傳統的4字節指數大的高達4倍值;這會產生嚴重的性能和存儲的影響,如果 你不小心
  • 繁瑣的調試其中userid =「{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}」
  • 生成的GUID應該是最佳性能部分的順序(如,NEWSEQUENTIALID()在SQL 2005)並實現使用的 聚集索引