Facebook风格消息:高效查询

时间:2011-05-27 05:49:20

标签: mysql

users tbl:
id
username
first_name
last_name
email_address

messages tbl:
id
date_sent
title
content
status

message_relation tbl:
id
message_id
sender_id
receiver_id

在给定这些表的情况下,向所选用户查询消息的最有效方法是什么?换句话说,我想列出userA的“收件箱”中的所有邮件

其次,您如何建议处理需要从管理员发送给所有人的全局消息?

2 个答案:

答案 0 :(得分:1)

我认为这就是你要找的......

SELECT [WHATEVER] FROM 
messages
INNER JOIN message_relation
 ON (messages.id = message_relation.message_id AND message_relation.receiver_id = $id)

这有效地满足了您的要求。如果您还想在任一用户上选择字段,可以将Receiver_ID加入User_ID以获取该字段。

如果您需要全局/管理员消息,建议的表格设置:

Messages (Message_ID, [Fields common to all messages, e.g. Message_Content, Message_Timestamp, etc])
Global_Messages (Global_Message_ID, Message_ID, [any fields specific to Global_Messages])
User_Messages (User_Message_ID, Message_ID, [any fields specific to User_Messages])
User_Message_Relations (User_Message_Relations_ID, User_Message_ID, Sender_ID, Receiver_ID)

然后,查询收件箱,例如:

SELECT [WHATEVER] FROM
Messages

LEFT JOIN (Global_Messages)
 ON (Messages.Message_ID = Global_Messages.Message_ID)

LEFT JOIN (User_Messages)
 ON (Messages.Message_ID = User_Messages.Message_ID)

LEFT JOIN (User_Message_Relations)
 ON (User_Messages.User_Message_ID = User_Message_Relations.User_Message_ID AND User_Message_Relations.Receiver_ID = $uid)

这将为您提供一个结果,您可以循环访问以获取用户的整个收件箱。

答案 1 :(得分:1)

SELECT 
    m.id, m.date_sent,m.title,m.content,m.status
FROM 
    messages m
INNER JOIN 
    message_relation mr on (mr.message_id = m.id)
INNER JOIN
    users u on (u.id = mr.receiver_id);
WHERE u.id = ...your current user id ...

这是一种简单的方法,它可以快速而且几乎没有负载数据库