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

时间:2014-01-15 18:22:12

标签: node.js mongodb mongoose database

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

数据:我需要对Quote进行建模。 Quote包含许多Ttem个。每个Item包含许多Order个。每个Order都与特定的财务季度挂钩。 实施例。我的Quote包含Item,其在Q3-14,Q4-14,Q1-15中有Order秒。 Order只有 max 未来12个季度(3年)。具体来说,我在建模Order - 四分之一绑定时遇到了麻烦。我正在尝试对数据进行非规范化并嵌入Quote< - Item s< - Order s以提高性能。

尝试/创意:

  1. 拥有包含Orderyear字段的qNum架构。在Orders每个Item中嵌入一个qKey数组。还可以创建虚拟Q1-14字段,以便通过Order
  2. 等字符串进行设置/获取
  3. 使用Item等密钥创建一个将Q1-14嵌入Quote的哈希值。这样会很好,但Mongoose本身不支持。
  4. 将当前(基准)季度存储在每个Item中,并使每个Order包含一个{{1}}的数组,但将它们与基数季度的#quarters偏移量进行索引。即如果它当前是Q1-14,并且Q4-14的订单进入,则将其存储在阵列位置2。
  5. 我完全不在标记处吗?当我努力有效地使用Mongo时,任何建议都会受到赞赏。谢谢

1 个答案:

答案 0 :(得分:5)

  

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

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

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

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

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

var itemSchema = new Schema({});

处理您的报价 - &gt;项目“关系”。要获得订单设置,您可以使用您已指示的嵌入式文档数组,但如果您决定开始查询/索引订单,那么您将在没有划桨的情况下上一条小溪。同样,我们可以通过引用来解决这个问题:

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

var orderSchema = new Schema({
  quarter: String
});

现在您可以使用人口来获得所需内容:

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

  });

引用的问题在于,您实际上是在读取DB指令两次,一次找到父文档,然后一次填充其引用。

您可以在此处详细了解参考和人口:http://mongoosejs.com/docs/populate.html

<rant>

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

</rant>