【问题标题】:How to represent a many-to-many or many-to-one relationship in MongoDB?如何在 MongoDB 中表示多对多或多对一关系?
【发布时间】:2013-09-03 09:03:47
【问题描述】:

我正在学习 MongoDB,我有一个问题:您如何表示多对多或多对一关系?在标准 SQL DB 中,这很简单:

Parent Table has fields ID (primary key) and Name.
Child Table has fields ID (primary key) and Name
Parent-Child-Relationship Table has fields ID (primary key), ParentID and ChildID

insert into table Parent (ID, Name) values (1, "Bob");
insert into table Child (ID, Name) values (1, "Mahmoud");
insert into table Parent-Child-Relationship (ID, ParentID, ChildID) values (1,1,1);

但我还没有弄清楚如何在 MongoDB 中执行此操作。我可以这样做:

db.parent.save({name: "Bob", children: ["Mahmoud"]});

但是我怎样才能为 Mahmoud 创建另一个父母(说“玛丽”)?

我是否遗漏了一些明显的东西?请帮忙。我是 NoSQL 技术的新手。

【问题讨论】:

  • 在大多数情况下,您将连接从数据库级别移出并在应用程序层进行。您可以将数据嵌入到父母双方,也可以简单地进行两次查找。您可以在这里获得更多信息:docs.mongodb.org/manual/core/data-modeling

标签: mongodb


【解决方案1】:

简短的回答是你没有。

10Gen 会告诉您的答案是使用作为父级的单个文档,以及代表子级的子文档。

但是,不要这样做,因为 Mongo 中的子文档查询有限且速度较慢。

每个人最终要做的就是将父 ID 存储在子 ID 上,并在应用程序级别执行多个查询/联接。

【讨论】:

  • 是什么让你说子文档查询是有限的?
  • 您不能在子文档中查询超过一层。
  • 另外你能不能给我一个不能在子文档中查询超过一层的例子?
  • 例如:db.test.insert({'address': {'line1': {'street': 'Kanaha', 'number': '745'}}}) 那么:test> db.test.find({'address.line1.street': 'Kanaha'}).count() 1
  • 也许在撰写本文时确实如此,但他们现在似乎很清楚何时嵌入以及何时不嵌入:docs.mongodb.org/manual/tutorial/…
【解决方案2】:

没有什么能阻止你像下面这样创建另一个父级:

db.parent.save({name: "Jane", children: ["Mahmoud"]})

但我想说你没有抓住重点。在面向文档的数据库中以类似行的方式拆分数据通常是个坏主意。一切都取决于应用程序逻辑,但如果您想反映家庭数据,您可以尝试这样的结构:

db.family.insert({mother: {name: "Jane", age: 27}, father: {name: "Bob", age: 29}, children: [{name: "Mahmoud", age: 2}], })

【讨论】:

  • 从概念上讲,这似乎行不通。如果我们想存储相同对象 Bob、Jane、Mahmoud 和其他不同对象之间的关系会发生什么?如果我们想说 Jane 和 Mahmoud 出生在芝加哥,而 Bob 出生在东京呢?如果这些城市中的每一个都分别有一堆与之相关的信息(例如人口、经度、纬度等),该怎么办?我的大脑是不是被直接套用在表格和行的形式上?我需要以不同的方式思考它们吗?
  • 恕我直言,纯关系模型比面向文档的数据库所能提供的任何东西都要普遍得多。像 MongoDB 这样的面向文档的数据库中的数据建模高度依赖于应用程序,就像 Jonathan Holland 所写的那样,大部分工作包括:“应用程序级别的多个查询/连接”。您绝对应该避免的一件事是数据规范化。通常,您希望更多地考虑数据的层次结构,而不是简单的对象 - 对象关系。
猜你喜欢
  • 2013-03-08
  • 2018-06-15
  • 2021-04-01
  • 2023-03-29
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多