【问题标题】:How to properly create collections in Mongodb?如何在 Mongodb 中正确创建集合?
【发布时间】:2017-06-19 23:01:02
【问题描述】:

我在将 MySql 和 Oracle 作为关系数据库方面拥有丰富的经验,但我对如何在 MongoDB 中正确创建集合感到非常困惑。

我阅读了很多文章并观看了 youtube 视频,但没有得到任何真实示例来说明如何正确创建两个或三个集合之间的结构和关系(正确、最佳实践或其他什么...)

例如...假设我们有三个集合用户、评论和帖子。 什么是正确的设计?如果评论嵌入在帖子中,那么如果用户更改了他的名字,我该怎么办?我是否应该浏览与帖子相关的所有 cmets 以便在评论集合中更新他的名字? 如果它是一个引用的,那么如何从所有三个集合(Post->Comment->User)中获取数据......聚合?如果是这样,那么如果集合增长并达到 100,000 个文档,那么 MongoDB 将如何表现......

嗯...我希望你明白我的意思。

如果你们能发布你对所有这些东西的想法和想法并“澄清”这一切,我会很高兴。

Tnx.

【问题讨论】:

  • Tnx JohnnyHK。是的..我见过那个,但所有的解释都是理论上的......
  • 当然,因为设计集合架构涉及一系列权衡,而不是一种正确的做事方式。

标签: javascript mongodb design-patterns collections documents


【解决方案1】:

你还在想 SQL,没有 3 个集合,如果帖子数量很大,那么只有一两个集合,cmet 的数量也是如此。 让我们将 Posts 视为一个集合。 帖子由用户创建,cmets(不同用户)也是如此。 用户不会经常更改他的名字,如果只是运行更新的话。 { _id : PostID, title: string, body: string, meta: {...}, user: { id : UserId, name: string }, comments: [ { id: CommentId, by: { id : UserId, name: string } }, ... ] } 如果用户将更改他的姓名,那么您将运行两次更新。一份给所有者,一份给 cmets,使用positional operator。个人认为这种情况不会经常发生。 如果帖子的数量很大并且它们在 cmets 等方面处于活动状态,那么可以考虑 2 个集合,一个用于帖子,一个用于 cmets,或者考虑分片,但不是第一选择。 100K 根本不是一个很大的数字。

【讨论】:

  • Tnx Tal 用于评论。我正在考虑这种方法,但是...您不认为在每条评论中添加 UserId 和他的名字是多余的吗?既然我在我的项目中使用 Mongoose,那么使用 Populate 函数怎么样?你有使用过这个功能的经验吗?
  • mongo 中没有连接。不要通过应用程序连接来解决这个问题,也不要试图节省文档空间。将所有内容都放在一个文档中要便宜得多,应用明智。也就是说,您需要正确地思考和设计您的项目,也许 mongo 不是这项工作的最佳工具。
【解决方案2】:

我认为您可以在 Post 中嵌入带有用户 ID 的 cmets,然后在 post 中使用单独的 userid 文档来收集对帖子做出贡献的所有用户(cmets 等)。由于用户 ID 是关键,因此当您返回帖子时,您可以使用用户信息来整理文档。然后在客户端,您可以使用带有名称等的用户文档通过帖子和 cmets 重新创建用户名等。

【讨论】:

  • 虽然这可能是解决问题的宝贵提示,但一个好的答案也可以证明解决方案。请edit 提供示例代码来说明您的意思。或者,考虑将其写为评论。
猜你喜欢
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2017-04-13
  • 1970-01-01
相关资源
最近更新 更多