我在Rails中有一些关于MongoID和嵌入式关系的问题。
在我的模特中,我有:
class Board
include Mongoid::Document
attr_accessible :title
field :title, :type => String
#has_and_belongs_to_many :users
embeds_many :items
end
当我打电话
Board.all
它返回整个集合,包括:items。
我在许多文章/论坛中都读过使用MongoDB嵌入式关系应优先于引用的关系,但我有一些问题:
到目前为止,我已经注意到使用嵌入式文档的唯一优势是类似SQL中的所谓“连接”,但我也看到很多性能问题,使用嵌入式关系的重要原因是关系?
修改
正如Adam C所指出的那样,我的想法与以下情况有关:
如前所述,我将在每个板块中都有许多项目并使用Rails脚手架它生成的方法从数据库中检索整个Board文档但很多次(例如编辑板时)我想加载文档没有项目部分。
由于我将主要使用JSON调用,我的想法是在url中添加一个可选参数,如“get_items”设置为TRUE,以防我也想获取项目,在其他情况下我会使用Mongoid的: / p>
Model.without
例如,让我们采取索引动作:
def index
@boards = Board.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @boards }
end
end
我只需要获取Board Model中指定的字段(在这种情况下仅限于:title),没有项目,所以我可以使用:
def index
@boards = Board.without :items
respond_to do |format|
format.html # index.html.erb
format.json { render json: @boards }
end
end
我的原因有些问题?
答案 0 :(得分:11)
如果您需要单独检索项目,则不应嵌入它们。
我的经验法则:
顶级域名对象(您自己使用的对象,并不总是出现在“父”的上下文中)应该获得自己的集合。
嵌入相关内容时
一个。不要无限制地成长。也就是说,在1-N关系中,N是有界的。
湾总是(或几乎总是)与父母一起出现。
如果你能证明嵌入所带来的性能改进超过了获取所有对象所需的多个查询的成本,你也可以嵌入。
无论是嵌入还是相关都不应该是首选。应该平等地考虑它们。