【问题标题】:MongoDB design model for category and subcategory类别和子类别的MongoDB设计模型
【发布时间】:2020-08-04 15:53:15
【问题描述】:

大家好,我在使用 MongoDB 时遇到问题,我不知道如何设计数据库来支持类别和子类别...

所以我尝试创建一个有 2 个模型的测验应用程序:

问题模型

  • 我将包含问题

类别模型

  • 它包含问题所在的类别

这就是我想要完成的,我想构建测验应用程序,测验应用程序将有 3 个主要类别:A 类别、B 类别和 C 类别...

注意:每个类别的子类别不会超过 20 个

每个类别都有自己的子类别,如下所示:“A 类别”将包含 Test1、Test2、Test3、Test4、Test5... 与“B 类别”相同,它将包含 Test1、Test2、Test3、Test4 ....

注意:我不会有超过 3 个主要类别

每个 Test1、Test2 子类别都将包含一个问题列表

所以我的模型是这样的:

类别模型:

export const CategorySchema = new mongoose.Schema({
  parent: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Category"
  },
  name: { type:String, required:true },
  slug: String,
});

问题模型:

export const QuestionSchema = new mongoose.Schema({
  question: { type:String, required:true },
  options: [String],
  answers: Array,
  category: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Category"
  }
});

另外一个问题是,我希望一个问题成为不同子类别的一部分,就像它可以成为 A 类别 > 测试 1,B 类别 > 测试 2,A 类别 > 测试 3, 所以我可以在不同的子类别之间重复使用它

我的问题是:这是设计数据库的正确方法吗?或者有没有其他方法

【问题讨论】:

    标签: mongodb mongoose aggregation-framework data-modeling


    【解决方案1】:

    我使用的参考是 CategoryTest 一起形成一个 tests 集合,第二个集合是 questions。我能想到两种模型,选择取决于您的查询和应用程序需求。

    模型 1:

    tests:
        id: "A-Test1"
        category: "A",
        test: "Test1",
        name / description: "...",
        questions: [ "q1", "q2", "q15", "q16", "q25", ... ]
    
    questions:
       id: "q1",
       details: { question: "...", options: [...], answer: [...] }
    

    您想查找类别“A”和“Test2”的所有问题:

    • 查询测试集合并获取问题。
    • 从问题集合中获取问题详细信息;这将是一个 “加入”查询,使用聚合阶段 $lookup

    您想知道问题是否属于哪些类别/测试:

    • 查询测试集合的问题数组。
    • 查找问题集合以获取有关问题的更多详细信息。


    模型 2:

    tests:
        id: "A-Test1"
        category: "A",
        test: "Test1",
        name / description: "..."
    
    questions:
       id: "q1",
       details: { question: "...", options: [...], answer: [...] },
       tests: [ "A-Test1", "A-Test5", "C-Test2", ... ]
    

    您想查找“A”和“Test2”的所有问题:

    • 在测试数组上查询问题集合。
    • 查找测试集合以了解有关测试的更多详细信息。

    您想知道一个问题属于哪些类别/测试:

    • 在测试数组上查询问题集合。
    • 查找测试集合以获取有关每个测试的更多详细信息。

    【讨论】:

    • 非常感谢您的回答:)
    猜你喜欢
    • 2021-12-12
    • 2015-10-15
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多