Mongoose - 对象之间的多重关系
Posted
技术标签:
【中文标题】Mongoose - 对象之间的多重关系【英文标题】:Mongoose - multiple relations between objects 【发布时间】:2013-07-11 21:24:27 【问题描述】:假设我正在构建一个社区博客引擎:
我们有几个类别Category
我们有很多博客Blog
我们有很多帖子Post
我们有可能作者Account
每个Category
可能包含多个Blog
每个Blog
可能包含在多个Category
中
每个Blog
可能包含多个Post
每个Post
可能包含在多个Blog
中
每个Account
可能同时是几个Blog
中的owner
和editor
。这就是为什么它可能在 owner
和 editor
字段中包含多个 Blog
的 ObjectID 数组。
每个Blog
都可以由多个Account
拥有和编辑。这就是为什么它可能在 owner
和 editor
字段中包含多个 Account
的 ObjectID 数组。
这是一个架构:
categorySchema = mongoose.Schema(
title: String
blogs: [
type: ObjectId
ref: "Blog"
]
)
blogSchema = mongoose.Schema(
title: String
description: String
owner:
type: ObjectId
ref: "Account"
editor: [
type: ObjectId
ref: "Account"
]
category: [
type: ObjectId
ref: "Category"
]
posts: [
type: ObjectId
ref: "Post"
]
)
postSchema = mongoose.Schema(
blogs: [
type: ObjectId
ref: "Blog"
]
author:
type: ObjectId
ref: "Account"
)
accountSchema = mongoose.Schema(
name: String
owner: [
type: ObjectId
ref: "Blog"
]
editor: [
type: ObjectId
ref: "Blog"
]
)
每个帖子还可能包含点赞、cmets 和其他可能仅与此对象相关的对象。
问题是当我尝试添加新的Blog
时,我将不得不管理许多集合中的许多字段。同样的事情是当我编辑Blog
或删除时——我必须在大量对象的各种数组字段中查找、检查、修改/删除大量记录。
我是suggested,我不应该存储直接关系(类别 --> 博客、博客 --> 帖子),只存储反向关系(博客 --> 类别、帖子 --> 博客),当我需要时要获取某个类别中的所有博客,请执行一个简单的Blogs.find(category: cat_id)
,但想想如果我需要一些 deep 请求,例如Get all Blogs where account_ID both owner and editor
,会发生什么。假设可以有很多博客,并且每个博客都可能包含很多作者和编辑,直接Blog.find owner:acc_id, editor:acc_id
会更快。这就是为什么我认为我需要双向链接。
所以,我的问题是:
我真的需要对象之间的双向链接吗? 如果是,是否有任何工具可以优化使用它?也许我应该在 Mongoose 中使用某种多对多关系?
谢谢!
【问题讨论】:
在我看来,您想在对象之间建立关系。请问你为什么选择mongoDB。它的全部意义在于它是一个 noSQL 数据库。这意味着当你开始开发一个 mongoDB 应用程序时,你应该改变你的思维方式。你需要考虑的不是关系,而是文章。每篇文章都应该是完整的。一旦开始设计关系,就会破坏 NoSQL 模型,并且会讨厌 mongoDB。你会认为这是最糟糕的,但事实并非如此。所以我想说弄清楚你的设计,然后决定一个数据库。 【参考方案1】:不,您不需要双向链接。
你只需要
Blog->Category
Blog->Editors
Blog->Owners
Post->Blog
因为您的类别和用户从不更改对象 ID,所以您不必担心更新博客内的引用。此外,当您要删除博客时,请不要删除记录。相反,添加一个将博客标记为已删除的标志。当您显示内容时,只需检查相应博客的删除标志,甚至在您的查询中添加一个条件来完全避免这些结果。 (这也有保存历史的好处)
总而言之,您可以从更具体和可变的内容链接到更静态的内容,而不是创建双向链接。要删除记录,可以添加删除标志,不用担心追记录,也可以选择所有有问题的 blog_id 的帖子先删除。
【讨论】:
以上是关于Mongoose - 对象之间的多重关系的主要内容,如果未能解决你的问题,请参考以下文章
通过Mongoose(Node JS)在Mongo DB中插入没有JSON模式的JSON对象