Sql server 什么时候使用guid作为主键?
可能重复:Sql server 什么时候使用guid作为主键?,sql-server,primary-key,guid,uuid,microsoft-sync-framework,Sql Server,Primary Key,Guid,Uuid,Microsoft Sync Framework,可能重复: 是否存在在SQLServer2005/8DB中必须使用GUID作为主键的情况。例如,使用MS Sync Framework是否强制执行此操作或数据复制?当数据库未集中或某些收集是远程执行时。我使用GUID作为主键,因为当我用分布式数据库和一个与所有分布式数据库的数据同步的中央数据库构建应用程序时,我不希望使用复合主键。对于guid,我确信(几乎*)当我将数据从所有DBs拉入中心DBs时,不会发生冲突(约束冲突) *在两个不同的位置生成相同的GUID的可能性很小,但并非不可能。如果需
是否存在在SQLServer2005/8DB中必须使用GUID作为主键的情况。例如,使用MS Sync Framework是否强制执行此操作或数据复制?当数据库未集中或某些收集是远程执行时。我使用GUID作为主键,因为当我用分布式数据库和一个与所有分布式数据库的数据同步的中央数据库构建应用程序时,我不希望使用复合主键。对于guid,我确信(几乎*)当我将数据从所有DBs拉入中心DBs时,不会发生冲突(约束冲突)
*在两个不同的位置生成相同的GUID的可能性很小,但并非不可能。如果需要通过复制同步多个数据库,则可以使用GUID作为密钥 使用guid的另一个原因是,如果您想在某个远程客户端(如winforms应用程序)上创建行,然后通过web服务等将这些行提交给服务器 如果您这样做,我强烈建议您确保基于非唯一的自动递增int指定自己的聚集索引。在聚集索引为guid的表中插入行可能会造成相当大的开销 更新:下面是一个如何设置如下表的示例:
CREATE TABLE [dbo].[myTable](
[intId] [int] IDENTITY(1,1) NOT NULL,
[realGuidId] [uniqueidentifier] NOT NULL,
[someData] [varchar](50) NULL,
CONSTRAINT [PK_myTable] UNIQUE NONCLUSTERED
(
[realGuidId] ASC
)
)
CREATE CLUSTERED INDEX [IX_myTable] ON [dbo].[myTable]
(
[intId] ASC
)
您可以按正常方式在表中插入,例如:
INSERT INTO myTable VALUES(NEWID(), 'Some useful data goes here')
更新:我听了一个非常好的dotnetrocks插曲,其中谈到了这一点,值得一听-对不起,这是一个复制品。我现在就关上它!为了清楚起见,为了分发/复制的目的,我将把PK作为GUID(这是我们需要的),但是引入了一个新的非唯一聚集索引,它可能(在复制之后)包含多个相同的条目。然后,如何让SQL Server在插入时使用此索引而不是PK,或者它是自动的?+1用于单独的聚集索引。千万不要将guid用作聚集索引,性能是非常好的。只需一条注释,您就可以使用新的newsequentialid()功能(假设为Sql Server),该功能将按顺序增加可用于聚集索引的guid。随机分布的数据(newid()上的聚集索引)如果您使用的分区中的随机位置使数据写入不同的硬盘驱动器,则可能会提高性能。或者查找一些自然数据用作聚集索引:例如“公司名称”或“位置”或类似的内容。如果单独的聚集索引是未使用的列,则有什么好处?GUID冲突的风险是其中之一我愿意接受;)是的,别误会我。虽然发生这种情况的概率不是0,但guid非常适合这种用途。:-)只需确保您没有使用GUID作为SQL Server中的聚集索引—这样做很可怕。使用INT(IDENTITY)或类似的东西——更好。