【问题标题】:MongoDb data relationsMongoDb 数据关系
【发布时间】:2017-07-06 15:01:41
【问题描述】:

我有一个:

  • MongoDB 数据库
  • NodeJS 上的 REST API
  • Angular JS 前端

现在我想创建数据库 schma。它将是:

故事 - 用户插入带有描述的故事。

问题 - 与故事的关系。一个故事可以有超过 100 个问题。

答案 - 与问题的关系。一个问题只能有一个答案。

我应该在 MongoDb 中选择什么类型的关系?我需要更快的灵魂。 例如:

{
 title: "Story title",
 descr: "Story descr",
 questions: [
              {body: "Question body", user: "User}
            ]
}

【问题讨论】:

  • 感谢您询问架构设计。很多人从 MongoDB 开始并实施 3NF(他们最终不开心)。 +1

标签: node.js mongodb nosql


【解决方案1】:

由于每个故事的问题数量可能很大,并且假设在显示故事时不需要显示所有问题(尤其是在显示故事列表时),并且因为一个文档有很多作者会带来复杂性的数量,我建议使用以下简单模式:

stories {
  _id
  title
  description
}

questions {
  _id
  storyId
  user
  body
  answer { ... }
}

查找故事的所有问题很简单(storyId 应该有一个索引),查找给定问题的故事很简单。我认为answer 可以嵌入。不过,请注意并发写入,即当有人编辑问题而其他人编写答案时。这在使用单个嵌入式文档时比使用数组容易得多,并且并发写入者的数量最多可能是两个,而不是数百个。

唯一稍微复杂一点的操作是删除故事,这需要您手动删除问题,但这实际上只是一个调用。

【讨论】:

  • 但是如果我想检索故事和问题,我必须进行单独的 API 调用?
  • 不一定。为了简单起见,我会(另外,您可以并行执行这些操作,这无论如何都是 Angular 的默认行为)。但是如果你真的想这样做,你可以在服务器上组合查询结果并将组合的 DTO 发送到前端。或者您是指“API 调用”的数据库操作?在这种情况下,我不会担心,它们不应该比单个调用慢很多,而且它们可以并行化,因为您从问题中引用了故事 ID。
  • 我看到你在 Mongo 方面有很多经验 :) 我会按照你建议的方式实现。我还想为故事、答案、问题实施投票系统。我应该为此创建新的collentios吗?
  • 嗯,这取决于细节......我假设一个用户只能对一个项目投票一次?如果投票数量很少,嵌入用户 ID 可能没问题,但单独的投票集合可能更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2017-03-19
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2018-01-28
相关资源
最近更新 更多