gpt4 book ai didi

node.js - 有效的 mongodb + Mongoose 。架构设计

转载 作者:可可西里 更新时间:2023-11-01 09:27:34 27 4
gpt4 key购买 nike

我是 mongodb 和 nosql 数据库的新手。我非常感谢对我的架构设计提供一些输入/帮助,这样我就不会搬起石头砸自己的脚。

数据:我需要为Quote建模。一个 Quote 包含许多 Ttem。每个 Item 包含许多 Order。每个 Order 都与特定的财政季度相关联。 例如。我有一个包含 ItemQuote,它在 Q3-14、Q4-14、Q1-15 中有 OrderOrder最多 future 12 个季度(3 年)。具体来说,我在为 Order-quarter 绑定(bind)建模时遇到了问题。我正在尝试对数据进行非规范化并嵌入 Quote <- Item <- Order 以提高性能。

尝试/想法:

  1. 有一个包含yearqNum 字段的Order 架构。在每个 Item 中嵌入一组 Orders。还可以创建虚拟 qKey 字段以通过字符串设置/获取,如 Q1-14
  2. 创建一个散列,使用 Q1-14 等键将 Order 嵌入到 Item 中。这很好,但 Mongoose 本身不支持。
  3. 在每个 Quote 中存储当前(基础)季度,并让每个 Item 包含一个 Order 数组,但将它们编入索引通过#quarters 从基准季度偏移。 IE。如果当前是第 1-14 季度,并且收到第 4-14 季度的订单,则将其存储在数组位置 2 中。

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

最佳答案

Disclaimer: I've embarked on this simply as a challenge to myself. See the <rant> below for an explanation as to why I disagree with your approach.

牢牢掌握 No-SQL 的第一步是摒弃“非规范化”等术语——它们根本不适用于基于文档的数据存储。另一个需要理解的重要概念是没有 JOINS在 MongoDB 中,因此您必须完全改变您对数据的看法才能进行调整。

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

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

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

var itemSchema = new Schema({});

处理您的报价 -> 项目“关系”。要设置 Orders,您可以使用您所指示的嵌入式文档数组,但是如果您决定开始查询/索引 Orders,您将在没有桨的情况下沿着某条小溪前进.同样,我们可以通过引用来解决这个问题:

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

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

现在你可以使用 population 来获得你需要的东西:

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

});

引用的问题在于您实际上是用读取指令访问数据库两次,一次是为了找到父文档,然后一次是为了填充它的引用。

您可以在这里阅读更多关于引用文献和人口的信息:http://mongoosejs.com/docs/populate.html

<rant>

为什么您应该坚持使用 RDBMS 处理此类数据,我可以继续讲几个小时。 Especially when the defense for the choice is a lack of an ORM and Mongo being "all the rage."工程师为解决方案选择最好的技术,而不是因为某种技术正在流行。这是周末黑客和创建企业级产品之间的区别。不要误会我的意思,这并不是要破坏 No-SQL——我维护的最大代码库是基于 NodeJS 和 MongoDB 构建的。但是,我选择了这些技术,因为它们是解决我基于文档的问题的正确技术。如果我的数据是像您这样的关系订购系统,我会立刻放弃 Mongo。

</rant>

关于node.js - 有效的 mongodb + Mongoose 。架构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com