在C#和SQL Server中将int转换为guid时,我得到不同的值.
在C#中我使用这种方法
public static Guid Int2Guid( int value )
{
byte[] bytes = new byte[16];
BitConverter.GetBytes( value ).CopyTo( bytes, 0 );
return new Guid( bytes );
}
Console.Write( Int2Guid( 1000 ).ToString() );
// writes 000003e8-0000-0000-0000-000000000000
Run Code Online (Sandbox Code Playgroud)
在SQL Server中我使用
select cast(cast(1000 as varbinary(16)) as uniqueidentifier)
-- writes E8030000-0000-0000-0000-000000000000
Run Code Online (Sandbox Code Playgroud)
他们为什么表现不同?
我正在设计一个需要支持复制的新数据库,而我却决定选择什么作为我的主键.
在我们当前的主键数据库中,我们使用两个int列,第一列是identity,另一列用于描述插入行的服务器.现在我想避免为主键使用两列,而只是使用一列.到目前为止,我有两种方法:
对我的主键使用GUID
这个将确保在任意数量的服务器上始终存在唯一密钥.我不喜欢这个,是GUID是16字节大小,当用于跨越许多表的外键时,它将浪费空间.在编写查询时也很难使用它,查询速度会慢一些.
使用int或bigint,并为每个服务器上的每个表手动指定种子和增量值.例如,如果有两台服务器,第一台服务器上的X表将从1号开始,第二台服务器上的X表将从2号开始,每台将增加2.因此会有(1,3,5,...) ..)首先,和(2,4,6,...)在第二台服务器上.这种设计的好处在于它在编写查询时更容易使用,速度快,而且外键使用的空间更少.不好的是,我们永远不知道将运行多少台服务器,因此很难说出增量值是多少.此外,在服务器上管理架构更改也更加困难.
管理多个服务器的最佳实践是什么?如果出现这种情况,最好的方法是什么?