我开始为一个肯定会有很多并发访问的项目设计一个全新的 MongoDB 数据库。我选择 MongoDB 是因为我知道它的可扩展性以及查询的速度。
然而,我知道,即使使用 MongoDB,为了性能,我也应该尽可能少地访问数据库。
我知道另一个 NoSQL 数据库 Apache Cassandra 提倡“查询优先”的方法,这意味着您应该首先考虑您的查询,然后根据它们组织您的数据结构。
现在,我想知道同样的原则是否适用于 MongoDB。
到目前为止,我在网上没有找到任何关于此的相关讨论。
我开始为一个肯定会有很多并发访问的项目设计一个全新的 MongoDB 数据库。我选择 MongoDB 是因为我知道它的可扩展性以及查询的速度。
然而,我知道,即使使用 MongoDB,为了性能,我也应该尽可能少地访问数据库。
我知道另一个 NoSQL 数据库 Apache Cassandra 提倡“查询优先”的方法,这意味着您应该首先考虑您的查询,然后根据它们组织您的数据结构。
现在,我想知道同样的原则是否适用于 MongoDB。
到目前为止,我在网上没有找到任何关于此的相关讨论。
为了在 Mongo 中组织和建模数据,您要学习和搜索的词是denormalization。在使用 Mongo 时,我肯定会首先考虑您的问题。不仅用于建模,还用于索引。
我在 Mongo 会议上听到的关于如何非规范化的一个很好的规则:
经过一年的 Mongo 制作工作,我已经看到这是非常真实的。嵌入经常变化的数据给我们带来了很大的痛苦。
在使用 MongoDB 时,首先查询很重要,因为您不能“按原样”存储所有数据,而只能创建任意查询和跨表(集合)连接。MonogDB 是一个面向文档的数据库,即。您总是使用文档而不是来自不同表的结果集。
好消息是 MongoDB 少了模式。您可以随心所欲地构建文档,甚至可以根据需要随时间更改文档的架构。但是你需要事先考虑的是如何(使用什么样的键和索引)以及何时(记住,你不能做连接!)你将要检索它们。
正如 ryan1234 所建议的,非规范化是解决此问题的一种选择。但是,这可能会导致数据冗余,并且随着时间的推移会变得难以维护。因此,您可能不想对所有内容进行非规范化。您需要务实地解决应用程序代码中的这些缺点。这里有一些建议: