MongoDB 模式嵌入和嵌套的唯一键



我有一个关系SQL DB,它正在更改为MongoDB。在SQL中,有3个相关的表:农场,部门,袋熊(名称和目的为此问题而更改)。还有一个农民表,相当于一个用户表。

使用猫鼬,我想出了这个新模式:

var mongoose = require('mongoose');
var farmSchema = new mongoose.Schema({
    // reference to the farmer collection's _id key
    farmerId: mongoose.Schema.ObjectId, 
    name: String, // name of farm
    division: [{
        divisionId: mongoose.Schema.ObjectId,
        name: String,
        wombats: [{
            wombatId: mongoose.Schema.ObjectId,
            name: String,
            weight: Number
        }]
    }]
});

每个(现在)嵌套集合中都有一个唯一的字段。这将允许我使用 Ajax 仅发送 uniqueId 和权重(例如)来调整该值,而不是在仅权重更改时更新整个文档。

这感觉就像是MongoDB的错误SQL改编。有没有更好的方法可以做到这一点?

总的来说,我相信人们在使用MongoDB时倾向于嵌入太多。

最重要的论点是,对相同的对象使用不同的编写器会使事情变得更加复杂。使用数组和嵌入对象可能很棘手,并且无法进行某些修改,例如,因为嵌套数组中没有位置运算符匹配。

对于您的特定方案,请注意唯一数组键可能无法按预期运行,并且该行为在将来的版本中可能会更改。

通常希望选择简单的类似SQL的模式,例如

Farm { 
  _id : ObjectId("...")
}
Division {
  _id : ObjectId("..."),
  FarmId : ObjectId("..."),
  ...
}
Wombat {
  _id : ObjectId("..."),
  DivisionId : ObjectId("..."),
  ...
}

嵌入是否是正确的方法在很大程度上取决于使用模式、数据大小、并发写入等 - 与 SQL 的一个关键区别在于,没有一种正确的方法来对 1:n 或 n:n 关系进行建模,因此您必须仔细权衡每种场景的利弊。根据我的经验,拥有唯一的ID是一个非常有力的指标,表明文档应该是"一等公民"并拥有自己的收藏。

最新更新