在Mongoid中缓存引用文档字段的更好方法是什么?

时间:2011-12-21 04:23:42

标签: ruby mongodb mongoid

在Mongoid中缓存引用文档字段的更好方法是什么?

目前我使用其他字段:

class Trip
  include Mongoid::Document

  belongs_to :driver

  field :driver_phone
  field :driver_name

end

class Driver
  include Mongoid::Document

  field :name
  field :phone
end

将缓存存储为嵌套对象可能会更清楚,因此在mongo中它将存储为:

{ driver_cache: { name: "john", phone: 12345 } }

我想过1-1关系的嵌入式文档?这是正确的选择吗?

5 个答案:

答案 0 :(得分:3)

Mongoid(Durran Jordan)的作者提出了以下选项

  

这种宝石看起来很方便:

     

https://github.com/logandk/mongoid_denormalize

答案 1 :(得分:1)

好问题。我创作并维护mongoid_alize,这是一个非正规化关系的宝石。所以我在努力解决这个问题。

从0.3.1开始,alize现在在Hash中存储非规范化一对一的数据,非常类似于上面第二个带有driver_cache的示例。但是,以前的版本将数据存储在单独的字段中(第一个示例)。

这种变化是由许多因素驱动的,但主要是为了使一对一和一对多的处理保持一致(alize可以一对一,一对多,多对一的非规范化) -许多)。通常通过将数据存储在散列数组中来处理一对多。因此,将一对一存储为哈希变成了更加对称的设计。

它还解决了其他几个问题。您可以在此处找到更详细的说明 - https://github.com/dzello/mongoid_alize#release-030

希望有所帮助!

答案 2 :(得分:0)

无论哪种方式,你都没事。

第一种方法似乎稍好一些,因为它明确说明了您正在缓存的数据。此外,它(可能)需要较少的Mongoid工作: - )

答案 3 :(得分:0)

阿列克谢,

我建议考虑如何使用数据。如果您总是在旅行对象的上下文中使用驱动程序信息,那么嵌入可能是正确的选择。

但是,如果您将在其他环境中使用该信息,那么它可能会更好,因为它是您创建它时自己的集合。

另外,请考虑将行程嵌入到驱动程序对象中。考虑到你的应用程序尝试做什么,这可能有意义也可能没有意义,但从逻辑上讲,拥有一组驱动程序是有意义的,每个驱动程序都有一组行程(嵌入或不嵌入)而不是嵌入驱动程序的行程。我可以看到这种情况(在驾驶员的情况下旅行总是如此)比上面更常见。

-Tyler

答案 4 :(得分:0)

可缓存数据的替代哈希存储:

field :driver_cache, type: Hash

(请记住,内部的密钥将转换为字符串。)