日期:2014-05-16  浏览次数:20485 次

谈站内信的数据库设计
看到一个关于站内信设计的文章: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 ;
1 楼 kimble 2011-06-22  
这个有个致命的设计问题,如果想查看垃圾箱的短信,则需要操作2个表。
2 楼 baiyuxiong 2011-06-23  
kimble 写道
这个有个致命的设计问题,如果想查看垃圾箱的短信,则需要操作2个表。

这个不算是致命问题,收件人看信,也是操作两个表。这个很正常。
你要用一个表解决这个问题的话,表里面的数据重复就太多了。