1

我开始为一个肯定会有很多并发访问的项目设计一个全新的 MongoDB 数据库。我选择 MongoDB 是因为我知道它的可扩展性以及查询的速度。

然而,我知道,即使使用 MongoDB,为了性能,我也应该尽可能少地访问数据库。

我知道另一个 NoSQL 数据库 Apache Cassandra 提倡“查询优先”的方法,这意味着您应该首先考虑您的查询,然后根据它们组织您的数据结构。

现在,我想知道同样的原则是否适用于 MongoDB。

到目前为止,我在网上没有找到任何关于此的相关讨论。

4

2 回答 2

1

为了在 Mongo 中组织和建模数据,您要学习和搜索的词是denormalization。在使用 Mongo 时,我肯定会首先考虑您的问题。不仅用于建模,还用于索引。

我在 Mongo 会议上听到的关于如何非规范化的一个很好的规则:

  1. 如果数据是相当静态的,请继续将数据非规范化/嵌入到文档中。
  2. 如果数据经常更改,请参考另一个文档。

经过一年的 Mongo 制作工作,我已经看到这是非常真实的。嵌入经常变化的数据给我们带来了很大的痛苦。

于 2013-04-18T17:40:49.753 回答
0

在使用 MongoDB 时,首先查询很重要,因为您不能“按原样”存储所有数据,而只能创建任意查询和跨表(集合)连接。MonogDB 是一个面向文档的数据库,即。您总是使用文档而不是来自不同表的结果集。

好消息是 MongoDB 少了模式。您可以随心所欲地构建文档,甚至可以根据需要随时间更改文档的架构。但是你需要事先考虑的是如何(使用什么样的键和索引)以及何时(记住,你不能做连接!)你将要检索它们。

正如 ryan1234 所建议的,非规范化是解决此问题的一种选择。但是,这可能会导致数据冗余,并且随着时间的推移会变得难以维护。因此,您可能不想对所有内容进行非规范化。您需要务实地解决应用程序代码中的这些缺点。这里有一些建议:

  • 只要内存占用是可以接受的,就可以预取经常使用的数据,例如查找表。
  • 决定哪些数据需要根据需要快速提供,例如通过 Web 界面上的请求。理想情况下,您将只有一个可以使用索引查询的键,该索引将为您提供单个请求所需的所有数据。
  • 确定可以使用长时间运行的作业(例如 map reduce 或队列)在后台处理哪些数据。或者甚至有自定义的 cronjob 计划作业,这些作业将对您的数据执行某些操作,例如准备您可以稍后使用索引检索的报告。
  • 在您的客户端中执行多个请求并加入数据。例如,如果您有一个 Web 客户端,您可以执行多个后续请求以提取数据,您可能会使用 RDBMS 在单个请求中完成这些请求。如果被索引,MongoDB 中的查询非常快,只要您不同步多个查询并在服务器上连接数据,执行许多请求本身就没有错。在客户端上执行此操作可让您在逐步构建 UI 的同时利用整个堆栈(负载均衡器、缓存等)
于 2013-04-18T20:20:17.553 回答