我有一个关于撰写文章的个人项目。 我用 mongoose 在 nosql 中做。对于我的 API,我使用 Nodejs + Express。 但我对 sql 很流利,但我对 Nosql 还很陌生......
我的问题是关于我的类别文章。
我想设置 2 级类别,如下所示:
类别 1
- 子类别 1
- 文章
- 子类别 2
- 文章
- 子类别 3
- 文章
类别 2
- 子类别 4
- 文章
- 子类别 5
- 文章
- 子类别 6
- 文章
然后我的文章将填充到子类别中。
我开始设置3个文档:
- 类别
- 子类别
- 文章
这样,我可以在子类别中填充我的文章,并在类别中填充我的子类别。
但我不确定一般情况下使用 mongoose 和 nosql 的最佳方式。我需要另一种观点。
我显然希望尊重最佳实践。
为了简单起见,我需要:
- 显示子类别中的所有文章
- 显示类别中的所有文章
- 在一篇文章的页面上显示类别和子类别。
我也允许仅使用现有类别。
有什么建议吗?
非常感谢;)
最佳答案
作为面向文档的数据库的一般规则,您应该根据访问权限构建文档。
如果您想要一个页面来呈现带有类别和子类别名称的完整文章,您可以这样构造文章:
{
"_id": ObjectId("5b0f9961076337823360d072"),
"category": "Gadgets",
"subcategory": "TVs",
"title": "New TV from ACME",
"text": "Lorem Ipsum ....",
"published": ISODate("2018-05-31T06:42:41.270Z")
}
这样您就可以通过查询获取文章页面的所有数据。
如果您想显示一个类别和子类别的所有文章,您可以过滤这些字段,并且只需要一个查询。在这种情况下,您应该在这些字段上创建索引以加快查询速度。
您可以(但这取决于您想要访问类别的方式)将类别和子类别保存在一个集合中。这些文档可以的结构如下:
{
"_id": ObjectId("5b0f9961076337823360d072"),
"name": "Gadgets",
"subcategories": ["TVs", "Computers", "Phones"]
}
但也许该结构不适合您的需求。在这种情况下,您可以有两个集合。它始终取决于您的应用程序的实现。
您会注意到,数据结构中存在冗余。类别名称保存多篇文章。但没关系。您必须在保存之前验证输入,以确保应用程序中保存的数据正确。
冗余证明了另一个问题:如果您想重命名类别,则必须使用更改后的名称来更新包含该类别的每个文档。但这些更新通常不会经常发生。文档设计是一种权衡。快速获取,因为您只访问一个集合,甚至只访问一个文档。更新乏味且缓慢。但是,通过良好的文档结构,您可以最大限度地减少慢速操作并最大限度地提高快速操作。
关于node.js - Nosql/mongoose——设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50644285/