Heim  >  Artikel  >  Backend-Entwicklung  >  Grundlegendes Funktionsdatenbankdesign für private Nachrichtennachrichten

Grundlegendes Funktionsdatenbankdesign für private Nachrichtennachrichten

*文
*文Original
2017-12-21 13:33:433762Durchsuche

In diesem Artikel wird die Implementierung der Grundfunktionen privater Nachrichten auf Datenbankebene analysiert.

Projektanforderungen: Private Nachrichtenfunktion. Nach dem Senden einer privaten Nachricht an die andere Partei wird die Liste der Personen, die die Nachricht gesendet oder empfangen haben, auf meiner Seite mit der privaten Nachrichtenliste angezeigt Zeigt die neueste Nachricht der Konversation an. Klicken Sie auf ein beliebiges Element in der Liste, um die Detailseite der Nachrichtenkonversation aufzurufen, auf der die Details der Konversation in umgekehrter Reihenfolge angezeigt werden. Gleichzeitig können Sie Konversationen auf diesen beiden Seiten löschen. Die Seite mit der privaten Nachrichtenliste löscht alle Konversationen mit der anderen Partei und die Seite mit den privaten Nachrichtendetails löscht eine bestimmte Konversation. Die Konversationsaufzeichnungen werden einseitig gelöscht, ohne dass dies Auswirkungen auf die Anzeige der anderen Partei hat .

Softwareumgebung: MySQL

Nachdem ich so viel gesagt habe, gibt es in der Tat nur ein paar wichtige Punkte: Erstens zeigt jeder Datensatz in der privaten Nachrichtenliste nur den letzten Datensatz an Zweitens, einseitiges Löschen des Gesprächsprotokolls, ohne die Sichtbarkeit der anderen Partei zu beeinträchtigen. Gehen Sie zuerst zur Datentabelle und erklären Sie sie dann einzeln.

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

Erstellen Sie eine private_Nachrichtentabelle, Feldbeschreibung:

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:删除,标记不同消息状态,可以实现统计未读消息数,逻辑删除用户恢复等

Jeder sollte deprimiert sein, nachdem er das gesehen hat. Wie bekomme ich zwei Absender-IDs und Empfänger-IDs?

Hier gehen wir davon aus, dass das einseitige Löschen von Datensätzen die Anzeigefunktion der anderen Partei nicht beeinträchtigt. Daher müssen wir hier beim Senden einer privaten Nachricht zwei Daten mit demselben Inhalt einfügen, müssen jedoch einige Tricks anwenden Bei Benutzer-ID und Freund-ID werden beim zweimaligen Einfügen von Daten die Benutzer-ID und die Freund-ID der zweiten eingefügten Daten mit den ersten eingefügten Daten vertauscht. Das heißt:

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

Auf diese Weise können unsere Bedürfnisse befriedigt werden. Der erste und vierte Datensatz sind für 121-Benutzer sichtbar, und der zweite und dritte Datensatz sind für 127-Benutzer sichtbar. Wenn 121 den ersten oder vierten Datensatz löscht, hat dies sicherlich keine Auswirkungen auf die Anzeige des zweiten Datensatzes durch 127 ! ! !

Okay, jetzt können Sie sich um andere funktionale Anforderungen kümmern.
1. Meine private Nachrichtenliste

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. Meine privaten Nachrichtenlistenseite

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 🎜>

4. Löschen Sie eine einzelne Konversation aus den Details meiner privaten Nachrichtenliste
UPDATE private_message SETstatus=3 WHERE user_id=121 AND friend_id=1271

5. Erhalten Sie die Anzahl der ungelesenen Nachrichten des Benutzers
UPDATE private_message SET status=3 WHERE id=11

Natürlich Sie Sie können auch ungelesene Nachrichten als gelesen aktualisieren, gelöschte Benutzer aus dem Papierkorb wiederherstellen, Systemnachrichten senden usw. Dies liegt, wie einige Schüler definitiv sagen werden, an der Datenredundanz in diesem Tabellendesign. Jeder Datensatz wird zweimal eingefügt. Wenn viel Inhalt vorhanden ist oder Systemnachrichten gesendet werden, sind die Tabellendaten natürlich nur für Kleine private Nachrichtenfunktionen unterscheiden sich definitiv von großen Social-Networking-Websites, aber wir können den Inhalt auch aufteilen und eine neue Inhaltstabelle erstellen. Hier kann die ID zugeordnet werden, um die Datenredundanz zu reduzieren. Außerdem erfordert dieses Design keinen hohen gleichzeitigen Zugriff! Wenn es um hohe Parallelität geht, sind komplexere Designs und Methoden zur Lösung erforderlich!
SELECT COUNT(*) FROM private_message WHERE user_id=121 AND receiver_id=127 AND status=11


Verwandte Lektüre:

PHP-Chat-Eins-zu-Eins-Chat-Funktionsquellcode

Wie lässt sich der Einsatz von Datenbankindizes effizienter gestalten?

Allgemeine Schritte und Beispiele zum Entwerfen einer DatenbankDas Obige ist der gesamte Inhalt dieses Artikels Wenn Sie Fragen haben, können Sie uns gerne kontaktieren. Hinterlassen Sie eine Nachricht im Kommentarbereich!

Das obige ist der detaillierte Inhalt vonGrundlegendes Funktionsdatenbankdesign für private Nachrichtennachrichten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn