生成 GUID
Posted
技术标签:
【中文标题】生成 GUID【英文标题】:Generating GUID 【发布时间】:2010-07-05 09:38:55 【问题描述】:我正在考虑在使用 SQL Server 的 .net 应用程序中使用 GUID。我应该编写一个在输入的每条记录上 的存储过程,还是应该直接从应用程序生成它。
问这个问题的原因(如果有错请纠正我):
我(作为/预先)假设:
从数据库 时,您可以假设 DB 会记住先前生成的 GUID,而应用程序很难记住它。
【问题讨论】:
为什么记住以前的 GUID 很重要或需要? 如果您在数据库中使用 GUID 作为主键,请注意利弊 ;) codinghorror.com/blog/2007/03/… 【参考方案1】:SQL Server 内置了 GUID 的创建。无需为此编写单独的存储过程。
你可以使用
NEWID() NEWSEQUENTIALID()
两个过程之间的主要区别在于,如果顺序 GUID 用于主群集键,则应使用顺序 GUID。
我不确定为什么您希望数据库引擎记住之前生成的 GUID。
【讨论】:
【参考方案2】:不,你的假设是错误的:数据库不会记住任何东西 - 所以从这个角度来看没有任何好处。
如果您使用 GUID 作为 SQL Server 中的主键/集群键,这是一个坏主意(请参阅 here、here 或 here 为什么会这样),您应该至少使用newsequentialid()
函数作为该列的默认约束。
CREATE TABLE YourTable(ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID())
这样,数据库将为您的 PK 生成伪序列 GUID,从而使使用 GUID 作为 PK/CK 的负面影响至少可以忍受......
如果您不使用 GUID 作为主键,那么我认为在服务器上创建该 GUID 没有任何好处,真的。
【讨论】:
我可以想到一些有效的商业案例,其中使用(顺序)GUID 是一个不错的选择。 AMOF,如果我们几年前知道我们现在所知道的,我们很可能会实施它们并为我们省去很多麻烦(和金钱)尝试与我们的总部来回交换数据。 @lieven:您似乎在谈论复制-这可能是您真正需要它们的唯一有效情况。让它们成为你的 PK,但如果可能的话,使用其他东西作为你的集群键! @marc_s 谢谢。但是如果服务器重新启动呢??!我知道你会失去你的顺序。我错了吗?【参考方案3】:我的偏好是在应用程序而不是数据库中创建 GUID。
简化了插入后行的检索。 更轻松的域/业务层单元测试。 更快。至少对于实体框架。 http://blogs.msdn.com/b/adonet/archive/2010/06/28/performance-impact-of-server-side-generated-guids-in-ef.aspx【讨论】:
【参考方案4】:RFC41221: «不要假设 UUID 很难猜;例如,它们不应该用作安全功能(仅拥有授予访问权限的标识符)。一个可预测的随机数来源会加剧这种情况»。
在简单任务中增量 uint64 更好。
不要使用 GUID!如果需要安全。
http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b37b3438-90f4-41fb-adb9-3ddba16fe07c
【讨论】:
以上是关于生成 GUID的主要内容,如果未能解决你的问题,请参考以下文章