【问题标题】:Should I denormalize my table, should I denormalize a FK column我应该对我的表进行非规范化,我应该对 FK 列进行非规范化吗
【发布时间】:2016-11-12 09:17:40
【问题描述】:

我有一个表,其中有一列 created_time (DateTime) 和一个 foreign_key,我需要使用 x foreign_key 检索所有行,最后一行使用 x foreign_key 创建的时间超过 2 分钟(并检索具有该日期的所有行)

我的问题:什么对性能更好,每次创建行时添加一个存储最后一行创建日期的列,或者使用更复杂的查询来检索这些行最后一行加入了吗?

【问题讨论】:

  • 我的观点是,从性能的角度来看,事情是好的。您不需要尝试调整很可能不需要运行的东西。只要你有正确的索引,一切都会好起来的。
  • 没有回答我的问题...一切都是索引,一切都很好,但我有一个新功能可以检索与上次有一定时间差的行跨度>
  • 如果我理解正确你的表结构。您在问是否应该非规范化创建时间。如果我正确理解了这个问题。然后不要。进行联接查询。
  • 是的......所以你说使用更复杂的查询将加入最后一行......
  • 从性能角度来看,设置正确索引的性能下降可以忽略不计。您需要有充分的理由进行非规范化。我在这里看不到如此有力的推理。加上查询不会是 thaaatt.... 复杂 :)

标签: mysql sql database denormalization


【解决方案1】:

本质上,问题是“我应该对 created_time 进行非规范化吗?”这里的答案是,从性能的角度来看,设置正确索引的差异可以忽略不计,如果非规范化,这将导致跨架构的数据重复,这可能会引发其他问题。从这个角度来看,我的建议是不要这样做,而是使用 SQL 的表达能力来检索您需要的内容。

【讨论】:

  • 如果你能给我一个很好的例子,我在构建该查询时遇到了一点问题......
  • 您需要稍微玩一下时间函数,看看这里是否有想法:stackoverflow.com/questions/4471041/… 这些函数取决于您的数据库提供商,因此它们因数据库供应商而异。
  • 我的问题是只加入最后一行:/
  • 你需要通过外键加入,然后按照你想要的方式过滤掉日期。你不应该在日期之前加入。
  • 好的,你只想要最后一条记录?
【解决方案2】:

通过对 created_time 进行非规范化,您将走向平面表设计,最终将创建一个 NoSQL DB,我认为这不是您想要遵循的方法。由于您使用的是 SQL,因此您应该使用 SQL Query 的强大功能EXPLAIN 关键字并注意运行查询所需的时间。我相信处理所有行不会花费太多时间。

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 2011-12-18
    • 1970-01-01
    • 2017-01-27
    • 2011-02-15
    • 2013-03-08
    • 2010-10-11
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多