看到一个关于站内信设计的文章:http://www.cnblogs.com/grenet/archive/2010/03/08/1680655.html 
受些启发,刚好自己也需要这样一个功能,就分享一下我的设计。 
需要注意的点: 
1、站内信可以是点对点发,也可以是群发,但发件人永远只有一个。 
2、发件人不需要知道信是否已读 
3、删除的时候,如果发件人把信删了,收件人的信不能丢失 

综合分析,设计表如下: 
message_sender 发件人信息表 
mid from_uid from_username title content from_deleted date 

mid:信息ID,自增 
from_uid from_usernam:发件人的ID和用户名 
title content:信息标题和内容 
from_deleted:发件人是否删除 

message_receiver 收件人信息表 
rid mid to_uid to_username is_readed is_deleted 

rid:id 自增 
mid:信息ID,与message_sender表中MID对应 
to_uid to_username:收件人信息 
is_readed is_deleted:收件人是否已读是否删除 

使用: 
查发件箱:只需要查message_sender表 
查收件箱:需要同时查两个表 
群发邮件:message_sender表只需要插入一条数据,message_receive表重复插入。 
删除邮件:只需要修改状态值 

对于删除邮件,可能时间长了,会有一些收、发件人都删除的无用邮件存在。可以定期运行一断脚本来清理无效邮件,或者直接在删除的时候判断是否双方都删除了邮件,这样对群发实现相对复杂点。 

当然,如果网站想记录所有的邮件往来,即使用户删除了,管理员还想看到,那只改一下状态就好了。 

建表SQL 

Sql代码  收藏代码
    1. CREATE TABLE `message_sender` (  
    2.   `mid` int(11) NOT NULL auto_increment,  
    3.   `from_uid` int(11) NOT NULL COMMENT '发信人',  
    4.   `from_username` varchar(32) NOT NULL,  
    5.   `title` varchar(200) NOT NULL COMMENT '信息标题',  
    6.   `content` text NOT NULL COMMENT '信息内容',  
    7.   `from_deleted` tinyint(4) NOT NULL,  
    8.   `date` int(10) NOT NULL COMMENT '发送日期',  
    9.   PRIMARY KEY  (`mid`)  
    10. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='用户站内信' AUTO_INCREMENT=4 ;  
    11.   
    12. CREATE TABLE `ar_message_receiver` (  
    13.   `rid` int(11) NOT NULL auto_increment,  
    14.   `mid` int(11) NOT NULL,  
    15.   `to_uid` int(11) NOT NULL,  
    16.   `to_username` varchar(32) NOT NULL,  
    17.   `is_readed` tinyint(4) NOT NULL,  
    18.   `is_deleted` tinyint(4) NOT NULL,  
    19.   PRIMARY KEY  (`rid`)  
    20. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  
posted on 2016-05-05 15:57  Sharpest  阅读(347)  评论(0)    收藏  举报