phpmysql私信_私信消息基本功能数据库设计
本⽂通过数据库层⾯来解析私信消息基本功能的实现。
项⽬需求:私信功能,实现像对⽅发送私信消息后,在我的私信列表页⾯显⽰与发送或者接受消息的⼈列表,列表每条记录只显⽰与该对话的最新的⼀条消息。 点击列表中的任意⼀条,进⼊到消息对话详情页⾯,按照倒序显⽰该对话的详细内容。同时在这两个页⾯都可以进⾏删除对话,私信列表页⾯删除是与对⽅的所有会话,私信详情页⾯删除的是某⼀条对话,⽽且单⽅删除对话记录,不影响对⽅查看。
软件环境: mysql
说了这么多,其实总结起来就那么⼏个重要的点,⼀是私信列表每条记录只显⽰最后⼀条记录,⼆是单⽅删除对话记录,不影响对⽅查看。先上数据表,然后在逐⼀解释下。CREATE TABLE `private_message` (
`id` bigint(20) NOT NULL auto_increment COMMENT '主键Id',
`user_id` bigint(20) NOT NULL COMMENT '发送者Id',
`friend_id` bigint(20) NOT NULL COMMENT '接受者Id',
`sender_id` bigint(20) NOT NULL COMMENT '发送者id',
`receiver_id` bigint(20) NOT NULL COMMENT '接受者Id',
`message_type` tinyint(4) NOT NULL COMMENT '消息类型,1:普通消息 2:系统消息',
`message_content` varchar(500) NOT NULL COMMENT '消息内容',
`send_time` datetime NOT NULL COMMENT '消息发送时间',
`status` tinyint(4) NOT NULL default '1' COMMENT '消息状态 1:未读 2:已读 3:删除', PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;123456789101112
建⽴private_message表,字段说明:id:主键,⾃增长
user_id: 发送者id,⾮真实发送者id
friend_id: 接受者id,⾮真实接受者id
sender_id:发送者id,真实的发送者id
receiver_id:接受者id,真实的接受者id
message_type:消息类型,1:普通消息 2:系统消息,区分消息列表,可以发送不同类型的消息内容
message_content:消息内容
send_time:消息发送时间
status:消息状态 1:未读 2:已读 3:删除,标记不同消息状态,可以实现统计未读消息数,逻辑删除⽤户恢复等
看到这⾥⼤家该郁闷了,怎么弄两个发送者id,接受者id呢?
这⾥因为考虑到单⽅删除记录,不影响对⽅查看的功能,所以这⾥⾯我们需要在发送私信时,插⼊两份⼀样content内容的数据,但是在user_id,friend_id上⾯做点⼿脚了,在两次插⼊数据时,第⼆次插⼊的数据跟第⼀次插⼊的数据的user_id和friend_id对调。也就是:INSERT INTO `private_message` VALUES ('1', '121', '127', '121', '127', '1', 'hello word', '2015-09-09 10:25:43', '2');INSERT INTO `private_message` VALUES ('2', '127', '121', '121', '127', '1', 'hello word', '2015-09-09 10:26:41', '1');INSERT INTO
`private_message` VALUES ('3', '127', '121', '127', '121', '1', '你是程序猿吗?', '2015-09-11 10:30:16', '2');INSERT INTO
`private_message` VALUES ('4', '121', '127', '127', '121', '1', '你是程序猿吗?', '2015-09-11 10:30:59', '2');1234
这么⼀来,就可以满⾜我们的需求了。第⼀条和第四条记录是给121⽤户看,第⼆条和第三条记录是给127看的,121删除的时候删除第⼀条或者第四条记录,当然不会影响127看第⼆条和第三条记录啦
好了,现在可以搞定其他的功能需求了。
1、我的私信列表SELECT p.id, COUNT(p.id) AS
message_count,p.user_id,p.friend_id,p.sender_iver_id,p.send_ssage_content, u.`name` AS
receiver_name,u.img_url AS receiver_image FROM (SELECT * FROM private_message ORDER BY id DESC) p INNER JOIN user u on u.id=friend_id WHERE p.user_id=121 and p.`status` !=3 GROUP BY p.friend_id ORDER BY p.id DESC limit 0,101
2、我的私信列表详情SELECT p.ssage_content,p.sender_iver_id,p.send_time,u.`name` AS
sender_name,u.img_url AS sender_image,uu.`name` AS receiver_name FROM private_message p INNER JOIN user u on
u.id=p.sender_id INNER JOIN user uu on uu.id=p.friend_id WHERE p.user_id=121 and p.friend_id=127 and p.`status` !=3 ORDER BY p.id DESC limit 0,101
3、我的私信列表页⾯删除整个会话UPDATE private_message SETstatus=3 WHERE user_id=121 AND friend_id=1271php修改数据库内容
4、我的私信列表详情删除单个对话UPDATE private_message SET status=3 WHERE id=11
5、获取⽤户未读消息数量SELECT COUNT(*) FROM private_message WHERE user_id=121 AND receiver_id=127 AND
status=11
当然,还可以更新未读消息为已读,将已删除的⽤户从回收站中恢复过来,发送系统消息等等都可以
实现的啦。这是,肯定有同学会说了,这个表设计的数据冗余,每条记录插⼊两遍,content内容多的话或者发送系统消息时,表数据太⼤,当然这个只是针对⼩型的私信功能,肯定跟⼤型专注于社交类⽹站不⼀样了,但是我们也可以将content内容拆分出去,新建⼀个content表,这⾥关联下id就可以减少数据冗余了。还有就是这个设计不涉及到⾼并发访问啦!涉及到⾼并发这个那就得更复杂的设计和⽅法途径解决啦!
相关阅读:
以上就是本⽂的全部内容,如果有疑问,欢迎在评论区留⾔!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。