Mongoid中一个非常大的数据集的最佳关系

时间:2014-05-14 01:41:33

标签: ruby-on-rails performance mongodb ruby-on-rails-4 mongoid

我在应用中试用了Mongoid,Stations每5分钟发送一次Observations(288 /天)。这相当于一个非常大的数据集,如何建立性能关系?

最关键的问题是获取所有电台和最后一次观察。这听起来很简单但是在Postgres中是PITA。

我正在使用

Rails 4.0.3
Mongoid 4.0.0beta

1。嵌入

class Station 
    embeds_many :observations 

    def latest_observation
        observations.last
    end

    # fields ...
end

class Observation 
    embedded_in :station 

    # fields ...
end

2。有许多/属于/ embeds_one:latest_observation

class Station 
    has_many :observations 
    embeds_one :latest_observation, class: 'Observation'
end

class Observation 
    belongs_to :station 

    after_save :update_station

    def update_station
        self.station.latest_observation = self
        self.station.save!
    end
end

1 个答案:

答案 0 :(得分:1)

我认为第一种选择不是可行的解决方案。你最终会得到一些(少数)站点记录,因为嵌入观察结果会变得很大。

MongoDB而言,我建议:

  • 用于嵌入固定数量观测的电台的集合(最近30天左右的观察结果)
  • 将充当仓库的观察集合

stations: [ { id: sta_1234, observations: [ {observation_id: obs_1234, observation_data: {} }, ...] }, ... ]

观察结果具有固定的大小。

那样

  • 您可以快速参考最近的观察结果。
  • 你将拥有固定大小的文档(这对mongo非常有用!)
  • 你不会失去任何历史

    实际上observations可能会更好observation_ids而你只保留ids或每个观察的一些有用数据

关于它的一个“缺点”是你必须在某些时候使用原始mongo因为mongoid不支持所有东西(但是),但我认为它的好处更大。

使用这种方法,您将不得不在应用中处理插入的重复数据,这应该没问题。