我想建立一个三级博客系统。
有三个级别。在第一页上,用户可以看到所有帖子,如果他打开帖子,他会看到更深一层的意见页面,其中包含意见,如果用户点击某个意见,他会看到评论。
这应该是这样的:
<块引用>-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 的限制,但查询所有评论和意见会很糟糕。
我现在的问题是构建这样的系统的好方法是什么。如何构建“仍然快速”且可扩展的架构?提前致谢!