头像

Thinkphp私信基本功能数据库设计

2017-09-20 14:35:40 来源:PHP代码   浏览()   评论 ( 0 )   

  写一篇关于私信功能的数据库设计文章,非代码篇,希望想对第一次做设计并开发私信功能的同学有点帮助。

  项目需求:私信功能,实现像对方发送私信消息后,在我的私信列表页面显示与发送或者接受消息的人列表,列表每条记录只显示与该对话的最新的一条消息。 点击列表中的任意一条,进入到消息对话详情页面,按照倒序显示该对话的详细内容。同时在这两个页面都可以进行删除对话,私信列表页面删除是与对方的所有会话,私信详情页面删除的是某一条对话,而且单方删除对话记录,不影响对方查看。

  软件环境: mysql

  说了这么多,其实总结起来就那么几个重要的点,一是私信列表每条记录只显示最后一条记录,二是单方删除对话记录,不影响对方查看。先上数据表,然后在逐一解释下。

  建立private_message表,字段说明:

  id:主键,自增长
  sender_id:发送者id,真实的发送者id
  receiver_id:接受者id,真实的接受者id
  message_type:消息类型,1:普通消息 2:系统消息,区分消息列表,可以发送不同类型的消息内容
  message_content:消息内容
  send_time:消息发送时间
  status:消息状态 1:未读 2:已读 3:删除,标记不同消息状态,可以实现统计未读消息数,逻辑删除用户恢复等

  好了,现在可以搞定其他的功能需求了。

  1、我的私信列表

  SELECT p.id, COUNT(p.id) AS 
message_count,p.user_id,p.friend_id,p.sender_id,p.receiver_id,p.send_time,p.message_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,10

  2、我的私信列表详情

  SELECT 
p.id,p.message_content,p.sender_id,p.receiver_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,10

  3、我的私信列表页面删除整个会话

  UPDATE private_message SETstatus=3 WHERE user_id=121 AND friend_id=1271

  4、我的私信列表详情删除单个对话

  UPDATE private_message SET status=3 WHERE id=1

  5、获取用户未读消息数量

  SELECT COUNT(*) FROM private_message WHERE user_id=121 AND receiver_id=127 
AND status=1

  当然,还可以更新未读消息为已读,将已删除的用户从回收站中恢复过来,发送系统消息等等都可以实现的啦。这是,肯定有同学会说了,这个表设计的数据冗余,每条记录插入两遍,content内容多的话或者发送系统消息时,表数据太大,当然这个只是针对小型的私信功能,肯定跟大型专注于社交类网站不一样了,但是我们也可以将content内容拆分出去,新建一个content表,这里关联下id就可以减少数据冗余了。还有就是这个设计不涉及到高并发访问啦!涉及到高并发这个那就得更复杂的设计和方法途径解决啦!


标签: mysql
声明:转载请注明来源(PHP代码)并保留原文链接:http://www.phpdaima.com//jishu-9.html
广告不存在
评论0

后面还有条评论,点击查看>>

温馨提示:为规范评论内容,垃圾评论一律封号...