mongodb - NoSQL 中的博客和博客评论关系

标签 mongodb relationship nosql

在此处接受的答案中举一个例子:

对于博客系统,“帖子应该是一个集合。帖子作者可能是一个单独的集合,或者只是帖子中的一个字段,如果只是一个电子邮件地址的话。评论应该是帖子中的嵌入式对象以提高性能。”

如果是这种情况,是否意味着每次我的应用程序显示一篇博文时,我都会加载对该博文发表的每一条评论?如果有 3,729 条评论怎么办?这不会破坏数据库连接、SQL 或 NoSQL 吗?还有一个明显的场景,当我加载一篇博文时,我最初只想显示前 10 条评论。

最佳答案

文档数据库不是关系数据库。您不能先构建数据库模型,然后再决定各种有趣的查询方式。相反,您应该首先确定要支持的访问模式,然后相应地设计文档模式。

因此,为了回答您的问题,我们真正需要知道的是您打算如何使用这些数据。显示与帖子关联的评论与显示来自特定作者的所有评论截然不同。这些需求中的每一个都将决定不同的设计,同时支持它们也是如此。

这本身可能对您有用(?),但我怀疑您想要更具体的答案:) 所以请添加一些关于您的预期用途的额外详细信息。

添加更多信息: 在决定策略时有一些“做”和“不做”:

  1. 做:针对常见用例进行优化。通常有 20/80 的故障,其中 20% 的用户体验驱动 80% 的负载——主页/着陆页就是一个典型的例子。首要任务是确保这些尽可能高效。确保您的数据模型允许 A) 在单个 IO 请求中加载它们或 B) 缓存友好

  2. 不要:不要落入可怕的“N+1”陷阱。当您的数据模型强制您进行 N 次调用以加载 N 个实体时,通常会先进行一次额外的调用以获取 N 个 ID 的列表,然后才会出现此模式。这是一个 killer ,尤其是与#3 一起......

  3. 做:始终限制(通过用户体验)您愿意获取的数据量。如果用户有 3729 条评论,您显然不会一次获取所有评论。即使从数据库的角度来看它是可行的,用户体验也会很糟糕。这就是搜索引擎使用“接下来的 20 个结果”范例的原因。因此,您可以(例如)将数据库结构与 UX 对齐,并以 20 条为单位保存评论。然后每次页面刷新都涉及一次 DB 获取。

  4. 做:平衡读取和写入要求。某些类型的系统是读取密集型的,您可以假设每次写入都会有很多读取(StackOverflow 就是一个很好的例子)。因此,为了提高读取性能而提高写入成本是有意义的。例如,数据反规范化和重复。其他系统均衡甚至写重,需要其他方法

  5. 做:充分利用时间维度。 Twitter 是一个典型的例子:99.99% 的推文在第一个小时/一天/一周之后将永远不会被访问。这会在您的数据架构中开启各种有趣的优化可能性。

这只是冰山一角。我建议阅读一些基于列的 NoSQL 系统(例如 Cassandra)

关于mongodb - NoSQL 中的博客和博客评论关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16173848/

相关文章:

javascript - 如何选择给定条件的数据

mongodb - mongodb 副本集在这种情况下如何 react ?

mongodb - 应用程序无法连接到带有 "Authentication failed"的 MongoDB Enterprise,Ops Manager 卡在 "AdjustUsers"

python - pymongo 无序 vs 有序批量写入速度

c# - MongoDB,MaxPoolSize 限制是否适用于所有客户端实例?

laravel - 试图获得非对象的属性 - laravel 5.4

具有完全复合主键/外键支持的 PHP ORM

neo4j - Neo4j 中的气泡大小

sql - 为什么 MongoDB 比 SQL DB 快得多的任何详细和具体原因?

python - 使用基于 Python 的开源框架和 NoSQL 后端构建 REST API