【发布时间】:2010-04-20 01:04:49
【问题描述】:
使用 facebook 的私人消息系统,您必须在其中跟踪消息内容的发送者和接收者。如果我使用 MySQL,我会有多个表,但使用 MongoDB,我会尽量避免所有这些。我正在尝试提出一个可以扩展且易于维护的“好”模式。如果我使用 mysql,我将有一个单独的表来引用用户和消息。见下文...
个人资料表
user_id
first_name
last_name
消息表
message_id
message_body
time_stamp
user_message_ref 表
user_id (FK)
message_id (FK)
is_sender (boolean)
使用上面列出的架构,我可以查询“Bob”可能拥有的任何消息,无论他是收件人还是发件人。
现在如何将其转换为适用于 MongoDB 的模式。我想我会有一个单独的集合来保存消息。问题是,我如何区分发件人和收件人?如果 Bob 登录,我要查询什么?根据 Bob 是否发起了电子邮件,我不想为了查看邮件是否属于用户而查询“发件人”和“收件人”。
我访问了 MongoDB 的消息组,发现一些可行的方法。 每条消息都将被视为“博客”帖子。创建消息后,将两个用户(无论最初的发送者/接收者是谁)添加到一个数组中。之后的每个响应都将被视为注释,将插入到数组中。
留言
{
"_id" : <objectID>,
"users" : ["bob", "amy"],
"user_msgs" :
[
{
"is_sender" : "bob",
"msg_body" : "Hi Amy, how are you?!",
"timestamp" : <generated by Mongo>
}
{
"is_sender" : "amy",
"msg_body" : "Bob, long time no see, how is the family?!",
"timestamp" : <generated by Mongo>
}
]
}
这样我可以查询涉及“Bob”的消息,并遍历“user_msgs”数组。我将能够分辨出发件人是谁并按时间戳排序。
【问题讨论】:
-
看起来不错的设计。但我遇到了一个问题。我想实现对话线程。因此,当用户打开他的消息时,他应该看到每个对话线程的最后一条消息(发送或接收无关紧要)。所以 Bob 将看到最后一次与 Amy、Chris 和 Ann 交换的消息……(例如,它在 LinkedIn 上就是这样工作的)。但我不知道如何查询这个。因此,对于当前的模式:对于涉及 Bob 的每一篇“博客文章”,我只需要从嵌入式数组中获取最后一条消息。有什么想法吗?
标签: mongodb