node.js - Nosql/mongoose——设计

标签 node.js mongodb express database-design nosql

我有一个关于撰写文章的个人项目。 我用 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/

相关文章:

Node .js : Error: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch

javascript - NodeJS Postgres 错误 getaddrinfo ENOTFOUND

node.js - 将 Elasticsearch 与 PostgreSQL 集成,同时将 Sails.js 与 Waterline ORM 结合使用

javascript - NodeJS Express Post 表单 - 操作始终为 404

java - MongoDb Java 驱动程序 v3.x 和聚合框架

node.js - expressjs app.VERB 调用中的 next() 和 next ('route' ) 有什么区别?

node.js - 为什么名称为 'underscore' 或 'lodash' ?

Node.js:在 Sequelize 中定义 Postgres 模式

mongodb - 用于案例类的 Scala mongo 驱动程序自定义编解码器

node.js - Mongoose $near 查询返回解析错误