使用SQL Server文件流GUID作为主键
我正在创建一个名为使用SQL Server文件流GUID作为主键,sql,sql-server,Sql,Sql Server,我正在创建一个名为Photo的简单表来存储User表中定义的人员/组的照片。我使用的是Microsoft SQL Server的功能,因为所有其他用户数据都已存储在SQL Server中,这对我来说比编写单独的方法从磁盘手动检索与数据库中的条目直接相关的对象更有意义 每个用户一次只能有一张与他们相关联的照片(目前,但将来可能会改变),而且FILESTREAM需要GUID列来引用它存储到磁盘上的文件,因此这就是我为photo提出的模型: UserID int NOT NULL UNIQUE Pho
Photo
的简单表来存储User
表中定义的人员/组的照片。我使用的是Microsoft SQL Server的功能,因为所有其他用户数据都已存储在SQL Server中,这对我来说比编写单独的方法从磁盘手动检索与数据库中的条目直接相关的对象更有意义
每个用户一次只能有一张与他们相关联的照片(目前,但将来可能会改变),而且FILESTREAM
需要GUID
列来引用它存储到磁盘上的文件,因此这就是我为photo
提出的模型:
UserID int NOT NULL UNIQUE
PhotoID uniqueidentifier ROWGUIDCOL NOT NULL
PhotoBitmap varbinary(MAX) FILESTREAM NULL
我的问题是(如果这个模型适合我的应用程序),我是否应该使用
PhotoID
作为主键,因为它已经是唯一的并且是必需的?在我看来,这比只为主键创建一个单独的INT
列要简单,但我不知道它是否“正确”。我个人对大多数主键和集群键使用INT-IDENTITY
您需要分开主键,这是一个逻辑结构-它唯一地标识您的行,它必须是唯一和稳定的,不为NULL
。GUID
也适用于主键,因为它保证是唯一的。如果使用SQL Server复制,将GUID
作为主键是一个不错的选择,因为在这种情况下,您仍然需要一个唯一标识的GUID
列
SQL Server中的集群键是一种物理结构,用于对数据进行物理排序,而且要正确获取要困难得多。通常,SQL Server上的索引女王Kimberly Tripp也需要一个好的集群密钥,该密钥必须是唯一的、稳定的、尽可能窄的,并且最好是不断增加的(即INT-IDENTITY
)
请参见她在这里发表的关于索引的文章:
GUID
对于集群键来说是一个非常糟糕的选择,因为它很宽,完全是随机的,因此会导致坏的索引碎片和较差的性能。此外,聚集键行也存储在每个非聚集(附加)索引的每个条目中,因此您确实希望保持较小的值-GUID
为16字节,而INT
为4字节,对于多个非聚集索引和数百万行,这会产生巨大的差异
在SQL Server中,默认情况下,主键是集群键,但不一定是。您可以轻松地使用GUID
作为非集群主键,使用INT-IDENTITY
作为集群键—只需稍微注意一下即可