有效的mongodb +猫鼬.架构设计

Kat*_*Kat 4 database mongoose mongodb node.js

我是mongodb和nosql数据库的新手.我真的很感激我的架构设计的一些输入/帮助,所以我不会在脚下拍摄自己.

数据:我需要建模Quote.A Quote包含很多Ttems.每个Item包含许多Orders.每个Order都与特定的财政季度挂钩.防爆.我有一个Quote含有Item具有OrderS IN Q3-14,Q4-14,Q1-15.Order唯一去最多 12个季度(3年)的未来.具体来说,我在建模Order-quarter绑定时遇到了麻烦.我试图对数据进行非规范化并嵌入Quote< - Items < - Orders以提高性能.

试图/意见:

  1. 有一个Order包含yearqNum字段的架构.嵌入Orders每一个阵列Item.也qKey可以通过字符串创建用于设置/获取的虚拟字段Q1-14
  2. 创建一个将Orders 嵌入到Item使用键中的哈希Q1-14.这样会很好,但Mongoose本身不支持.
  3. 存储每个中的当前(基准)四分之一Quote,并且每个都Item包含一个Orders 数组,但是它们与基数季度的#quarters偏移量进行索引.即如果它当前是Q1-14,并且Q4-14的订单进入,则将其存储在阵列位置2.

我完全脱离了标记吗?当我努力有效地使用Mongo时,任何建议都会受到赞赏.谢谢

srq*_*inn 6

免责声明:我已经开始将此作为对自己的挑战.请参阅<rant>下面的解释,了解为什么我不同意您的方法.

掌握No-SQL的第一步是抛弃像"denormalize"这样的术语 - 它们根本不适用于基于文档的数据存储.要理解的另一个重要概念是JOINSMongoDB 中没有,因此您必须完全改变您对数据的思考方式.

解决问题的最佳方法mongoose是分别为报价和项目设置集合.然后我们可以在这些集合之间设置引用以将文档"链接"在一起.

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var quoteSchema = new Schema({
  items: [{ type: Schema.Types.ObjectId, ref: 'Item' }]
});

var itemSchema = new Schema({});
Run Code Online (Sandbox Code Playgroud)

这可以处理您的报价 - >项目"关系".要获得Orders设置,你可以像你所指出的那样使用一系列嵌入式文档,但如果你决定开始查询/索引订单,那么你就可以在没有桨的情况下找到一条小溪.同样,我们可以用引用来解决这个问题:

var itemSchema = new Schema({
  orders: [{ type: Schema.Types.ObjectId, ref: 'Order' }]
});

var orderSchema = new Schema({
  quarter: String
});
Run Code Online (Sandbox Code Playgroud)

现在您可以使用人口来获得您需要的东西:

Item
  .findById(id)
  .populate({
    path: 'orders',
    match: { quarter: 'Q1-14' }
  })
  .exec(function (err, item) {

    console.log(item.orders); // logs an array of orders from Q1-14

  });
Run Code Online (Sandbox Code Playgroud)

引用的问题在于,您实际上是使用两次读取指令来访问数据库,一次是查找父文档,然后是一次填充其引用.

您可以在此处阅读有关参考和人口的更多信息:http://mongoosejs.com/docs/populate.html

<rant>
Run Code Online (Sandbox Code Playgroud)

我可以继续几个小时,为什么你应该坚持使用RDBMS来获取这类数据.特别是当选择的辩护是缺乏ORM和Mongo"风靡一时"时.工程师为解决方案挑选最好的技术,而不是因为某种技术趋势.它是周末hackery和创建企业级产品之间的区别.不要误解我的意思,这不是垃圾No-SQL - 我维护的最大代码库是基于NodeJS和MongoDB构建的.但是,我选择这些技术是因为它们是我基于文档的问题的正确技术.如果我的数据是像你这样的关系排序系统,我会在心跳中抛弃Mongo.

</rant>
Run Code Online (Sandbox Code Playgroud)