MongoDB关系

MongoDB关系教程

关系数据库(RDBMS)维护表之间的关系,以有意义的方式组织数据。而 MongoDB 并没有像 RDBMS 那样的关系。但是,虽然文档数据库不需要与关系数据库相同的预定义结构,但这并不意味着它们不支持。实际上,MongoDB 允许通过嵌入式和引用式方法对文档之间的关系建立联系。

MongoDB 的关系表示多个文档之间在逻辑上的相互联系。文档间可以通过嵌入和引用来建立联系。MongoDB 的关系可以分为 1 对 1、1 对多、多对 1 和多对多。

MongoDB关系详解

关系实例

关系 实例
1对1 一位作者对应一篇文章
1对多 一位作者对应多篇文章
多对1 多位作者对应一篇文章
多对多 一位作者对应多篇文章,一篇文章对应多位作者

现在,我们根据以上对应关系,来看下作者跟文章的文档结构。下面是表示作者 “jack” 的文档结构:

> db.author_book.find().pretty() { "_id" : ObjectId("5f71db1f7e8627147f94f826"), "name" : "jack", "age" : 20, "gender" : "boy" }

表示书籍信息的文档结构:

> db.books.find().pretty() { "_id" : ObjectId("5e0463f9b1432f3ebcfd57d7"), "book_name" : "第一本书", "published_date" : 2022, "price" : 199 }

嵌入式关系

现在使用嵌入式的方法,将书籍的文档嵌入到所属的作者文档中:

db.author_book.find().pretty() { "_id" : ObjectId("5e046866b1432f3ebcfd57d8"), "name" : "jack", "age" : 20, "gender" : "boy", "books" : [ { "book_name" : "第一本书", "published_date" : "2022", "price" : "199" }, { "book_name" : "第二本书", "published_date" : "2020", "price" : "99" } ] }

可以看到,现在多本书籍都跟其作者保存在同一个文档中。例如可以使用以下方式直接查询出这位作者的书籍信息:

db.author_book.findOne({"name":"jack"},{"books":1}) { "_id" : ObjectId("5e046866b1432f3ebcfd57d8"), "books" : [ { "book_name" : "第一本书", "published_date" : "2022", "price" : "199" }, { "book_name" : "第二本书", "published_date" : "2020", "price" : "99" } ] }

引用关系

引用式关系是设计数据库时经常用到的方法,该方法把作者的数据文档和书籍的数据文档分开,再通过引用文档的 “_id” 字段来建立关系。

{ "_id" : ObjectId("5e046bc3b1432f3ebcfd57de"), "book_name" : "第一本书", "published_date" : 2019, "price" : 99, "books_ids" : [ ObjectId("5e0463f9b1432f3ebcfd57d7"), ObjectId("5e046ba3b1432f3ebcfd57dd") ] }

以上文档的 “books_ids” 字段保存每个书籍文档的对象 “_id” 数组,而我们可以通过这些对象 Id 获取每本书籍的信息。该方法需要两次查询,首先找出作者的对象 id,将其值先赋予到 result 上:

var result = db.author_book.findOne({name:"jack"}, {books_ids:1})

再根据查询出来的结果,在 books 数据库中再次进行查询,使用 “$in” 方法,查询出 _id 对象存在列表 result[“books_ids”] 中书籍数据:

var book = db.books.find({_id:{"$in": result["books_ids"]}})

嵌入式关系

优点

快速、高效、简单。

缺点

如果数据量不断变大,会影响读写性能。需要定期去更新用户信息,该频度不好把握。(需要考虑原子性)

使用场景

小的子文档、数据不经常改变、当最终一致性是可以接受的、文档增长小、经常需要进行二次查询来获取数据、读快。

引用关系

优点

文档大小更易于管理,两个文档的数据同步更新。

缺点

查询耗时。

使用场景

大的子文档、非易失性数据、当实时一致性是必要的、文档增长大、经常需要从结果中排除数据、写快。

MongoDB关系总结

MongoDB 的关系表示多个文档之间在逻辑上的相互联系。文档间可以通过嵌入和引用来建立联系。MongoDB 的关系可以分为 1 对 1、1 对多、多对 1 和多对多。