【问题标题】:Sql Server using DateTime as Primary KeySql Server 使用 DateTime 作为主键
【发布时间】:2011-07-02 10:53:07
【问题描述】:

您好,我的问题类似于:

MySQL: Using DATETIME as primary key

但我对 Sql Server 特别感兴趣,我想在实践中考虑到特定场景来解决这个问题,而不是像另一篇文章中那样从理论上讲。

我想存储用户执行的事件/操作。多个用户在相同的 100 毫秒间隔内执行操作的几率非常低,并且可以接受不频繁的冲突。如果我可以离散地表达 10 毫秒甚至 1 毫秒的间隔,那么我对风险感到非常满意。

因此提出了一个问题,我可以使用 DateTime 作为我的主键而不是唯一标识符吗,因为我会定期查询最近的 100 个事件并按事件发生的时间对事件进行排序。

【问题讨论】:

  • 如果您总是按事件时间排序而很少/从不按身份排序,则应将标识符保留在那里,但在 EventTime 列而不是标识符上创建聚集索引。跨度>

标签: sql-server sql-server-2008 database-design


【解决方案1】:

是的,你可以,但对我来说这听起来是个非常糟糕的主意。 如果您真的担心性能,可以使用顺序唯一标识符、自动递增整数,或者可以为 DateTime 列提供自己的聚集索引(推荐)。

【讨论】:

    【解决方案2】:

    如果您真的想避免为此(ID/身份列)使用代理键,我至少会将 datetime 列与用户 id 列组合为复合键。这听起来更适合您的数据。

    【讨论】:

      【解决方案3】:

      为了让不经常发生的冲突可以接受,你真的不能使用时间戳,因为会有冲突。

      您可以通过使用稍微修改数据时间的智能过程对冲突进行编码,但是当时间戳上的索引就足够并且更容易实现时,为什么还要麻烦。

      article 提供了有关 C# 特定精度问题的信息。

      【讨论】:

        【解决方案4】:

        在 SQL Server 2008 中,使用 DATETIME2,而不是 DATETIME。在 SQL Server 2008 中,您可以实现高达 100 纳秒的精度。

        如果您有时需要在给定的时间内记录多行,但很少发生,那么我不确定您通过将日期和时间设置为键来达到什么目的。选择密钥的重要标准是熟悉度、简单性和稳定性。在此基础上,假设它确实符合您的要求,那么日期和时间似乎是一个明智的选择。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-04
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多