MongoDB博客架构设计

时间:2021-02-02 10:20:18

标签: javascript mongodb mongoose graphql apollo

我想建立一个三级博客系统。
有三个级别。在第一页上,用户可以看到所有帖子,如果他打开帖子,他会看到更深一层的意见页面,其中包含意见,如果用户点击某个意见,他会看到评论。

这应该是这样的:

<块引用>

-Post(1.level)
--意见(2.级)
---评论(3级)

用户应该有权访问他发表的帖子和意见

<块引用>

-用户
--帖子[ ]
--意见 [ ]

现在想到的第一件事是将其构建为具有一个“帖子”集合的树模型。架构如下所示。
第一个变体:

const { model, Schema } = require("mongoose");

const postSchema = new Schema({
    postBody: String,
    postBy: {
        type: Schema.Types.ObjectId,
        ref: "User",
    },
    opinions: [
        {
            opinionBody: String,
            opinionBy: {
                type: Schema.Types.ObjectId,
                ref: "User",
            },
            comments: [
                {
                    commentBody: String,
                    commentBy: {
                        type: Schema.Types.ObjectId,
                        ref: "User",
                    },
                },
            ],
        },
    ],
});
module.exports = model("Post", postSchema);

这是一种非常简单且快速的方法,但这样一来文档会变得非常大,而在 MongoDB 中,文档限制为 16MB。所以这是一种床上方法。
第二种变体:

将帖子、意见和评论放在单独的集合中,并将属于在一起的意见和评论捆绑在一起。

Post {
  id: "post1",
  postBody: Post 1,
  postBy: "UserA"
  opinionsBundleId: "opinionsBundle1"
}

Opinion [
  {
    id: "opinionsBundle1"
    opinions [
       { 
         opinionBody: Opinion 1
         opinionBy: "UserB"
         commentsBundleId: "commentsBundle1"
       },
       { 
         opinionBody: Opinion 2
         opinionBy: "UserC"
         commentsBundleId: "commentsBundle2"
       },
    ]
  },
]

Comments [
 {
  id: "commentsBundle1"
  comments [
      { 
        commentBody: Comment 1
        commentBy: "UserB"
      },
      { 
        commentBody: Comment 2
        commentBy: "UserD"
      },
  ]
 },

 {
  id: "commentsBundle2"
  comments [
      { 
        commentBody: Comment 1
        commentBy: "UserB"
      },
      { 
        commentBody: Comment 2
        commentBy: "UserD"
      },
  ]
 },
]

对于第二个变体,我不知道 16MB 是否足够,但这样查询意见和评论时仍然很快。
第三种变体是将所有意见和评论放在一个单独的文件中。这样一个文档永远不会达到 16MB 的限制,但查询所有评论和意见会很糟糕。
我现在的问题是构建这样的系统的好方法是什么。如何构建“仍然快速”且可扩展的架构?提前致谢!

0 个答案:

没有答案