この記事では、プライベート メッセージの基本機能の実装をデータベース レベルで分析します。
プロジェクト要件: プライベートメッセージ機能、相手にプライベートメッセージを送信した後、メッセージを送受信した人のリストが私のプライベートメッセージリストページに表示され、リスト内の各レコードには最新のメッセージのみが表示されます。会話の様子。 リスト内の任意の項目をクリックすると、メッセージ会話の詳細ページが表示され、会話の詳細が逆順に表示されます。同時に、この 2 つのページで会話を削除できます。プライベート メッセージの一覧ページでは相手とのすべての会話が削除され、プライベート メッセージの詳細ページでは、相手の閲覧に影響を与えることなく一方的に会話記録が削除されます。 。
ソフトウェア環境: mysql
ここまで述べましたが、実際に重要なポイントをいくつかまとめます。1 つはプライベート メッセージ リストの各レコードには最後のレコードのみが表示されるということ、もう 1 つは会話の記録が一方的に削除されるということです。相手の視聴には影響しません。まずデータテーブルに行き、それを一つずつ説明していきます。
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:删除,标记不同消息状态,可以实现统计未读消息数,逻辑删除用户恢复等
これを見た後は誰もが落ち込むはずです。2 つの送信者 ID と受信者 ID を取得するにはどうすればよいでしょうか。
ここでは一方的なレコードの削除は相手の閲覧機能に影響を及ぼさないと考えているので、プライベートメッセージ送信時に同じ内容のデータを2つ挿入する必要があるのですが、user_idとfriend_idに工夫が必要です、2 回 データを挿入すると、2 番目に挿入されたデータの user_id と friends_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
このようにして、私たちのニーズは満たされるのです。 1 番目と 4 番目のレコードは 121 のユーザーが表示し、2 番目と 3 番目のレコードは 127 が表示します。121 が 1 番目または 4 番目のレコードを削除しても、127 による 2 番目のレコードの表示には影響しません。 ! ! !
さて、これで他の機能要件に対処できるようになりました。
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. 私のプライベート メッセージ リストの詳細は、1 つの会話を削除します
UPDATE private_message SETstatus=3 WHERE user_id=121 AND friend_id=1271
5.ユーザーの取得 未読メッセージの数
UPDATE private_message SET status=3 WHERE id=11
もちろん、未読メッセージを既読として更新したり、削除されたユーザーをごみ箱から復元したり、システム メッセージを送信したりすることもできます。これは、このテーブルのデータが冗長であると言う学生もいると思いますが、コンテンツが多い場合、またはシステム メッセージを送信する場合、当然、これはテーブル データが大きすぎます。大規模なソーシャル ネットワーキング サイトとは異なりますが、コンテンツを分割して新しいコンテンツ テーブルを作成することもできます。これにより、データの重複を減らすことができます。また、この設計には高い同時アクセスが含まれていません。同時実行性が高くなると、それを解決するにはより複雑な設計と方法が必要になります。
データベース インデックスの使用をより効率的にするにはどうすればよいですか?
データベース設計の一般的な手順と例上記がこの記事の全内容です。ご質問がある場合は、コメント欄にメッセージを残してください。
以上が私信メッセージの基本機能データベース設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。