看到一个关于站内信设计的文章: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
CREATE TABLE `message_sender` (
`mid` int(11) NOT NULL auto_increment,
`from_uid` int(11) NOT NULL COMMENT '发信人',
`from_username` varchar(32) NOT NULL,
`title` varchar(200) NOT NULL COMMENT '信息标题',
`content` text NOT NULL COMMENT '信息内容',
`from_deleted` tinyint(4) NOT NULL,
`date` int(10) NOT NULL COMMENT '发送日期',
PRIMARY KEY (`mid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户站内信' AUTO_INCREMENT=4 ;
CREATE TABLE `ar_message_receiver` (
`rid` int(11) NOT NULL auto_increment,
`mid` int(11) NOT NULL,
`to_uid` int(11) NOT NULL,
`to_username` varchar(32) NOT NULL,
`is_readed` tinyint(4) NOT NULL,
`is_deleted` tinyint(4) NOT NULL,
PRIMARY KEY (`rid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;