4

您推荐哪种 NoSQL 数据库,以及该架构将如何查找以下 Web 应用程序要求。

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

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

  3. 每个用户每月可能会创建 10-200 个文档

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

  5. 用户可以用他/她自己的标签来标记文档

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

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

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

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

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

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

因此,每个用户的集合想法似乎更合适,但似乎可以创建多少集合是有限的,而且这种方法似乎是不受欢迎的。

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

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

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

4

1 回答 1

2

您推荐哪种 NoSQL 数据库,以及该架构将如何查找以下 Web 应用程序要求。

我不会像你问的那样为你定义你的应用程序,因为我们不在这里,但是我会回答你在这里实际陈述的一些问题和问题。

恐怕索引的大小会很大,因为每个用户都可以拥有自己的标签

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

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

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

分片还可以帮助将庞大的索引分配到许多商品计算机上,从而降低成本但保持数据流。

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

因此,每个用户的集合想法似乎更合适,但似乎可以创建多少集合是有限的,而且这种方法似乎是不受欢迎的。

您还遇到了锁的问题,因为锁不像 SQL 那样不是集合级别,它实际上是 DB 级别(并且不要忘记名称空间限制,这取决于您现在的“大量”索引的大小)。很多人都掉进了陷阱,我现在要声明,正常设置对于 99% 的情况都可以,除非您可能是 Facebook,但即便如此,我认为它可能没问题。

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

实际上,我刚刚有人问了一个类似的问题:Trello 如何在 MongoDB 中存储数据?(每块板的集合?)如果您查看评论,那里也可能会有所帮助。

于 2012-10-19T10:38:04.467 回答