2009-09-12 75 views
4

我注意到asp_membership使用uniqueidentifier,对我来说,这看起来像是浪费空间,因为我想不出有什么特别的理由不能用身份代替它。uniqueidentifier vs identity

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

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

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

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

+1

因为你可能没有数百万的用户,为什么担心保存每个用户12个字节...... – 2009-09-12 05:12:10

+3

即使你有几百万的用户,节省12MB(加索引)的。谁在乎! – 2009-09-12 05:12:59

+1

@Mitch小麦 - 正是我的想法。 – David 2009-09-12 05:14:13

回答

12

我的建议是保持独立。你说得对,你需要去做很多工作(如你所描述的)才能摆脱它。为什么?为什么要乱用一些正常的东西?为了节省数据库空间?就像现在存储的便宜和硬盘驱动器或存储阵列的平均大小一样,您所谈论的是节省的空间量非常少。

这个想法没有投资回报。

+2

+1。投资回报率是一种很好的投入方式 – 2009-09-12 05:16:27

+2

如果它没有损坏... – 2009-09-12 05:21:48

+0

http://www.codinghorror.com/blog/archives/000817.html杰夫的好文章。 – 2009-09-12 05:54:42

0

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

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

你正在看很多很少的工作。

是的,你会得到一些性能改善,因为guids是不连续的,数字会是。但是,除非您看到一些主要的性能问题,否则这实际上并不足以成为实际进行修改的理由。

至少你会看到几个星期的工作和测试。在现实中几个月要确保你抓住每一个可能的变化。

+1

Nit要选择:如果使用NEWSEQUENTIALID()而不是NEWID()来默认主键列,则GUID *为* sequential。 – richardtallent 2009-09-12 08:04:19

+0

确实如此,但不知道他使用的是什么版本,并不能保证NEWSEQUENTIALID()可用。你会惊讶有多少人不知道,即使存在。 – mrdenny 2009-09-13 04:02:55

1

您不能转换UNIQUEIDENTIFIER列INT - 这里就是你需要什么在这种情况下,做的是

  • 添加新的ID列INT的身份 - 这将创建和填写栏值
  • 删除旧的GUID列中,您不再需要

当然,由于“用户名”是主键,因此将来自很多地方被引用,你必须在能够删除UserId列之前,需要做大量的清理工作。我认为在这种特殊情况下,我可能会将其保留为“原样” - 尝试使用UNIQUEIDENTIFIER作为SQL Server表中的主键和集群键的非常不错的选择。转换会在整个ASP.NET表格中造成大量的波纹变化 - 可能只是不值得。

马克

+1

> UNIQUEIDENTIFIER是一个非常糟糕的选择 如果您将应用程序出售给多个客户,并且以后的客户A购买客户B,那么将数据库与GUID PK合并而非Ints合并会非常容易,因为缺少重复。 – kevinw 2009-09-12 08:55:57

+0

如果您使用GUID作为集群密钥,那么您不会卖给多个客户,因为您的性能很差..... :-)只是在开玩笑! :-)同意 - 有些情况下它可能是有道理的。但在这种情况下,您可以轻松添加一个“CustomerID”INT来保持两者分开。总有几种方法可以做某些事情。但是GUID作为集群的关键是真的很糟糕。 – 2009-09-12 10:03:03