mongodb - NoSQL 数据库设计 - 带标签的文档

标签 mongodb database-design web-applications nosql

您推荐哪种 NoSQL 数据库以及架构如何满足以下 Web 应用程序要求。

  1. 可以很多用户 (500k+)

  2. 每个用户都可以输入他/她的文档

  3. 每个用户每月大概会创建 10-200 个文档

  4. 每个文件都会很小(大约 100 字)

  5. 用户可以使用自己的标签标记文档

  6. 来自不同用户的数据不会与其他用户及其数据交互

  7. 用户可以通过标签搜索他的条目

  8. 从一个用户快速访问所有条目

  9. 用户可以创建复杂的动态查询来查询他/她的数据

我的想法是使用 MongoDB。但我看到的问题是只有两个集合:usersentries

在我看来,通过标签在一个巨大的集合中搜索是个坏主意。恐怕索引的大小会非常大,因为每个用户都可以有自己的标签。 MongoDB 将为整个集合创建标签索引,但我将始终只通过标签搜索来自一个用户的条目,而不是来自所有用户的条目。

因此,每个用户的集合想法似乎更合适,但似乎对一个人可以创建的集合数量有限制,而且这种方法似乎并不受欢迎。

CouchDB 不支持动态查询,...

我应该如何在 MongoDB 中实现它?或者命名一个更合适的 NoSQL 数据库。

类似应用程序的示例:rememberthemilk、Trello、...

最佳答案

Which NoSQL database do you recommend and how would the schema look for the following web application requirements.

我不会按照您的要求为您定义您的应用程序,因为我们不是来这里的,但是我会回答您在这里实际提出的一些问题。

I am afraid that the size of indexes will be really large, since every user can have his own tags

的确,索引大小可能相当大,除非您限制了用户可以应用的标签数量。大多数网站最多将标签限制为 10 个,有时(例如这里的问题)5 个。

您可能想研究将该集合在集群中分成更小的部分。通过这些标签对正确定义的分片索引进行查询绝不是缓慢或糟糕的。

即使标签索引不是您的分片索引,它仍会执行非常快速的全局分散和收集操作(此处是跨大型集合查询使用的一个很好的示例:http://docs.mongodb.org/manual/core/sharding/)。

分片还可以帮助将庞大的索引分布到许多商用计算机上,从而让您在降低成本的同时保持数据流。

因此,您首先要研究的是分片以及它如何为您提供帮助,在这方面,这里是一个不错的起点:http://docs.mongodb.org/manual/core/sharding/

Thus a collection per user idea seems more suitable, but there seems to be a limit on how many collections one can create, also this approach appears to be undesired.

你也有锁的问题,因为锁不是集合级别的,不像 SQL 它实际上是数据库级别的(并且不要忘记 namespace 限制,它取决于你现在“大量”索引的大小)。很多人都掉入了陷阱,我现在要声明的是,对于大约 99% 的情况,正常设置都可以,除非你可能是 Facebook,但即便如此,我认为它也可能没问题。

Examples of similar applications: rememberthemilk, Trello, ...

实际上有人问了类似风格的问题:How does Trello store data in MongoDB? (Collection per board?)如果您查看评论,那里也可能会有一些帮助。

关于mongodb - NoSQL 数据库设计 - 带标签的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971912/

相关文章:

design-patterns - 数据属性表 vs 许多小表

html - 如何使用 Lift 框架获取从代码段传递的 HTML 页面中的参数

mongodb - Doctrine ODM (MongoDB) - 获取对象的完整数组?

javascript - 如何使用 mongoDB 和 Node.js 从集合中获取所有文档

java - 如何在 MongoDB 的 application.properties 中设置等待队列倍数和最大池大小

sql - 存储和查询每行不同的定价结构?

Mongodb:仅查询集合的最后N个文档(某些部分)

javascript - 显示数据元素但不将它们存储在数据库中

java - Google App Engine 应用程序与第三方云的连接

web-applications - 使用 Play 框架和 sencha 的 Web 应用程序