【问题标题】:MySQL: Using DATETIME as primary keyMySQL:使用 DATETIME 作为主键
【发布时间】:2019-09-25 18:57:35
【问题描述】:

我的数据库将存储大量数据点,因此我使用无符号 BIGINT 作为主键。

使用 DATETIME 对象作为主键有意义吗?

谢谢,

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    是的,如果您需要唯一标识离散点或时间段,将日期/时间作为键或键的一部分当然是有意义的。我不能说这是否适用于您的场景,但作为一般规则,密钥不能基于时间没有根本原因 - 几乎所有数据仓库都这样做。

    【讨论】:

    • A DATETIME 不能用于唯一标识离散的时间点 - 它只能用于标识离散的 时间。
    • TehShrike - 时间精度始终是相对的。唯一的问题是您需要多少精度。事实上,我不是在回答 MySql 案例,而是针对更一般的按时建立密钥的案例。不过没关系,因为每个 DBMS 对可记录的时间精度都有一定的限制。
    • Mysql 支持日期时间小数秒到小数点后 6 位的精度。我的理解是许多自然键的性能更高。我希望得到一些硬数据而不是无关紧要的废话。
    【解决方案2】:

    否,因为不能保证它是唯一的。坚持使用 BIGINT。您可以在 DateTime 上放置一个很好的索引进行查询,它就足够了。

    【讨论】:

      【解决方案3】:

      这没有任何意义,因为您将被限制为每秒一条记录,而没有任何实际原因。

      【讨论】:

        【解决方案4】:

        如果您的数据来自一个按时间排序的集合,那么这很有意义。比如说,金融交易的记录。如果您有多个自然发生在不同时刻的数据点,但由于舍入而具有相同的时间戳,请更改低位以区分它们。

        这是 MySQL 中的 more problematic 而不是 other 数据库,因为时间戳的存储精度仅为 1 秒。(编辑:从 5.6.4 开始,MySQL 有微秒时间类型的精度)

        【讨论】:

          【解决方案5】:

          如果您碰巧每秒有多次观察,这将失败。出于这个原因,除非你能保证每秒永远不会超过一个点,否则最好不要这样做。

          【讨论】:

            猜你喜欢
            • 2011-07-02
            • 1970-01-01
            • 1970-01-01
            • 2021-10-17
            • 1970-01-01
            • 1970-01-01
            • 2012-11-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多