2011-05-16 110 views
0

我在寻找一些关于如何为电子邮件式应用程序设计数据库的建议,特别是如何处理向多个用户发送消息,以及显示发送给用户的消息。电子邮件式应用程序的数据库设计

这是我到目前为止有:

消息(主键是ID)

  • ID(身份)
  • SenderId(外键Users.Id)
  • <消息数据>

ReceivedMessages(主键的MessageId + RecipientId)

  • 的MessageId(外键Messages.Id)
  • RecipientId(外键Users.Id)
  • IsRead

所以对于发送的每条消息,消息中都会有一行,包含数据,然后是ReceivedMessages中每个收件人的一行。

但是,如果我想查看用户发送的所有消息以及他们发送给谁的信息呢?对于每条消息,我需要找到该消息的所有ReceivedMessages行,并将所有这些消息与用户表连接起来,然后以某种方式将所有名称连接起来(例如:Concatenate many rows into a single text string?)。这可能导致扩展问题,或者它不是真的担心什么?

有什么想法/建议吗?谢谢。

回答

2

我认为您的设计没有问题,并且不会在您的表格上正确建立索引(除非您正在讨论大规模,例如gmail,Yahoo邮件等),否则无法预测和扩展问题。

就连接收件人名称而言,我建议您在应用程序端而不是SQL中执行此操作,或者确定是否需要执行此操作(您可能希望显示列表而不是连接字符串)。

1

所有用户发送的消息,以及他们是谁发送到

你可以做到这一点作为一个汇总查询,像:

SELECT u1.user_name, m.message, GROUP_CONCAT(DISTINCT u2.user_name) 
FROM messages m JOIN users u1 ON (m.senderID=u1.user_id) 
       JOIN receivedmessages r ON (m.id=r.messageId) 
       JOIN users u2 ON (r.RecipientId=u2.user_id) 
GROUP BY u1.user_name, m.message; 

但由于收件人基本上是无限制,您可以在GROUP_CONCAT上针对字符串长度限制运行。

所以它很可能更好的显示做一个未聚集的选择和处理记录在应用程序层:

SELECT u1.user_name, m.message, DISTINCT u2.user_name 
FROM messages m JOIN users u1 ON (m.senderID=u1.user_id) 
       JOIN receivedmessages r ON (m.id=r.messageId) 
       JOIN users u2 ON (r.RecipientId=u2.user_id) 
ORDER BY u1.user_name, m.sent_date, u2.user_name; 
0

更改用户名和电子邮件,而不是他们的登录。考虑模仿基于unix的邮箱中发生的事情(例如,松)代替:

received_messages (
    user_id, 
    message_id, 
    message_date, 
    message_title, 
    message_content, 
    message_sender, 
    message_recipient, 
    message_is_read 
) 

并且沿着相同的路线sent_messages,即每个用户的两个“文件”。

甚至将后两者与发送/接收的标志合并。

0

我面临着为网站创建电子邮件或消息系统的相同挑战......你们忘了一件事...... IsRead,IsDraft,IsFlagged,IsReply,IsTrash等......需要在单独的表格,因为相同的信息将被两个或多个人标记,读取或未读!因此,我们必须有一个状态表如下所示...

StatusID int  
MessageID int 
MemberID int 
DateTime datetime  
IPAddress varchar(65) 
IsRead char(1) 
IsDraft char(1) 
IsFlagged char(1) 
IsForwarded char(1) 
IsReply char(1) 
IsTrash char(1) 

您需要除了会员或用户表中至少有三个表:

mail 
folders 
status 
attachment 
log 

如果这是一个现有的网站...如果你希望这个邮件系统有很多活动,我会把邮件系统分成一个单独的数据库。

相关问题