【问题标题】:How to efficiently calculate average time between events in two tables如何有效地计算两个表中事件之间的平均时间
【发布时间】:2017-05-12 03:51:12
【问题描述】:

我有两个表/模型:

  • 原因
  • 效果

两者都有创建时的时间戳。

我想显示:“从原因到结果的平均时间”

要手动执行此操作,我会查看最近的 10-20 个影响记录,然后为每个结果查找比给定影响更旧的最新原因记录。然后我会平均每个的时间差。

以编程方式计算的最优雅的方法是什么?

我担心随着数据集的增长,如果我不以聪明的方式进行设置,计算起来可能会变得非常昂贵。

如果相关,我使用的是 Ruby 2.x + Rails 4.2 + MySQL/SqLite3,但可接受的答案可以是通用/伪代码。换句话说,我不需要你为我编写查询。请帮我找出最聪明的设计模式。

更新

我正在研究一种受 cmets 和第一个答案启发的方法...

我在 Effect 表中添加了一个 last_cause 列,其中包含最新 Cause 的 ID。

【问题讨论】:

  • 为什么因果不相关(例如,一个案例有很多影响)?这将使逻辑更容易,只需拉出一个原因,然后确定其影响的持续时间。例如蝴蝶翅膀可能是原因,结果可能是海啸,但我怀疑结果会是核爆炸。现在,根据您的问题,因果关系的不同可能彼此无关。如果一个结果需要几个月的时间才能从一个原因中发生怎么办?现在你将这种影响归因于最新的原因而不是适当的原因
  • @engineersmnky 我在问题中描述的模型被简化了。真实模型之间的关系更加模糊。我可能可以照你说的做,并将它们直接与另一个相关联......但在现实生活中,哪一个实际上与另一个相关并不那么清楚。我的真实例子更像这样:模型 1 = 啤酒。模型 2 = 排尿。喝啤酒肯定与排尿有关。但是对于啤酒模型来说,有一个小便感觉很尴尬。不过,我想显示从喝啤酒到小便的时间。这有帮助吗?
  • 如果您害怕数据集增长,也许您应该在数据库中进行计算。专为此设计的现代数据库。
  • @sig 你能澄清你的意思吗?我不害怕数据增长。我正在寻找一种有效的计算方法。
  • 我的意思是你应该在数据库端使用 sql 进行所有计算

标签: mysql ruby-on-rails ruby database-design query-optimization


【解决方案1】:

cmets 鼓励的是在因果关系之间设置ActiveRecord association

class Cause < ActiveRecord::Base
  has_one :effect
end

class Effect < ActiveRecord::Base
  belongs_to :cause
end

然后您可以执行以下操作:

beer = Cause.first
beer.effect
# => Urination

返工原因:

class Cause < ActiveRecord::Base
  has_one :effect

  def time_til_effect # instance method
    self.effect.created_at - self.created_at
  end
end

beer.time_til_effect
# => 30 minutes

然后您可以向 Cause 添加一个类方法,该方法将返回所有 Cause 实例的平均时间:

def self.average_time_til_effect # class method
  cause_effect_times = Cause.all.map { |cause| cause.time_til_effect }
  cause_effect_times.inject(:+) / cause_effect_times.length
end

您可以通过向类方法添加一个参数来将其范围限制为最新的 (x) 原因,从而更进一步。

说了这么多之后,我认为最大的收获是检查所有的 ActiveRecord 关联,它们真的很强大并且提供了大量的实用程序。

【讨论】:

  • ActiveRecord 很慢
  • 顺便说一句,它可以是一对多或多对多。它没有在问题中描述
  • @sig,我同意,只是在那里做了一个假设
猜你喜欢
  • 2021-05-21
  • 2017-01-23
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多