草庐IT

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

coder 2023-10-28 原文

您推荐哪种 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/

有关mongodb - NoSQL 数据库设计 - 带标签的文档的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 在院子里用@param 标签警告 - 2

    我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. css - 用 watir 检查标签类? - 2

    我有一个div,它根据表单是否正确提交而改变。我想知道是否可以检查类的特定元素?开始元素看起来像这样。如果输入不正确,添加错误类。 最佳答案 试试这个:browser.div(:id=>"myerrortest").class_name更多信息:http://watir.github.com/watir-webdriver/doc/Watir/HTMLElement.html#class_name-instance_method另一种选择是只查看具有您期望的类的div是否存在browser.div((:id=>"myerrortes

  7. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  9. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐