mongoid中has_many,has_and_belongs_to_many和embeds_many的区别究竟是什么?

时间:2013-08-28 12:40:25

标签: ruby-on-rails ruby mongodb mongoid

我理解这不是编程问题,我无法找到一个非常清晰和描述性的解决方案。

3 个答案:

答案 0 :(得分:14)

Mongoid的documentation非常明确:

  

嵌入式关系描述存储在数据库中其他文档中的文档。

     

引用关系通过存储关于其他文档的外键数据(通常是id)来描述引用另一个集合中文档的文档。

详细说明:

参考1-n / has_many

在定义这种性质的关系时,每个文档都存储在其各自的集合中,但子文档包含对父项的“外键”引用。

# The parent band document.
{ "_id" : ObjectId("4d3ed089fb60ab534684b7e9") }

# The child member document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7f1"),
  "band_id" : ObjectId("4d3ed089fb60ab534684b7e9")
}

参考n-n / has_and_belongs_to_many

在定义这种性质的关系时,每个文档都存储在各自的集合中,每个文档都以数组的形式包含对另一个文档的“外键”引用。

# The band document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
  "tag_ids" : [ ObjectId("4d3ed089fb60ab534684b7f2") ]
}

# The tag document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7f2"),
  "band_ids" : [ ObjectId("4d3ed089fb60ab534684b7e9") ]
}

嵌入式1-n / embeds_many

使用embeds_many宏嵌入的文档存储为父数据库集合中父级内的哈希数组。

{
  "_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
  "albums" : [
    {
      "_id" : ObjectId("4d3ed089fb60ab534684b7e0"),
      "name" : "Violator",
    }
  ]
}

答案 1 :(得分:0)

belongs_to:

belongs_to关联与另一个模型建立一对一连接,使得声明模型的每个实例“属于”另一个模型的一个实例。 的has_many

的has_many:

has_many关联表示与另一个模型的一对多连接。您经常会在belongs_to关联的“另一侧”找到此关联。此关联表示模型的每个实例都具有零个或多个另一个模型的实例。

embeds_many:

mongoid中用于mongodb与has_many相同

答案 2 :(得分:0)

Embeds_many将链接到您的对象多次作为嵌入对象的集合(1:N) Has_many将执行相同操作,但不能作为嵌入对象(1:N)

最后一个将大部分相当于(N:N)