博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
随便想到,群聊天的数据库简单设计
阅读量:7204 次
发布时间:2019-06-29

本文共 2037 字,大约阅读时间需要 6 分钟。

本文的原文连接是: 未经博主允许不得转载。

博主地址是:

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;

一个群的聊天记录,一个消息发给多个人,每个人都收到一个相同的消息。

一般是不会这样设计的吧。这个数据 比较冗余啊。而且一个群下面人越多。
消息的重复数量越多。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;

这样会好一点,将消息内容存储成一个表,然后每个人都只有一个流水表。

但是这样也有一个问题,只是节省了内容字段。没有节省流水。
还是 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;

但是这个是个局限只限于群聊天,因为这个只是知道你这个群的未读消息数量。

所以直接进行connt查询就行。

4,总结


总结,一个群消息的数据设计简单的进行了几次演化。

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

本文的原文连接是: 未经博主允许不得转载。

博主地址是:

你可能感兴趣的文章
Java 8 中的 Streams API 详解
查看>>
一道看似简单的sql需求(转)
查看>>
Eclipse+Maven命令创建webapp项目<三>
查看>>
Fiddler 教程(转)
查看>>
[十二省联考2019] 异或粽子
查看>>
CF360B Levko and Array (二分查找+DP)
查看>>
RQNOJ659 计算系数
查看>>
HTML实体符号查询
查看>>
【转】 ASP.NET网站路径中~(波浪线)解释
查看>>
oracle根据Date字段查询区间数据(转)
查看>>
[C语言] 数据结构-算法效率的度量方法-事前分析估算方法
查看>>
js_实用
查看>>
基础权限管理
查看>>
navicat for mysql快捷键
查看>>
PHP中设置时区方法小结
查看>>
netty源码分析
查看>>
linux-2.6内核驱动学习——jz2440之输入子系统
查看>>
Sizeof与Strlen的区别与联系
查看>>
Hadoop- NameNode和Secondary NameNode元数据管理机制
查看>>
python中socket模块详解
查看>>