【问题标题】:uniqueidentifier vs identity唯一标识符与身份
【发布时间】:2010-11-27 17:05:42
【问题描述】:

我注意到 asp_membership 使用 uniqueidentifier,对我来说,这似乎是在浪费空间,因为我想不出不将其替换为身份的特定原因。

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

我认为我不会处理多个数据库,所以我似乎不需要 uniqueidentifier。你同意吗?

请注意:我正在启动一个新的 Web 应用程序。你还认为解决这个问题会那么难吗?

另外,请注意,我的任何主键都不会成为我的 URL 的一部分。

【问题讨论】:

  • 鉴于您可能没有数百万用户,为什么还要担心为每个用户节省 12 个字节...
  • 即使您拥有数百万用户,也能节省 12MB(加上索引)。谁在乎!
  • @Mitch Wheat - 正是我的想法。
  • @progtick:有人标记为关闭。如果您想问是否有办法将 GUID 列更改为标识列,也许这个问题会更好。

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


【解决方案1】:

我的建议是不要管它。你是对的,你需要做很多工作(如你所描述的)才能摆脱它。为什么?为什么要搞乱一些刚刚起作用的东西?为了节省数据库空间?如今,与存储一样便宜,以及硬盘驱动器或存储阵列的平均大小,您所谈论的空间节省量完全是微不足道的。

这个想法没有投资回报。

【讨论】:

  • Jeff 没有足够注意在数据库表中使用 GUID 的所有真正糟糕的副作用,尤其是。在 SQL Server 中.....阅读 Kim Tripp 的博客,了解为什么 使用 GUID 作为主键:sqlskills.com/BLOGS/KIMBERLY/post/…
  • 明智的评论。但是 - 在某些特定情况下,您真的需要一个非常短的键,以便每页容纳更多行以提高性能。在这种情况下,原始问题也完全有意义。
【解决方案2】:

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

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

你做了大量工作却收获甚微。

是的,您会获得一些性能改进,因为 guid 不是连续的,而数字是连续的。但这并不足以成为实际进行更改的理由,除非您从中看到一些重大的性能问题。

至少您会花费数周的时间进行工作和测试。在现实中几个月,以确保您抓住每一个微小的变化。

【讨论】:

  • 无需选择:如果您使用 NEWSEQUENTIALID() 而不是 NEWID() 来默认主键列,GUID 连续的。
  • 是的,但不知道他使用的是什么版本,不能保证 NEWSEQUENTIALID() 可用。你会惊讶于有多少人不知道它的存在。
【解决方案3】:

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

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

当然,由于“UserID”是主键,因此会在很多地方被引用,所以在删除 UserId 列之前,您必须做很多工作。

虽然我赞赏您的想法和实现 UNIQUEIDENTIFIER 对于 SQL Server 表中的主键和集群键是一个非常糟糕的选择,但我认为在这种特殊情况下,我可能会保持“原样” - 尝试转换这将导致整个 ASP.NET 表中的大量涟漪变化 - 可能只是不值得付出努力。

马克

【讨论】:

  • > UNIQUEIDENTIFIER 是一个非常糟糕的选择 如果您将应用程序出售给多个客户,然后客户 A 购买客户 B,那么将数据库与 GUID PK 而不是 Ints nrcause 合并会容易得多没有重复。
  • 如果您使用 GUID 作为您的集群键,您将不会向多个客户销售,因为您的性能太差了..... :-) 开个玩笑! :-) 同意-在某些情况下可能有意义。但在这种情况下,您可以轻松添加“CustomerID”INT 以将两者分开。做某事总是有几种方法。但是作为集群键的 GUID 真的很糟糕 - 时期。
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 2014-03-05
  • 2012-06-02
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多