【问题标题】:NoSQL database design for email-like web app类似电子邮件的 Web 应用程序的 NoSQL 数据库设计
【发布时间】:2014-02-07 03:11:40
【问题描述】:

我正在开发一个用于私人消息传递的网络应用程序,灵感来自电子邮件服务 (Gmail),在客户端使用 AngularJS,在 RESTful 服务器上使用 MongoDB (Mongoose) 和 NodeJS。

目前,这是 db 结构

{
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 没有太多经验。

我想听听您对此的看法,这是正确的做法吗?

【问题讨论】:

  • 您是否有理由不利用自计算机网络出现以来已标准化的 POP3/IMAP/SMTP 协议?
  • 这应该是更复杂的应用程序的一小部分,并且私人消息不是基于电子邮件地址。

标签: mongodb mongoose nosql


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 2010-12-19
    • 2013-12-19
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2011-09-22
    • 2018-01-31
    相关资源
    最近更新 更多