【问题标题】:NoSQL Database Design - Documents with TaggingNoSQL 数据库设计 - 带有标签的文档
【发布时间】:2012-10-09 22:19:19
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: mongodb database-design web-applications nosql


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

    实际上,我刚刚有人问了一个类似的问题:How does Trello store data in MongoDB? (Collection per board?) 如果你看一下 cmets,那里可能也会有一些帮助。

    【讨论】:

    • 标签的问题是每个用户都可以拥有自己的标签集。在 SO,所有用户都使用相同的标签。即使每个文档的标签数量有限制,一个用户可以拥有的标签数量也没有限制。因此,一个集合中可以有很多不同的标签。当然,我总是先按用户 ID 搜索,然后再按标签搜索...
    • @Ben 并非总是如此,在 1k 代表您可以制作自己的标签,即使该领域的选择性很高我也没有看到一个大问题,公平地说我还没有构建你的应用程序但是立即,如果您正确规划集群,我不会在没有测试的情况下看到严重的问题。这将是一个大索引,但这是无法避免的,您可以拆分标签,但随后您将失去对某些文档的上下文搜索,因为 MongoDB 没有连接,而 NoSQL 通常没有。
    • 所以你认为我应该对每个用户 ID 进行分片,并为用户 ID 和标签以及我可能需要的其他字段添加索引。那应该可以毫无问题地扩展吗?
    • @Ben 这取决于,如果您的 95% 的查询都是 user_id 和 tag ,那么我会在两者的复合索引上分片,这实际上归结为您的查询模式。你最常做什么?您真的应该真正真正地考虑一下您的分片索引
    • @Ben 我打算在 user_id 和标签上使用复合索引,在这种情况下,MongoDb 可以使用部分索引,因此仅使用 user_id 的查询应该能够使用主分片索引。并非所有用户数据都在一台服务器上,mongodb 会根据需要拆分块,这意味着并非所有用户数据都可能在一台服务器上,尽管这只是给了我另一个想法,您可以使用标签感知分片(v2.2) 如果您愿意,可以实际实现这一点:) 这可能(需要测试)会降低您的索引大小
    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多