0

我有一个正在更改为 MongoDB 的关系 SQL 数据库。在 SQL 中有 3 个相关的表:农场、部门、袋熊(此问题的名称和用途已更改)。还有一个 Farmer 表,它相当于用户表。

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

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 改编。有一个更好的方法吗?

4

1 回答 1

2

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

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

对于您的特定场景,请注意唯一数组键的行为可能与预期不同,并且该行为可能会在未来版本中发生变化

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

Farm { 
  _id : ObjectId("...")
}

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

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

嵌入是否是正确的方法在很大程度上取决于使用模式、数据大小、并发写入等 - SQL 的一个关键区别是没有一种正确的方法来建模 1:n 或 n:n 关系,所以你必须仔细权衡每种情况的利弊。根据我的经验,拥有唯一 ID 是一个非常有力的指标,表明文档应该是“一等公民”并拥有自己的集合。

于 2013-10-16T16:31:52.497 回答