MongoDB最佳实践-一对多关系

时间:2019-10-22 13:47:12

标签: javascript mongodb mongoose

根据这篇文章,我应该嵌入“参考”:MongoDB relationships: embed or reference?

User.js

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const userSchema = new Schema({
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    createdEvents: ['Event']
});

module.exports = mongoose.model('User', userSchema);

Event.js

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const eventSchema = new Schema({
    title: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    },
    price: {
        type: Number,
        required: true
    },
    date: {
        type: Date,
        required: true
    }
});

module.exports = mongoose.model('Event', eventSchema);

因此,嵌入式事件在数据库中如下所示:

enter image description here

我的代码可以正常工作,但我不奇怪这是否是嵌入事件的正确方法。因为一对多关系的每个示例都是由引用构成的,而不是嵌入的。

1 个答案:

答案 0 :(得分:1)

根据我的经验,使用嵌入引用取决于我们处理的数据量。

在决定选择哪种方法时,您应该始终考虑:

1- 很少见:如果您随时间将少量事件添加到用户,我建议您选择embedding方法,因为它更易于处理。

2- 一对多::如果经常添加新的事件,则完全应该使用referencing以避免将来出现性能问题。

为什么?

当您频繁添加新的事件时,如果它们嵌入在用户文档中,则该文档会随着时间的流逝而变得越来越大。将来您可能会遇到诸如I / O开销之类的问题。您可以在文章Why shouldn't I embed large arrays in my documents?中瞥见大型数组的弊端。尽管很难在任何地方编写它,但是MongoDB中的大型数组被认为是一种性能反模式。

如果您决定推荐,我建议您阅读Building with Patterns: The Bucket Pattern。本文可以使您了解如何以非关系方式设计 user_events 集合。