【问题标题】:Create Guid PK in Database VS. in Code在数据库 VS 中创建 Guid PK。在代码中
【发布时间】:2012-03-13 16:04:51
【问题描述】:

什么是在数据库上生成主键或在应用程序代码中生成主键“更好”,特别是在为键使用 GUID/UniqueIdentifier 数据类型时。

我已经阅读了使用 Guid 和 int 数据类型之间的区别,听起来 Guid 对于所谓的“离线生成”是可行的。

例如

在一个项目(我们使用实体框架)中,我们在应用程序代码中使用Guid.NewGuid() 在插入数据时生成PK,而不是在数据库中使用NEWID() 约束。

这是一个坏方法吗?

我的担忧是:

  • 数据库索引:数据库性能,因为 Id 可能不是连续的
  • 密钥已被使用的概率为 640 亿分之一。 (考虑到应用程序不会很大,但可能需要增长空间)
  • 也许还有其他缺点?

【问题讨论】:

    标签: sql-server database architecture


    【解决方案1】:

    实际上,GUID 可以从 SQL Server 2005 开始连续。在名为 NEWSEQUENTIALID() 的函数中有一个函数,链接 here

    创建一个大于任何 GUID 先前生成的 GUID 自 Windows 启动以来,此功能在指定计算机上。后 重新启动 Windows,GUID 可以从较低的范围再次启动,但 仍然是全球独一无二的。当 GUID 列用作行时 标识符,使用 NEWSEQUENTIALID 可以比使用 NEWID 更快 功能。这是因为 NEWID 函数会导致随机活动 并使用更少的缓存数据页。使用 NEWSEQUENTIALID 也有助于 完全填满数据和索引页面。

    【讨论】:

    • 是的,我知道 NEWSEQUENTIALID() 抱歉,这就是我对“NEWID()”的意思,这并没有真正说明我的问题是在数据库中创建更好还是在数据库中创建更好在代码中,或者更确切地说可以在代码中创建?
    • 我觉得用代码创建就可以了。据我所知,guid是根据服务器的时间、mac地址或ip地址(不确定)生成的。想不出任何关键的区别。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2020-06-23
    • 2021-08-30
    • 2023-04-05
    • 2013-02-13
    相关资源
    最近更新 更多