NoSQL数据库设计用于类似电子邮件的Web应用程序

时间:2014-01-17 17:12:37

标签: mongodb mongoose nosql

我正在开发一个受电子邮件服务(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没有太多经验。

我想听听你对此的看法,这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

您设计的一个明显的性能考虑因素是您可能将large embedded arrays of messages存储在单个对话文档中。随着非常活跃的对话变得越来越大,这些文档将需要更频繁的磁盘重定位,最终可能会达到maximum document size(16MB,如MongoDB 2.6)。如果您只关心数组中最近的消息,那么即使您只通过驱动程序调用只投影了一部分最新信息,也会导致将整个文档加载到MongoDB服务器的内存中的成本增加。

关于如何设计有效的消息传递方法的一些想法,我建议阅读Socialite项目的文档。对于您的用例来说,这绝对有点过分,但您可能会发现一些有用的事情需要考虑。例如,Feed Service描述了几种不同的方法,包括各种方法的缺点和建议。