Maison > Article > développement back-end > Conception de base de données de fonctions de base de messages privés
Cet article analyse la mise en œuvre des fonctions de base des messages privés à travers le niveau de la base de données.
Exigences du projet : Fonction de message privé, après avoir envoyé un message privé à l'autre partie, la liste des personnes qui ont envoyé ou reçu le message sera affichée sur ma page de liste de messages privés. Chaque enregistrement de la liste sera uniquement affiché. afficher le dernier message de la conversation. Cliquez sur n'importe quel élément de la liste pour accéder à la page des détails de la conversation par message, où les détails de la conversation sont affichés dans l'ordre inverse. En même temps, vous pouvez supprimer des conversations sur ces deux pages. La page de liste de messages privés supprime toutes les conversations avec l'autre partie et la page de détails des messages privés supprime une certaine conversation. Les enregistrements de conversation sont supprimés unilatéralement sans affecter la visualisation par l'autre partie. .
Environnement logiciel : mysql
Cela dit, en fait, il n'y a que quelques points importants en résumé. Premièrement, chaque enregistrement de la liste de messages privés n'affiche que le dernier enregistrement, et. deuxièmement, suppression unilatérale de l'enregistrement de la conversation sans affecter le visionnage de l'autre partie. Accédez d’abord au tableau de données, puis expliquez-le un par un.
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
Créez une table private_message, description du champ :
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:删除,标记不同消息状态,可以实现统计未读消息数,逻辑删除用户恢复等
Tout le monde devrait être déprimé après avoir vu cela. Comment obtenir deux identifiants d'expéditeur et de destinataire ?
Ici, nous considérons que la suppression unilatérale des enregistrements n'affectera pas la fonction de visualisation de l'autre partie, nous devons donc ici insérer deux données avec le même contenu lors de l'envoi d'un message privé, mais nous devons faire quelques astuces sur user_id etfriend_id. lorsque les données sont insérées deux fois, les user_id etfriend_id des deuxièmes données insérées sont échangés avec les premières données insérées. C'est-à-dire :
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
De cette façon, nos besoins peuvent être satisfaits. Les premier et quatrième enregistrements sont destinés aux utilisateurs 121, et les deuxième et troisième enregistrements sont destinés à 127. Lorsque 121 supprime le premier ou le quatrième enregistrement, cela n'affectera certainement pas la visualisation par 127 du deuxième enregistrement. ! ! !
D'accord, vous pouvez désormais vous occuper d'autres exigences fonctionnelles.
1. Ma liste de messages privés
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. Détails de ma liste de messages privés
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. Supprimer l'intégralité de la conversation sur ma page de liste de messages privés
UPDATE private_message SETstatus=3 WHERE user_id=121 AND friend_id=1271
4. Supprimer une seule conversation des détails de ma liste de messages privés
UPDATE private_message SET status=3 WHERE id=11
5. Obtenez le nombre de messages non lus de l'utilisateur
SELECT COUNT(*) FROM private_message WHERE user_id=121 AND receiver_id=127 AND status=11
Bien sûr, vous. peut également mettre à jour les messages non lus comme lus, vous pouvez récupérer les utilisateurs supprimés de la corbeille, envoyer des messages système, etc. C'est, je suis sûr que certains étudiants diront, que les données de ce tableau sont redondantes. Chaque enregistrement est inséré deux fois s'il y a beaucoup de contenu ou lors de l'envoi de messages système, les données du tableau sont trop volumineuses. uniquement pour les petites fonctions de messages privés. C'est certainement différent des sites Web de réseaux sociaux à grande échelle, mais nous pouvons également diviser le contenu et créer une nouvelle table de contenu. Ici, l'ID peut être associé pour réduire la redondance des données. De plus, cette conception n’implique pas d’accès simultané élevé ! Lorsqu’il s’agit de haute concurrence, cela nécessite des conceptions et des méthodes plus complexes pour le résoudre !
Lecture connexe :
code source de la fonction de chat en tête-à-tête php chat
Comment rendre l'utilisation des index de bases de données plus efficace ?
Étapes générales et exemples de conception d'une base de données
Ce qui précède représente l'intégralité du contenu de cet article si vous. Si vous avez des questions, n'hésitez pas à nous contacter. Laissez un message dans la zone commentaire !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!