消息应用程序的MongoDB结构

时间:2012-06-27 14:20:33

标签: mongodb database-schema bson

我正在考虑处理消息应用程序的良好文档结构。

我基本上需要三种(或四种)对象:

  1. 用户(用户名,电子邮件,密码等)
  2. 联系人列表(包含不同的联系人或联系人群组)
  3. 对话(对话是某些人之间的消息集合)
  4. 消息(包含消息正文,某个时间戳和创建者。)
  5. 我的想法是将联系人嵌入到用户文档中并将消息嵌入到对话文档中:

    1。用户

    {
        username: 'dev.puS',
        usernameCanonical: 'dev.pus', // used for unique constraints
        email: 'developement.pus@gmail.com,
        emailCanonical: 'developement.pus@gmail.com,
        salt: 'some hash',
        password: 'hash with salt',
        logs: { last_login: 12.06.2008, last_password_reset: 04.03.2007 },
        state: { online: true, available: false },
        contacts: [ user_id1, user_id2, user_id3 ]
    }
    

    2。会话

    {
        members: [ user_id1, user_id2 ],
        messages: [
            { author: user_2, body: 'Hi what's up' },
            { author: user_1, body: 'Nothing out here :(' },
            { author: user_2, body: 'Whanna ask some question on stackoverflow' },
            { author: user_1, body: 'Okay, lets go' }
        ]
    }
    

    您对此架构有何看法?

    我认为最好将它们分开(因此每个文档都是自己的),因为每个文档都有不同的更新频率。但我真的没有任何经验,所以听听一些建议会很好:)

    此致

4 个答案:

答案 0 :(得分:11)

我看到这个问题已经过时了,但是对于任何有兴趣的人,都会提出类似的问题并且一个答案看起来可行[{3}}

Conversation : {
 id: 123,
 members: [ user_id1, user_id2 ]
}
Message { conversationId: 123, author: user_2, body: 'Hi what's up' }
Message { conversationId: 123, author: user_1, body: 'Whanna ask some question on stackoverflow' }

更新#1

1)可扩展性:MongoDB可以很好地扩展到非常大的集合。每个集合数十亿条消息。有一种称为分片的技术可以让您将更大的集合拆分为多个节点。

2)阅读。由于MongoDB具有索引机制,因此读取与任何微调数据库引擎相当。所以阅读不会成为问题。特别是,当会话(组室)具有较少的参与者时,例如两个人彼此消息传递。

答案 1 :(得分:4)

您的问题实际上是架构设计之一。我建议看一下MongoDB架构设计的这个页面,以了解选择和权衡:http://www.mongodb.org/display/DOCS/Schema+Design

此外,您应该查看该文档“另请参阅”部分中的链接。我特别推荐视频演示。

最后,您应该查看本文档,讨论消息/评论数据库的三种可能模式,包括每种设计的权衡:http://docs.mongodb.org/manual/use-cases/storing-comments/

答案 2 :(得分:0)

这是我的建议

{
"_id" : ObjectId("5a9e9581a2147c0c0f00002e"),
"id_members1" : "5a9e9581a2147c0c0f02345t",
"id_members2" : "5a9e9581a2147c0c0f02134g",
"name" : [ 
    "Omar", 
    "Mohamed"
],
"messages" : [ 
    {
        "author" : "Omar",
        "body" : "salam 3likom",
        "create_at" : ISODate("2018-03-07T09:04:04.000Z")
    }, 
    {
        "author" : "Mohamed",
        "body" : "Wa3likom salam",
        "create_at" : ISODate("2018-03-07T09:04:04.000Z")
    }, 
    {
        "author" : "Mohamed",
        "body" : "wach teshak",
        "create_at" : ISODate("2018-03-07T09:04:04.000Z")
    }, 
    {
        "author" : [ 
            "Omar", 
            "Mohamed"
        ],
        "body" : "test msg",
        "create_at" : ISODate("2018-03-25T15:30:05.000Z")
    }
],
"comments" : [ 
    null, 
    {
        "author" : [ 
            "Omar", 
            "Mohamed"
        ],
        "body" : "test msg",
        "create_at" : ISODate("2018-03-25T15:28:11.000Z")
    }, 
    {
        "author" : [ 
            "Omar", 
            "Mohamed"
        ],
        "body" : "test msg",
        "create_at" : ISODate("2018-03-25T15:28:31.000Z")
    }
]

}

答案 3 :(得分:0)

请找到我的建议

    Person : {
        person_id: '123',
        last_login: 12.06.2008,
        online: true
    }

Conversation : {
 conversation_id: append the greater person_id to the lower person_id, // person_1_id =123 and person_2_id =124 then its 123124

messages: [ 
        { message_id: 1, 
          message_text : 'Hi what's up',
          sender_id : 123,
          receiver_id: 124,
          timestamp : 12344567891
        },
        { message_id: 2, 
          message_text : 'fine',
          sender_id : 124,
          receiver_id: 123,
          timestamp : 12344567891
        }
       ]
}