类别和子类别架构设计

Posted

技术标签:

【中文标题】类别和子类别架构设计【英文标题】:Category and Subcategory Schema design 【发布时间】:2021-12-12 04:35:10 【问题描述】:

所以基本上它适用于博客文章及其类别和子类别。一篇博文可以有多个类别,每个类别都可以有多个子类别(基于博文)。

例如,假设我有两个帖子,帖子 1 和帖子 2。帖子 1 属于动机和旅程类别。根据帖子 1 的内容,动机可以分为成功和金钱等子类别。

同样,帖子 2 可以属于“教育”和“旅程”类别。教育有一个子类别知识,而旅程有一个子类别称为成功。

我已经设计了 Post 和 Category 架构,但我很难使用 Subcategory 架构。

Post 架构如下所示:

const postSchema = new mongoose.Schema( 
    post: 
        type: String,
        required: true,
        trim: true
    ,
    category: [ 
        _id: false,
        categoryID: 
            type: mongoose.Schema.Types.ObjectId,
            required: true,
            ref: 'Category'
        
     ]
);

这是类别架构:

const categorySchema = new mongoose.Schema( 
    catName: 
        type: String,
        required: true
    ,
    count: 
        type: Number,
        default: 0
    
);

*******COUNT field shows the total number of posts that have that specific category. 
For example, Motivation category could be in 100 posts.*******

所以我的问题是,如何编写子类别的架构?

如果我将子类别引用放在帖子架构中,那么我将无法将子类别与类别链接,因为每个类别都会根据帖子有不同的子类别。

如果我将子类别引用放在类别架构中,那也是不可行的,因为一个类别可以在多个帖子中。

或者我应该将帖子引用和类别引用放在子类别架构中?

请建议我最好的方法。

【问题讨论】:

【参考方案1】:

对于这样的用例,我会做这样的事情 -

集合 1 - 发布

post : string

集合 2 - 类别

name : string
count : number

集合 3 - 子类别

categoryId : ObjectId // FK to category
name : string

集合 4 - 帖子类别

postId : ObjectId // FK to post
categoryId : ObjectId // FK to category
subCategories : [ (ObjectId) ] // array of sub-categories, pointing to sub-category

数据库设计主要取决于您的用例。如果您只想查看每个帖子的计数,您可以将类别和子类别关系存储在单个数组中(在 PostCategories 集合中)

PostCategories,我在这里提到的,如果你想根据 categoryId 搜索可以使用(如果想在 UI 上显示与某个类别相关的帖子,你可以在 categoryId 上建立一个索引,这将是最快的方法)

如果您也想基于子类别进行搜索,您可以修改 PostCategories 表以具有多对多关系。

postId : ObjectId // FK to post
categoryId : ObjectId // FK to category
subCategories : ObjectId // FK to sub-category

【讨论】:

你好。非常感谢您的回答。但是,请多容忍我一点。在主页中,我想查看基于类别的帖子。然后每个类别都会有内页。我的意思是在一个页面中,我想查看基于特定类别的所有帖子。还将有子类别的内页以及基于每个子类别查看帖子。 此外,还有内页,我需要根据类别和子类别查看帖子。例如,在一个页面中,我需要查看 Motivation for Success 的所有帖子,其中 Motivation 是一个类别,Success 是一个子类别。那么上述解决方案是否满足所有这些最佳性能标准? 很高兴您发现它有帮助。我的回答中涵盖了所有 3 个用例。如果没有基于类别的页面,只需将所有类别 + 子类别存储在每个帖子的一行中(在 PostCategories 集合中),如果基于类别搜索,架构Collection 4 - PostCategories & 如果您也需要搜索子类别,使用最后一个架构/ 或将类别和子类别 id 存储在一行中。 谢谢,这就够了。顺便说一句,我还有另一个关于聚合的问题。是否可以根据 Collection 4 统计 Collection 2 中的类别?我的意思是,假设我在 Collection 2 中有一个 id 为 1 的类别。所以这个类别可能在 Collection 4 的 5 个帖子中。所以 Collection 2 中的计数将自动为 5。有可能吗? 是的,当然。如果你只需要计数,你可以把它放在聚合中,如果你想要所有基于类别 ID 的帖子,你也可以这样做。聚合可以轻松实现。

以上是关于类别和子类别架构设计的主要内容,如果未能解决你的问题,请参考以下文章

更好的关系数据库架构的建议 [重复]

分布式系统架构设计系列文章

分布式系统架构设计系列文章

设计模式和架构模式有啥区别?

软件架构《设计模式二》

养老产业金融:养老产业基金架构设计及机制建立需考虑因素