uniqueidentifier vs identity

时间:2009-09-12 05:04:54

标签: sql sql-server tsql asp.net-membership data-modeling

我注意到asp_membership使用uniqueidentifier,对我来说,这似乎是浪费空间,因为我无法想到一个特殊的理由不用身份替换它。

但是,SQL Server不允许我将其更改为int。它说“在连接的数据库服务器上不支持从uniqueidentifier转换为int”。在谷歌搜索后,似乎我必须打破所有的关系等,然后手动删除列并重新添加为int。你们知道更好的方法吗?

我认为我不会处理多个数据库,因此对我来说似乎不需要uniqueidentifier。你同意吗?

请注意:我正在开始一个新的Web应用程序。你是否仍然认为解决这个问题会很困难?

另请注意,我的任何主键都不属于我的网址。

3 个答案:

答案 0 :(得分:12)

我的建议是不管它。你是否需要去做很多工作(正如你所描述的)来摆脱它。为什么?为什么搞乱一些有效的东西?为了节省数据库空间?现在,随着存储的便宜,以及硬盘驱动器或存储阵列的平均大小,您所谈论的空间节省是非常微不足道的。

这个想法没有投资回报率。

答案 1 :(得分:1)

您无法将UNIQUEIDENTIFIER列转换为INT - 这是您在这种情况下需要做的事情

  • 将您的新ID列添加为INT IDENTITY - 这将创建并使用值
  • 填充列
  • 删除您不再需要的旧GUID列

当然,由于“UserID”是主键,因此将从很多地方引用,所以在删除UserId列之前,您必须进行大量的内务管理。

虽然我赞赏你的想法和UNIQUEIDENTIFIER的实现是SQL Server表中主要和集群密钥的一个非常糟糕的选择,但我认为在这种特殊情况下,我可能会“按原样”保留它 - 尝试转换这会在整个ASP.NET表中引起大量的涟漪变化 - 可能只是不值得努力。

马克

答案 2 :(得分:0)

Uniqueidentifier和int是非常不同的数据类型。你不能只将guid更改为int。您需要删除所有关系,为父表分配数值,向所有子表添加数字列,使用连接设置子表中的所有值。删除所有guid列,使int列成为主键。建立所有关系。

更不用说更改每个与数据库对话的应用程序,并期望该值为guid,以便它可以使用整数值。

你正在寻找很多工作而收益甚微。

是的,你会得到一些性能提升,因为guids不是顺序的,而且数字会是。但是,除非你从中看到一些重大的性能问题,否则这真的不足以成为实际改变的理由。

至少你会看几周的工作和测试。实际上是几个月来确保你抓住每一个可能的变化。

相关问题