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

S. *_*ont 2 relationship mongodb nosql

在此处接受答案的示例:

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

如果是这种情况,是否意味着我的应用每次显示博客帖子时,都会加载对该帖子进行过的每条评论?如果有3,729条评论怎么办?这不会破坏数据库连接,SQL或NoSQL吗?还有一种明显的情况,当我加载博客文章时,我最初只想显示前10条评论。

Add*_*dys 6

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

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

这本身对您可能是有用的信息(?),但我怀疑您需要更具体的答案:)因此,请在您的预期用法上添加一些其他详细信息。

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

  1. 应做:针对常见用例进行优化。通常会发生20/80的故障,其中20%的UX会驱动80%的负载-主页/登陆页面就是一个典型的例子。首先要确保这些效率尽可能高。确保您的数据模型允许A)在单个IO请求中加载数据或B)缓存友好

  2. 不要:不要陷入可怕的“ N + 1”陷阱。当您的数据模型迫使您进行N次调用以加载N个实体时,通常会在进行附加调用以获取N个ID列表之前,执行此模式。这是一个杀手,,尤其是与#3一起时...

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

  4. 应做:平衡读写要求。某些类型的系统需要读取大量数据,您可以假设每次写入都会有许多读取(StackOverflow是一个很好的示例)。因此,为了获得读取性能的好处,使写入更加昂贵是有意义的。例如,数据非规范化和重复。其他系统平衡均匀,甚至书写繁重,并需要其他方法

  5. 要做:利用TIME的维度来发挥自己的优势。Twitter是一个典型的例子:99.99%的推文在头一个小时/一天/一周/之后的任何时间都不会被访问。这在您的数据模式中打开了各种有趣的优化可能性。

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