【问题标题】:MongoDB RESTful API structuringMongoDB RESTful API 结构
【发布时间】:2018-11-03 23:22:23
【问题描述】:

所以,我正在尝试创建一个与 reddit 类似的 RESTful API,其中包含用户、主题(subreddits)、帖子和 cmets。为此,我正在尝试使用 Node.js 和 MongoDB。

这是目前的 github 仓库:https://github.com/edmassarani/reddit-clone

唯一的问题是我不知道如何构建文档的删除和它的“依赖关系”,因为用户可能拥有一个主题,该主题有帖子,这些帖子有 cmets,那些 cmets 有作者,那么如何我要删除用户而不留下没有所有者的主题或没有主题的帖子等等?如果我使用关系数据库会更容易吗?

【问题讨论】:

    标签: javascript node.js mongodb rest


    【解决方案1】:

    我可以在您的 Github 存储库中看到,您使用 规范化数据模型 来构建模型,就像在关系数据库中一样(注意:您在问题中将关系数据库命名为“SQL 数据库”):: p>

    示例: 在 Topic.js 中,您引用 Posts with reference :

    posts: [
        {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Post',
        },
      ],
    

    当然可以,但使用 NoSQL,特别是 MongoDB,您可以将文档嵌入到另一个文档中。

    为什么不直接将 Post 模式嵌入到 Topic 中:

      posts: [
        {
    
        title: {
            type: String,
            required: true,
          },
          body: {
            type: String,
            required: true,
          },
          ...
          upvotes: [
            {
              type: mongoose.Schema.Types.ObjectId,
              ref: 'User',
            },
          ],
          comments: [
            {
              type: mongoose.Schema.Types.ObjectId,
              ref: 'Comment',
            },
          ],
        },
      ],
    

    据我所知,如果删除了某个主题,则必须删除与该主题相关的所有帖子。

    使用嵌入式架构,您只需进行一次删除操作。

    我不知道在您的上下文中嵌入是否是最好的解决方案(因为 perfs),但您有两个解决方案:

    • 使用不同的架构(您的模型文件),您必须手动 级联删除(例如:当你删除一个主题时,你必须 找到该主题的所有帖子引用并将其删除...)
    • 重构和嵌入:有了它,删除主题也删除了评论。

    有关嵌入式架构的更多信息,请参阅 mongodb 官方文档:https://docs.mongodb.com/manual/core/data-model-design/

    【讨论】:

    • 如果我这样做,我是否还需要在帖子中嵌入 cmets 以便在一个查询中删除它们?
    • 准确,但是嵌入文档过多可能会出现性能问题,请在 mongodb 文档中检查有关此问题的限制
    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 2013-12-01
    • 2019-01-29
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多