随便想到,群聊天的数据库简单设计

简介: 本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/52926687 未经博主允许不得转载。 博主地址是:http://blog.csdn.net/freewebsys1,聊天消息设计突然想了想,如果一个群聊天数据库到底应该咋设计。 从最简单的思路慢慢开始。简单到大家都能明白。2

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/52926687 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

1,聊天消息设计


突然想了想,如果一个群聊天数据库到底应该咋设计。
从最简单的思路慢慢开始。简单到大家都能明白。

2,就一个表


最简单的方式,先完成功能。开发比较着急嘛,一个表数据存放方便。
数据库表结构如下。

 CREATE TABLE `msg` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `gid` bigint(20) DEFAULT NULL,
  `from_uid` bigint(20) DEFAULT NULL,
  `to_uid` bigint(20) DEFAULT NULL,
  `content` text DEFAULT NULL,
  `is_read` tinyint(1) DEFAULT '0',
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
AI 代码解读

一个群的聊天记录,一个消息发给多个人,每个人都收到一个相同的消息。
一般是不会这样设计的吧。这个数据 比较冗余啊。而且一个群下面人越多。
消息的重复数量越多。m*n条数据冗余啊

3,简化下


拆分成消息内容和流水表。

 CREATE TABLE `msg` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `content` text DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 CREATE TABLE `msg_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `gid` bigint(20) DEFAULT NULL,
  `msg_id` bigint(20) DEFAULT NULL,
  `from_uid` bigint(20) DEFAULT NULL,
  `to_uid` bigint(20) DEFAULT NULL,
  `is_read` tinyint(1) DEFAULT '0',
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
AI 代码解读

这样会好一点,将消息内容存储成一个表,然后每个人都只有一个流水表。
但是这样也有一个问题,只是节省了内容字段。没有节省流水。
还是 m*n 条消息记录呢

4,增加配置表


拆分成两个表,一个是消息的流水表,一个是每个人的配置表。
记录每个群下面的这个用户的最后读取的消息last_msg_id,然后在计算消息未读数据。
这样优化之后数据将减少好多,数量是 m+n条数据。不在是成倍增长了。

 CREATE TABLE `msg` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `gid` bigint(20) DEFAULT NULL,
  `content` text DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 CREATE TABLE `msg_config` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `gid` bigint(20) DEFAULT NULL,
  `last_msg_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
AI 代码解读

但是这个是个局限只限于群聊天,因为这个只是知道你这个群的未读消息数量。
所以直接进行connt查询就行。

4,总结


总结,一个群消息的数据设计简单的进行了几次演化。
最后的方案比较好,只有通过配置读取最新的msg_id,然后再计算出用户未读数量。
基本上一个消息都是顺序读取的,一个流水,可以认为用户也是顺着读的。
这样就可以把消息的未读数据用last_msg_id 进行计算。
感觉上qq上面的群消息应该也是这样设计的吧。这样设计才最节省资源。

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/52926687 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

目录
打赏
0
0
0
0
9
分享
相关文章
【计算机三级数据库技术】第8章 数据库后台编程技术--附思维导图
本文介绍了数据库后台编程的关键技术,包括存储过程、用户定义函数、触发器和游标,并附有思维导图。
75 1
“惊呆了!无需改动Nacos源码,轻松实现SGJDBC连接MySQL?这操作太秀了,速来围观,错过等哭!”
【8月更文挑战第7天】在使用Nacos进行服务治理时,常需连接MySQL存储数据。使用特定的SGJDBC驱动连接MySQL时,一般无需修改Nacos源码。需确保SGJDBC已添加至类路径,并在Nacos配置文件中指定使用SGJDBC的JDBC URL。示例中展示如何配置Nacos使用MySQL及SGJDBC,并在应用中通过Nacos API获取配置信息建立数据库连接,实现灵活集成不同JDBC驱动的目标。
203 0
【C 言专栏】C 语言与数据库的连接与操作
【5月更文挑战第2天】本文探讨了C语言如何连接和操作数据库,介绍了数据库连接的基本原理,如通过ODBC、JDBC或原生接口与数据库交互。文章详细阐述了使用ODBC连接的步骤,并列举了C语言在数据库操作中的常见任务,强调了错误处理、数据类型匹配和性能优化的重要性。通过实际案例,展示了在学生信息管理系统中应用C语言与数据库交互的过程。本文旨在帮助读者更好地理解和应用C语言进行数据库管理。
276 2
阅读小程序|基于微信阅读网站小程序的系统设计与实现(源码+数据库+文档)
阅读小程序|基于微信阅读网站小程序的系统设计与实现(源码+数据库+文档)
165 0
音乐小程序|基于微信开发音乐小程序的系统设计与实现(源码+数据库+文档)
音乐小程序|基于微信开发音乐小程序的系统设计与实现(源码+数据库+文档)
177 0
|
11月前
|
编程日记02:个人站优化数据库和日志
编程日记02:个人站优化数据库和日志
71 0
向量数据库小白必关注的“扫盲贴”来啦
自从ChatGPT问世以来,大语言模型受到广泛关注。但大模型更新频率低且不擅长垂直领域知识,向量数据库恰好可以与之互补,通过Retrieval Plugin为大模型和企业私有数据构建了一座桥梁,成为数据面向大模型的切入口。不过,你真的了解向量吗?什么又是向量数据库呢?向量检索的原理又是什么呢?向量爱好者们速速上车,跟着小编一起开启“向量探索之旅”吧!
4056 4
向量数据库小白必关注的“扫盲贴”来啦
前端知识笔记(四十六)———什么是小程序,什么是数据库
前端知识笔记(四十六)———什么是小程序,什么是数据库
83 0
认识和体验数据库技术练习题
进行认识和体验数据库技术的相关练习。
68 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等