簡體   English   中英

數據庫設計Primay Key,ID vs String

[英]Database Design Primay Key, ID vs String

我目前正計划開發音樂流媒體應用程序。 我想知道作為服務器上的表中的主鍵會更好。 ID int或唯一字符串。

方法1:

歌曲表: SongID (int),Title(字符串),* Artist **(字符串),Length(int),* Album **(string)

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

SongGenre:*** SongID ****(int),***類型****(字符串)

方法2

歌曲表: SongID (int),Title(字符串),* ArtistID **(int),Length(int),* AlbumID **(int)

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

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

鍵: 粗體 =主鍵,*字段** =外鍵

我目前正在使用方法2進行設計,因為我相信它會加快查找性能並減少使用空間,因為int占用的空間比字符串少得多。

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

你正在做正確的事情 - 身份字段應該是數字而不是基於字符串,既節省空間又出於性能原因(字符串上的匹配鍵比整數上的匹配慢)。

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

是。 如果需要在單個數據庫之外唯一標識相同的數據,則整數ID非常糟糕。 例如,如果必須將相同的數據復制到具有可能預先存在的數據的另一個數據庫系統中,或者您具有分布式數據庫。 7481的是,像7481這樣的整數在該數據庫之外沒有任何意義。 如果以后需要增長該數據庫,則可能無法通過手術刪除您的數據。

另外要記住的是整數ID不夠靈活,因此不能輕易用於特殊情況。 互聯網協議的設計者理解這一點並采取預防措施,將某些數字塊以某種方式分配為“特殊”(廣播IP,私有IP,網絡IP)。 但這只是可能的,因為有一個圍繞這些數字使用的協議 許多數據庫不能在如此明確定義的協議中運行。

FWIW,有點像試圖決定“強類型”編程范式是否優於“弱/動態類型”編程范例。 這取決於你需要做什么。

從軟件的角度來看,GUID在全球范圍內更為獨特。

引用自: 主鍵:ID與GUID

使用GUID作為行標識值比32位整數感覺更自然 - 當然更真實唯一。 數據庫大師Joe Celko 似乎同意 GUID主鍵很適合許多開發方案,例如復制,或者需要在數據庫外部生成主鍵時。 但它仍然是在平衡傳統的4字節整數ID和16字節GUID之間的權衡的問題:

GUID優點

  • 每個表,每個數據庫,每個服務器都是唯一的
  • 允許輕松合並來自不同數據庫的記錄
  • 允許跨多個服務器輕松分發數據庫
  • 您可以在任何地方生成ID,而不必往返數據庫
  • 大多數復制方案無論如何都需要GUID列

GUID缺點

  • 它比傳統的4字節索引值大4倍; 如果你不小心,這可能會產生嚴重的性能和存儲影響
  • 在userid ='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}'的地方調試很麻煩
  • 生成的GUID應該是部分順序的以獲得最佳性能(例如,SQL 2005上的newsequentialid())並允許使用聚簇索引

我的建議是:使用id。

你可以用20000首歌曲重命名“流派”而不會破壞任何東西。

這背后的想法是id標識表中的行。 無論行是什么,這個問題都無關緊要。

這在很大程度上取決於個人偏好。

我個人的觀點和做法是始終使用整數鍵並始終使用代理而不是自然鍵(所以永遠不要使用社會安全號碼或類型名稱直接使用)。

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

使用int時,MSSQL可以為您生成這些id(請參閱IDENTITY關鍵字)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM