35

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

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

  1. 用户(用户名、电子邮件、密码等)
  2. 联系人列表(包含不同的联系人或联系人组)
  3. 对话(对话是一些人之间的信息集合)
  4. 消息(包含消息正文、一些时间戳和创建者。)

我的想法是将联系人嵌入到用户文档中,并将消息嵌入到对话文档中:

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

4 回答 4

23

我看到这个问题很老了,但是对于任何有兴趣的人来说,都问了一个类似的问题,一个答案看起来可行https://stackoverflow.com/a/30830429/132610

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 具有索引机制,因此读取可与任何经过微调的数据库引擎相媲美。所以阅读不会成为问题。特别是,当一个对话(组|房间)的参与者较少时,例如两个人互相发送消息。

于 2016-05-25T01:31:01.300 回答
8

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

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

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

于 2012-06-27T18:23:43.690 回答
2

请找到我的建议:

    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
        }
       ]
}
于 2019-08-31T19:43:23.717 回答
-2

这是我的建议

{
"_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")
    }
]

}

于 2018-03-25T16:37:29.907 回答