在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关系的嵌入式文档?这是正确的选择吗?
答案 0 :(得分:3)
Mongoid(Durran Jordan)的作者提出了以下选项
这种宝石看起来很方便:
答案 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
(请记住,内部的密钥将转换为字符串。)