我只是学习NoSQL,特别是MongoDB,更具体地说是在Node下学习mongoose;但这是一个有点不可知的设计问题。
我在各种教程中看到的是一个数据设计,它在子节点和父节点之间具有双向链接,父节点将子节点的集合存储为ObjectId数组。然后,Mongoose可以使用populate()拉入实际的子对象。例如:
var PostSchema = new mongoose.Schema({
title: String,
comments: [{type: mongoose.Schema.Types.ObjectId, ref: 'Comment'}]
});
var CommentSchema = new mongoose.Schema({
comment: String,
post: {type: mongoose.Schema.Types.ObjectId, ref: 'Post'}
});
对我来说,这似乎会产生以下问题:
1)现在插入新评论还需要对Post记录进行额外更新,以将评论ID添加到评论集合中。删除评论也是如此。
2)没有引用完整性,应用程序本身的负担是确保没有评论被孤立,并且没有帖子包含无效的注释ID。
3)populate()方法是mongoose的一部分,而不是MongoDB,所以如果我需要用其他东西访问这些数据,我该如何获取子对象?
我总是(也许错误地)理解NoSQL的好处是你可以将整个对象图存储为一个实体。所以,如果不看这些教程,我会天真地存储"注释"作为完整的物体和柱子,并使用投影,以避免在我不需要它们时加载它们。现在玩了它,我不明白你为什么不想这样做。我让我的同伴StackOverflowians进行启发。