이 글에서는 개인 메시지 메시지의 기본 기능 구현을 데이터베이스 수준을 통해 분석합니다.
프로젝트 요구 사항: 비공개 메시지 기능, 상대방에게 비공개 메시지를 보낸 후 메시지를 보내거나 받은 사람의 목록이 내 비공개 메시지 목록 페이지에 표시됩니다. 목록의 각 기록에는 최신 메시지만 표시됩니다. 대화의. 목록의 항목을 클릭하면 메시지 대화 세부정보 페이지로 들어가며, 대화 내용이 역순으로 표시됩니다. 동시에 이 두 페이지에서 대화를 삭제할 수 있습니다. 비공개 메시지 목록 페이지에서는 상대방과의 모든 대화가 삭제되고, 비공개 메시지 상세 페이지에서는 특정 대화가 삭제되며, 대화 기록은 상대방의 시청에 영향을 주지 않고 일방적으로 삭제됩니다. .
소프트웨어 환경: 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를 얻는 방법은 무엇입니까?
여기서는 일방적인 기록 삭제가 상대방의 보기 기능에 영향을 미치지 않는다는 점을 고려하여 비공개 메시지를 보낼 때 동일한 내용의 두 데이터를 삽입해야 하지만 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이 첫 번째나 네 번째 기록을 삭제해도 첫 번째와 세 번째 기록을 보는 데에는 확실히 영향이 없습니다. ! ! !
좋아, 이제 다른 기능적 요구 사항을 처리할 수 있습니다.
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
물론 읽지 않은 메시지를 읽음으로 업데이트하고, 삭제된 사용자를 휴지통에서 복원하고, 시스템 메시지를 보내는 등의 작업도 할 수 있습니다. 이것은, 어떤 학생들은 이 테이블의 데이터가 중복된다고 말할 것이라고 확신합니다. 각 레코드가 두 번 삽입됩니다. 내용이 많거나 시스템 메시지를 보낼 때 테이블 데이터가 너무 큽니다. 소규모 개인 메시지 기능에만 해당됩니다. 확실히 대규모 소셜 네트워킹 웹사이트와는 다르지만, 콘텐츠를 분할하고 새로운 콘텐츠 테이블을 생성할 수도 있습니다. 여기서 ID를 연결하여 데이터 중복을 줄일 수 있습니다. 또한 이 디자인은 높은 동시 액세스를 포함하지 않습니다! 높은 동시성 문제를 해결하려면 더 복잡한 설계와 방법이 필요합니다!
관련 읽기:
데이터베이스 인덱스를 더 효율적으로 사용하는 방법은 무엇입니까?
위 내용은 이 기사의 전체 내용입니다. 질문이 있는 경우 댓글 영역에 메시지를 남겨주세요!
위 내용은 개인 메시지 메시지의 기본 기능 데이터베이스 설계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!