glo*_*tho 5 mongoose mongodb nosql node.js
我试图在node.js应用程序中使用Mongoose分解我的RDBMS心态,并且可以使用一些指导来获得最佳实践.
一个简单的例子:假设有两个集合,组织和联系人.这是一对多的关系,他们都需要孤独.但是,在索引方法中,我想返回一个组织对象数组,每个组织对象都有一个成员联系对象数组.(后来我想返回一组联系人,每个联系人都有一个组织对象.)
在我看来,我误解了实现这一目标的最佳方法.这是我到目前为止看到的选项:
在组织文档中嵌入联系人及其ID.然后索引查询可以Organization.find({}, function(err, orgs) { orgs[n].contacts[n]...}).
缺点:需要大量额外存储空间,并且必须在更改"主"联系人文档时更新嵌入式联系人文档.
利用Mongoose的populate/DBRef结构在两个表中存储"外键"ID.然后查询可以是:Organization.find({}}.populate('contacts').run(...).
缺点:您必须在两侧存储密钥.
转到更传统的"外键"路线,只将组织ID存储在联系人文档中.查询组织文档,然后查询组织查询的回调中的所有联系人,将数据合并到一个对象中以返回. 缺点:多个查询和额外的处理开销(我相信我们必须独立地找到这些组织的组织和联系人,然后遍历每个组织,在公共_id字段上手动匹配,将它们组合成新的输出对象).
我一定错过了一个更好的选择.允许#3模式的东西,但返回所需的组合对象,开销更少.
注意:异步模块似乎可以帮助解决这个问题,但这真的是唯一/最好的方法吗?
这实际上取决于您要提出的查询。- 您的网站更依赖于联系人还是组织?- 您是否经常需要显示某个组织的所有联系人?- 您需要在组织页面上显示联系人的哪些详细信息?
ETC。
所以这实际上取决于您的项目的需求。您的组织和联系人页面是否不断更新?如果不是这样,那么复制数据似乎并不是一个坏主意,特别是如果您的网站的阅读量更大。
底线:考虑网站上将有哪些页面以及这些页面需要显示什么(因此需要进行哪些查询)。