非关系型数据库设计 - 标签文档

4
我推荐使用 MongoDB,对于此 Web 应用程序的需求,其模式应如下所示:
1. 可能有大量用户(500k+) 2. 每个用户都可以输入自己的文档 3. 每个用户可能每月创建 10-200 个文档 4. 每个文档将很小(约 100 字) 5. 用户可以使用自己的标签对文档进行标记 6. 不同用户的数据不会与其他用户及其数据交互 7. 用户可以通过标签搜索他/她的条目 8. 快速访问一个用户的所有条目 9. 用户可以创建复杂的动态查询来查询他/她的数据
但我注意到使用一个巨大的集合进行标签搜索似乎不是一个好主意。我担心索引的大小会非常大,因为每个用户都可以拥有自己的标签。MongoDB 将为整个集合创建标签索引,但我只会从一个用户的条目中搜索标签,而不是从所有用户的条目中搜索。
因此,按用户分配集合的想法似乎更合适,但似乎有一个限制,即一个人最多只能创建多少个集合,这种方法似乎也不理想。
CouchDB 不支持动态查询,因此不适合此应用程序。
在 MongoDB 中,您可以为每个用户创建一个集合,并使用用户 ID 作为集合名称。这将使您能够轻松地按用户分组数据,并允许您使用该用户的 ID 进行快速搜索。
还有一些其他的 NoSQL 数据库,如 Cassandra 和 Riak,也可以处理此类数据模型。
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中存储数据? (每个板块的收藏夹?)如果您查看评论,那里也可能有一些帮助。

标签的问题在于每个用户都可以拥有自己的一组标签。在SO,所有用户都使用相同的标签。即使每个文档的标签数量有限制,但一个用户拥有的标签数量是没有限制的。因此,一个集合中可以有很多不同的标签。当然,我总是首先按用户ID搜索,然后再按标签搜索... - Ben
1
@Ben 不总是这样,当你达到1k声望时,你可以创建自己的标签,即使领域的高选择性,我并没有看到一个巨大的问题,公平地说,我没有构建你的应用程序,但是立即,没有测试,如果你正确规划你的集群,我不认为会有严重的问题。它将是一个大索引,但这是无法避免的事情,你可以将标签拆分,但是你将失去一些文档的上下文搜索,因为MongoDB没有连接,而NoSQL通常也没有。 - Sammaye
那么你认为我应该按照用户ID进行分片,并为用户ID、标签和其他可能需要的字段添加索引。这样就可以无问题地扩展了? - Ben
@Ben 这取决于你95%的查询是否都包含user_id和tag,如果是的话,我会在这两个字段上建立一个复合索引,实际上这取决于你的查询模式。你最常做什么?你真的真的真的应该考虑一下你的分片索引。 - Sammaye
1
@Ben 在这种情况下,我会选择在user_id和tags上建立复合索引,MongoDb可以使用部分索引,因此仅使用user_id的查询应该能够使用主分片索引。并非所有用户数据都可能在一个服务器上,mongodb将根据需要拆分块,这意味着不是所有用户数据都可能在单个服务器上,尽管这给了我另一个想法,您可以使用标记感知分片(v2.2)来实现这一点,如果您喜欢:)这可能会(需要测试)降低您的索引大小。 - Sammaye
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接