我正在开发一个受电子邮件服务(Gmail)启发的私人消息的Web应用程序,它使用客户端的AngularJS和MongoDB(Mongoose)以及用于RESTful服务器的NodeJS。
目前,这是数据库结构
{
conversation: {
user1: {
type: mongoose.Schema.ObjectId,
ref: 'User'
},
user2: {
type: mongoose.Schema.ObjectId,
ref: 'User'
},
user1Flags: [String],
user2Flags: [String],
messages: [{
title: String,
content: String,
sender: {
type: mongoose.Schema.ObjectId,
ref: 'User',
},
sentAt: Date,
createdAt: Date,
attachments: [String],
senderMetaData: {
archived: Boolean,
deleted: Boolean
},
recipientMetaData: {
archived: Boolean,
deleted: Boolean
}
}]
}
}
嗯,我对此感到满意,但我对NoSql没有太多经验。
我想听听你对此的看法,这是正确的方法吗?
答案 0 :(得分:1)
您设计的一个明显的性能考虑因素是您可能将large embedded arrays of messages存储在单个对话文档中。随着非常活跃的对话变得越来越大,这些文档将需要更频繁的磁盘重定位,最终可能会达到maximum document size(16MB,如MongoDB 2.6)。如果您只关心数组中最近的消息,那么即使您只通过驱动程序调用只投影了一部分最新信息,也会导致将整个文档加载到MongoDB服务器的内存中的成本增加。
关于如何设计有效的消息传递方法的一些想法,我建议阅读Socialite项目的文档。对于您的用例来说,这绝对有点过分,但您可能会发现一些有用的事情需要考虑。例如,Feed Service
描述了几种不同的方法,包括各种方法的缺点和建议。