【发布时间】: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。你会认为这是最糟糕的,但事实并非如此。所以我想说弄清楚你的设计,然后决定一个数据库。
标签: database-design architecture mongoose