Mongoose模式/查询最佳实践(MongoDB,node.js)

时间:2011-12-19 20:41:42

标签: node.js mongodb mongoose nosql

我正试图在node.js应用程序中使用Mongoose分解我的RDBMS心态,并且可以使用一些指导作为最佳实践。

一个简单的例子:假设有两个集合,组织和联系人。这是一对多的关系,他们都需要孤独。但是,在索引方法中,我想返回一个组织对象数组,每个组织对象都有一个成员联系对象数组。 (后来我想返回一个联系人数组,每个联系人都有一个组织对象。)

在我看来,我误解了实现这一目标的最佳方法。以下是我到目前为止看到的选项:

  1. 在组织文档中嵌入联系人及其ID。索引查询可以是Organization.find({}, function(err, orgs) { orgs[n].contacts[n]...})缺点:需要大量额外存储空间,并且每次更改“主”联系人文档时都必须更新嵌入式联系人文档。

  2. 利用Mongoose的populate / DBRef结构在两个表中存储“外键”ID。然后查询可以是:Organization.find({}}.populate('contacts').run(...)缺点:您必须在两侧存储密钥。

  3. 转到更传统的“外键”路线,只将组织ID存储在联系人文档中。查询组织文档,然后查询组织查询的回调中的所有联系人,将数据合并到一个对象中以返回。 缺点:多个查询和额外的处理开销(我相信我们必须独立地找到这些组织的组织和联系人,然后遍历每个组织,在公共_id字段上手动匹配,将它们组合成一个新的输出对象)。

  4. 我一定错过了一个更好的选择。允许#3模式的东西,但返回所需的组合对象,开销更少。

    注意async模块似乎对此有所帮助,但这真的是唯一/最佳方式吗?

1 个答案:

答案 0 :(得分:2)

这实际上取决于您要进行的查询。   - 您的网站是否更多地依赖于联系人或组织?   - 您是否经常需要显示组织中的所有联系人?   - 您需要在组织页面上显示哪些联系人详细信息?

所以这真的取决于你的项目需求。您的组织和联系人页面是否在不断更新?如果不是重复数据似乎并不是一个坏主意,特别是如果你的网站更重读。

底线:考虑一下您在网站上的页面以及需要显示的页面(因此需要进行哪些查询)。