【问题标题】:Category Implementation in a database数据库中的类别实现
【发布时间】:2012-10-25 02:21:36
【问题描述】:

我正在构建一个涉及用户和教师的系统。然而,在这个特定的系统中,我想对教师进行分类,但棘手的部分是类别是动态的,因此它们可以随时更改。

我必须有一些功能,因为我正在开发后端;

  • 第一个是 showAllCategories(),它显示所有 main 类别。
  • 其次是 showSubcategories(),它显示了 category() 的子类别
  • 第三个是showContent(),在本例中显示教师的信息。

在询问强大的 Stack-Overflowers 如何有效实施之前,我想我可以使用双向链表方法,在类别表 CategoryNameBeforeAfterContent,如果类别没有after,则内容将指向老师的桌子。这是我的经典 SQL 方法,但我使用的是 MongoDB,由于我是初学者,我想知道在这种特殊情况下是否可以利用 NoSQL?

【问题讨论】:

    标签: sql mongodb database-design nosql


    【解决方案1】:

    MongoDb 原生支持 Array 类型,它的行为实际上更像一个列表。使用$push$pull,您可以在这样的数组字段中添加和删除元素。 $addToSet 甚至确保没有重复。

    现在是如何存储类别的问题。您可以使用主要类别创建一个集合categories,它们将有一个字段,每个字段都有子类别的数组:

    {"_id": "science", "sub": ["chemist", "physicist", "biology"]}
    {"_id": "languages", "sub": ["english", "german", "spanish"]}
    

    另一方面,您的teacher 集合将包含一组嵌入文档,即教师的类别。它们是在 categories 集合中找到的重复项,减去了教师视图中不需要的字段。这样可以避免连接,因为它们在 MongoDB 中不存在。

    {
     "_id": ObjectId(...),
     "name": {"first": "Foo", "last": "Bar"},
     "categories": ["chemist", "biology"]
    }
    

    其余的我相信你可以想出来。

    补充:简而言之,使用 MongoDB 提供的灵活类型,不用担心数据冗余。经常嵌入文档,不要忘记索引。

    【讨论】:

    • 感谢您的出色方法。但是我确实有一个问题。既然您提到我会将主要类别与代表子类别的列表一起存储。假设我们有主类别 id 1 和子类别 [2,3,4] 的情况。类别 3 显然是一个子类别,所以我应该在哪里存储 3 的子类别,因为它可以有多个,而不是主要类别
    • 哦,我不知道你可以有子子类别。但这根本不是问题,因为 MongoDB 是动态的。这意味着您也可以将子子类别存储在列表中:[{id: cat1}, {id: cat2, subs: [...]}, {id: cat3}]。如果有 subs 字段,应用程序就会知道有子类别。因此,您可以构建一个层次树。
    猜你喜欢
    • 2021-12-30
    • 2011-12-08
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多