首頁  >  文章  >  後端開發  >  私訊訊息基本功能資料庫設計

私訊訊息基本功能資料庫設計

*文
*文原創
2017-12-21 13:33:433811瀏覽

本文透過資料庫層面來解析私訊訊息基本功能的實作。

專案需求:私訊功能,實現像對方發送私訊訊息後,在我的私訊列表頁面顯示與發送或接受訊息的人列表,清單每筆記錄只顯示與該對話的最新的訊息。 點選清單中的任一條,進入至訊息對話詳情頁面,依照倒序顯示該對話的詳細內容。同時在這兩個頁面都可以進行刪除對話,私訊列表頁面刪除是與對方的所有會話,私訊詳情頁面刪除的是某一條對話,而且單方刪除對話記錄,不影響對方查看。

軟體環境: 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_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,101

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,101

3、我的私訊清單頁面刪除整個會話

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

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就可以減少資料冗餘了。還有就是這個設計不涉及到高並發訪問啦!涉及到高並發這個那就得更複雜的設計和方法途徑解決啦!


相關閱讀:

#php 聊天一對一聊天功能原始碼

#如何讓資料庫索引的使用效率更高?

設計資料庫的一般步驟及範例

以上就是本文的全部內容,如果有疑問,歡迎在評論區留言!

以上是私訊訊息基本功能資料庫設計的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn