首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

说站内信的数据库设计

2012-12-18 
谈站内信的数据库设计看到一个关于站内信设计的文章:http://www.cnblogs.com/grenet/archive/2010/03/08/1

谈站内信的数据库设计
看到一个关于站内信设计的文章: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个表。
这个不算是致命问题,收件人看信,也是操作两个表。这个很正常。
你要用一个表解决这个问题的话,表里面的数据重复就太多了。

热点排行