如何有效地计算两个表

时间:2016-12-27 21:12:42

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

我有两个表/模型:

  • 引起
  • 效果

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

我想表明:"原因到效果后的平均时间"

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

以编程方式计算此内容的最佳方法是什么?

我担心随着数据集的增长,如果我不以智能的方式设置它,这可能会变得非常昂贵。

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

更新

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

我在效果表中添加last_cause列,其中包含最新原因的ID。

1 个答案:

答案 0 :(得分:0)

评论中鼓励的是在因果之间设置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添加一个类方法,该方法将返回原因所有实例的平均时间:

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协会,它们非常强大并且提供了大量的实用工具。