可能重复:
GUID/UUID 数据库键的优缺点
在 SQL Server 2005/8 数据库中,是否存在必须使用 GUID 作为主键的情况。例如,使用 MS Sync Framework 会强制执行此操作,还是数据复制?
可能重复:
GUID/UUID 数据库键的优缺点
在 SQL Server 2005/8 数据库中,是否存在必须使用 GUID 作为主键的情况。例如,使用 MS Sync Framework 会强制执行此操作,还是数据复制?
如果您需要通过复制同步多个数据库,您可以使用 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 插曲,它谈到了这一点值得一听 -节目 #447
我使用 GUID 作为主键,因为当我使用分布式数据库和一个与所有分布式数据库中的数据同步的中央数据库构建应用程序时,我不想使用复合主键。使用 GUID,我确信(几乎*)当我将所有数据库中的数据拉入中央数据库时,我不会发生冲突(违反约束)。
* 在两个不同的地方生成相同的 GUID 的可能性很小,但并非不可能。
当数据库不是集中式的或某些收集是远程执行的。