本文透過資料庫層面來解析私訊訊息基本功能的實作。
專案需求:私訊功能,實現像對方發送私訊訊息後,在我的私訊列表頁面顯示與發送或接受訊息的人列表,清單每筆記錄只顯示與該對話的最新的訊息。 點選清單中的任一條,進入至訊息對話詳情頁面,依照倒序顯示該對話的詳細內容。同時在這兩個頁面都可以進行刪除對話,私訊列表頁面刪除是與對方的所有會話,私訊詳情頁面刪除的是某一條對話,而且單方刪除對話記錄,不影響對方查看。
軟體環境: 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中文網其他相關文章!