2010-03-31 37 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)并实现使用的 聚集索引