Rails,MongoID和嵌入式关系

时间:2012-03-21 20:22:52

标签: ruby-on-rails mongodb mongoid relationship database

我在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

我的原因有些问题?

1 个答案:

答案 0 :(得分:11)

如果您需要单独检索项目,则不应嵌入它们。

我的经验法则:

  1. 顶级域名对象(您自己使用的对象,并不总是出现在“父”的上下文中)应该获得自己的集合。

  2. 嵌入相关内容时

    一个。不要无限制地成长。也就是说,在1-N关系中,N是有界的。

    湾总是(或几乎总是)与父母一起出现。

  3. 如果你能证明嵌入所带来的性能改进超过了获取所有对象所需的多个查询的成本,你也可以嵌入。

  4. 无论是嵌入还是相关都不应该是首选。应该平等地考虑它们。