C# 大型表的最佳主键格式

C# 大型表的最佳主键格式,c#,asp.net,sql-server,entity-framework,sql-server-2008,C#,Asp.net,Sql Server,Entity Framework,Sql Server 2008,我正在开发一个asp.net应用程序,其中包含一些潜在的大型数据表。我想知道定义主键的最佳方式是什么。我知道以前有人问过这个问题,但由于这是针对特定情况,我认为这个问题是正确的 我在SQLServer2008数据库上使用EntityFramework4 考虑到以下情况,定义主键的可能性是什么: 随着时间的推移,记录的数量很可能会超过32位边界,因此不可能自动递增整数 无法在表中其他列的组合上定义主键 出于数据同步的原因,应用程序生成的id比数据库生成的id更可取。此外,在EF中,这意味着要额外往

我正在开发一个asp.net应用程序,其中包含一些潜在的大型数据表。我想知道定义主键的最佳方式是什么。我知道以前有人问过这个问题,但由于这是针对特定情况,我认为这个问题是正确的

我在SQLServer2008数据库上使用EntityFramework4

考虑到以下情况,定义主键的可能性是什么:

  • 随着时间的推移,记录的数量很可能会超过32位边界,因此不可能自动递增整数
  • 无法在表中其他列的组合上定义主键

  • 出于数据同步的原因,应用程序生成的id比数据库生成的id更可取。此外,在EF中,这意味着要额外往返数据库以检索新生成的id
  • 为了提高插入性能,最好使用顺序键
  • 我认为一个(顺序)GUID的下限需要空间。
  • 对于字符串id,最好不区分大小写
  • 到目前为止,我自己想到的是一个自定义算法,它生成一个日期时间部分和一个随机部分,转换成十六进制字符串表示形式。这使我的字符串略短于guid。我仍然可以将其转换为base64,但这将违反第6项


    谢谢你的建议。

    你可以考虑把你的密钥存储为(8字节整数)。< /P>


    BIGINT的工作原理与INT完全相同,可以以相同的方式在自动递增的标识列中使用。

    在您的情况下,我将使用顺序GUID

    • 它是一个代理密钥
    • 它是应用程序生成的,因此在插入后不需要检索数据库生成的id
    • 它是顺序的,可以很好地与聚集索引一起使用
    • 如果您可能会溢出32位键,您可能无论如何都必须使用64位键(此外,您还可以创建并使用48位键或类似的东西),那么128位guid只需要两倍的空间
    • 字符串代理键对我来说有些不自然,我看不出GUID键有什么好处

      • 以下是一些想法

        • 考虑大小为5或6字节的数据类型
        • 不要忽视特别是对于大型桌子的好处
        • 使其余的列尽可能小。有时,客户可以提供帮助

        不幸的是,您不能创建二进制数据标识列。但是,您可以使用
        max(Id)+1
        插入策略。我不太熟悉.NET的实体框架,但应该有一种方法可以在同一次访问中检索密钥。我以前看过一些文档,解释了如何将实体映射到存储过程并从中检索密钥,但我没有任何细节。

        “在EF中,这意味着要额外往返数据库以检索新生成的id。”错误。
        INSERT
        和获取新ID在EF中的单个SQL语句中完成。同意Craig-EF将在同一往返中愉快地返回任何生成的ID-不需要额外的往返-该参数是mootAh,我不知道EF在同一往返中重设ID。不知道为什么我认为它不能。我从来没有听说过应用程序能够生成伪顺序GUID。。。。。即使如此-GUID=16字节,BIGINT=8字节-使用GUID顺序还是相当浪费。另外:这种浪费空间的行为也会复制到表上所有非聚集索引中,因此这比第一次看到其他关于GUID键的文章要糟糕得多,我可能也会避免这种情况;我想一个比基特最好用。我只需要以另一种方式解决数据迁移/同步问题。对于“数据同步”,也许您可以创建一个包含两列的主键。1列表示ID,1列表示machinename,或者类似的东西?这样,ID是增量的,您可以将其与多台计算机同步,而不会出现关于重复密钥的错误。但缺点是空间需求,因为它可能会占用更多的GUID空间。我认为在EF4.0中,他们还增加了对将二进制键作为实体键的支持。我记得在RC的发行说明中看到了这一点。