2010-08-06 57 views
2

我一直在学习ASP.net,并且一直在使用成员系统。当它自动生成表格时,我很惊讶地发现它使用一个名为'uniqueIdentifier'的字段类型作为主键,多年来,我一直使用整数字段设置为自动增量的标识。SQL Server唯一标识符与整数

这两种方法之间有什么区别(如果有的话),以及为什么.NET似乎赞成唯一标识符字段?

感谢您的任何信息!

汤姆

回答

1

我想说的是.NET不利于唯一标识符或GUID作为ID,但这个特殊的实现(ASP.NET SQL Server成员资格提供)一​​样。我怀疑那些开发数据库的人正在假设数据库的使用不是针对高流量站点,或者可能会进行大量报告。

也许他们试图避免集成到现有应用程序中的任何问题,或者将来的应用程序有一个用户密钥的情况。这可能是任何实体(PK,UserNumber等)的任何类型的键。在ASP.NET SQL Server实现中,发生冲突的可能性非常低/接近于零。

的一个缺点,我已经了解到的是,在一个GUID有一个聚集索引不能扩展到大容量的数据库。

我很大程度上在整数派PK阵营。它们很小,只需要几个字节,并且在数据库需要扩展时工作得非常好。

1

是什么这两种方法

为一个唯一标识符是16个字节,而一个int是4个字节之间的差(如果有的话) 。如果有像

http://bla.com?UserID=1

一个网址,你可以很容易地猜到别人的用户ID是什么,所以你可以尝试2或4等等等等

当你有这个作为用户名C7478034-BB60-4F5A-BE51-72AAE5A96640它是不容易和也uniqueidentifiers应该是唯一翻过所有计算机

,如果他们使用NEWID()代替NEWSEQUENTIALID()那么他们将得到碎片和页拆分,看看Best Practice: Do not cluster on UniqueIdentifier when you use NewId

+0

如果软件通过猜测ID的允许战功,再有就是在软件中一个明显的缺陷,并使用一个比较模糊的ID,以防止这种攻击并不实际处理问题的,虽然这是一个有趣的问题我从来没有尽管如此。我认为对于可收藏的页面(例如产品描述页面),一个简单的ID = x比一个大字符串更令人难忘和更好看。在使用整数时,我也很少用尽索引,但是当我将索引转换为bigint时非常容易。 – 2010-08-06 13:08:45

2

uniqueidentifier类型是SQL的Guid类型(对应的BCL类型是System.Guid)。概念上,Guids表示应该是唯一的随机128位数字。尽管Guid有批评者(严格来说,guid比比较ints稍微慢一点点),但他们的随机性使他们在像复制这样的环境中很有用,在这种环境中使用递增密钥可能很困难。

+0

好点谢谢! – 2010-08-06 13:09:53