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

我试图在node.js应用程序中用Mongoose分解我的RDBMS思想,并且可以使用一些指导来了解最佳实践。

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

在我看来,我误解了完成这个的最好方法。 以下是我迄今看到的选项:

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

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

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

我必须错过一个更好的select。 允许#3的模式的东西,但返回所需的组合的对象,更less的开销。

注意 : asynchronous模块似乎可以帮助这个,但是这真的是唯一的/最好的方式吗?

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

等等。

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

底线 :思考你在网站上有什么网页,这些网页需要显示什么(因此需要做什么查询)。