对于Id(实体)的长期与Guid,有什么利弊

时间:2010-02-09 11:23:39

标签: c# guid entity long-integer

我正在asp.net mvc上做一个web应用程序,我在我的实体的long和Guid数据类型之间做出选择,但我不知道哪个更好。有人说长得多快。 Guid也可能有一些优势。有人知道吗?

3 个答案:

答案 0 :(得分:17)

GUID可能不合适

GUID几乎总是会变慢,因为它们更大。这使您的索引更大。这会让你的桌子更大。这意味着,如果您必须全部或部分扫描您的表,则需要更长时间,您将看到性能降低。这是基于报告的系统中的一个巨大问题。例如,永远不会将GUID用作事实表中的外键,因为它的长度通常很大,因为事实表通常会被部分扫描以生成聚合。

还要考虑使用“长”是否合适。这是一个非常大的数字。如果您认为在某些时候表中可能有超过2个BILLION条目,则只需要它。我很少使用它们。

GUID也很难使用和调试。说,“客户记录10034存在问题,弗兰克,去检查一下”比说“{2f1e4fc0-81fd-11da-9156-00036a0f876a}有问题要容易得多......”Ints和longs也比较容易在需要时输入查询。

哦,并非你从不两次获得相同的GUID。众所周知,它发生在非常大的,断开连接的系统上,因此需要考虑,尽管我不会在大多数应用程序中进行设计。

当GUID适当时

当您使用已创建实体然后同步的断开连接的系统时,

GUID 是合适的。例如,如果某人在您的数据库中在移动设备上创建记录并同步它,或者您在不同的分支机构创建了实体并在晚上同步到中央商店。这就是他们给你的灵活性。

GUID还允许您在某些ORM方案中关联实体而不将其持久保存到数据库。 Linq to SQL(我相信EF)没有这个问题,尽管有时您可能会被迫将更改提交到数据库以获取密钥。

如果在客户端上创建GUID,则由于您创建的GUID不是顺序的,因此可能会因为数据库上的页面拆分而导致插入性能受损。

我的建议

这里要考虑很多东西。我的投票是不使用它们,除非你有一个令人信服的用例。如果性能确实是您的目标,请保持您的桌面小。保持你的领域小。保持您的数据库索引小而有选择性。

答案 1 :(得分:3)

<强>尺寸: 长是8个字节 Guid是16个字节

GUID 绝对 很有可能成为唯一,最好用于识别数据库中的个别记录。

long(DB中的标识)可能表示表中的唯一记录,但您可能在一个或多个不同的表中具有由相同ID(标识)表示的记录,如下所示:

TableA: PersonID int, name varchar(50)
TableB: ProductID int, name varchar(50)

SELECT PersonID from TableA where name =''
SELECT ProductID from TableB where name =''

两者都可以返回相同的值,但如果是GUID:

TableA: PersonID uniqueidentifier, name varchar(50)
TableB: ProductID uniqueidentifier, name varchar(50)

SELECT PersonID from TableA where name =''
SELECT ProductID from TableB where name ='

你很少有与从两个表返回的id相同的值

看看这里

答案 2 :(得分:2)

Guids使您可以更轻松地在API中创建“新鲜”实体,因为您只需为其指定Guid.NewGuid()的值即可。不依赖于来自数据库的自动递增密钥,因此这更好地将域模型与底层持久性机制分离。

缺点是,如果在SQL Server中使用Guid作为聚簇索引,插入会变得昂贵,因为很少将新行添加到表的末尾,因此需要经常重建索引。

另一个问题是,如果您在没有指定显式排序的情况下从这样的数据库中执行选择,则会以基本随机的顺序获得结果。