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

d34*_*k3r 9 ruby ruby-on-rails mongodb mongoid

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

Ste*_*fan 14

Mongoid的文档很清楚:

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

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

详细地:

参考1-n/has_many

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

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

# The child member document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7f1"),
  "band_id" : ObjectId("4d3ed089fb60ab534684b7e9")
}
Run Code Online (Sandbox Code Playgroud)

参考nn/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") ]
}
Run Code Online (Sandbox Code Playgroud)

嵌入式1-n/embeds_many

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

{
  "_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
  "albums" : [
    {
      "_id" : ObjectId("4d3ed089fb60ab534684b7e0"),
      "name" : "Violator",
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)