【问题标题】:Mongoose - multiple relations between objectsMongoose - 对象之间的多重关系
【发布时间】:2013-07-11 21:24:27
【问题描述】:

假设我正在构建一个社区博客引擎:

  • 我们有几个类别Category
  • 我们有很多博客Blog
  • 我们有很多帖子Post
  • 我们有可能作者Account
  • 每个Category 可能包含多个Blog
  • 每个Blog 可能包含在多个Category
  • 每个Blog 可能包含多个Post
  • 每个Post 可能包含在多个Blog
  • 每个Account 可能同时是几个Blog 中的ownereditor。这就是为什么它可能在 ownereditor 字段中包含多个 Blog 的 ObjectID 数组。
  • 每个Blog 都可以由多个Account 拥有和编辑。这就是为什么它可能在 ownereditor 字段中包含多个 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


【解决方案1】:

不,您不需要双向链接。

你只需要

Blog->Category
Blog->Editors
Blog->Owners
Post->Blog

因为您的类别和用户从不更改对象 ID,所以您不必担心更新博客内的引用。此外,当您要删除博客时,请不要删除记录。相反,添加一个将博客标记为已删除的标志。当您显示内容时,只需检查相应博客的删除标志,甚至在您的查询中添加一个条件来完全避免这些结果。 (这也有保存历史的好处)

总而言之,您可以从更具体和可变的内容链接到更静态的内容,而不是创建双向链接。要删除记录,可以添加删除标志,不用担心追记录,也可以选择所有有问题的 blog_id 的帖子先删除。

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 2015-05-20
    • 1970-01-01
    • 2019-08-11
    • 2014-01-21
    • 2014-08-15
    • 2016-02-08
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多