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

本文的原文连接是: 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;

一个群的聊天记录,一个消息发给多个人,每个人都收到一个相同的消息。
一般是不会这样设计的吧。这个数据 比较冗余啊。而且一个群下面人越多。
消息的重复数量越多。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上面的群消息应该也是这样设计的吧。这样设计才最节省资源。

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

时间: 2024-10-25 20:39:03

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

分享网站群发站内信数据库表设计_MsSql

"站内信"不同于电子邮件,电子邮件通过专门的邮件服务器发送.保存.而"站内信"是系统内的消息,说白了,"站内信"的实现,就是通过数据库插入记录来实现的. "站内信"有两个基本功能.一:点到点的消息传送.用户给用户发送站内信:管理员给用户发送站内信.二:点到面的消息传送.管理员给用户(指定满足某一条件的用户群)群发消息.点到点的消息传送很容易实现,本文不再详述.下面将根据不同的情况,来说说"站内信"的群发是如

分享网站群发站内信数据库表设计

"站内信"不同于电子邮件,电子邮件通过专门的邮件服务器发送.保存.而"站内信"是系统内的消息,说白了,"站内信"的实现,就是通过数据库插入记录来实现的. "站内信"有两个基本功能.一:点到点的消息传送.用户给用户发送站内信:管理员给用户发送站内信.二:点到面的消息传送.管理员给用户(指定满足某一条件的用户群)群发消息.点到点的消息传送很容易实现,本文不再详述.下面将根据不同的情况,来说说"站内信"的群发是如

数据库课程设计具体要怎么做

问题描述 数据库课程设计具体要怎么做 数据库课程设计具体要怎么做,准确地说是用SQLserver写语句建表等等时要怎么做 解决方案 数据库课程设计数据库课程设计数据库课程设计 解决方案二: 找一本sql语句的教材,先了解sql语句的用法,然后多动手写一些. 解决方案三: http://www.w3school.com.cn/sql/index.asp 各种基础学习 解决方案四: 百度,搜SQLserver简单建表语句

系统-数据库课程设计 在线等

问题描述 数据库课程设计 在线等 一.设计内容与设计要求1.设计内容:针对具体的问题,完成从系统的需求分析.数据库的概念设计.数据库的逻辑设计,到数据库实现等设计过程,最终实现一个较为完整的反映应用需求的数据库系统.下面是各个设计阶段的具体内容.⒈ 系统需求分析画出系统的数据流图,写出较为详细的数据字典.⒉ 数据库的概念设计画出局部E-R图和全局E-R图.⒊ 数据库的逻辑设计将概念设计阶段产生的全局概念模式(E-R图)转换成初始的关系模式.对关系模式进行规范化处理.根据设计所要求的规范级别,逐一

数据库范式设计

在软件开发过程中,数据库的设计是非常重要的.可以说,良好的数据库设计,是对用户需求的理解的精准定位.它不仅能够使得软件开发起来非常便捷,而且还能够使软件系统高效运行,同时,为日后的维护或者更换数据库提供便利. 在最近开发系统的过程中,感觉收获最大的也是关于数据库的操作.最初开发机房收费系统的时候,由于没有经验,而且懂得的知识也非常少,数据库的设计根本谈不上,就是感觉到数据库中缺少某些字段的时候,直接在数据库表中去修改字段.这样就为自己徒增了很多工作量,相关的代码需要一处一处去修改. 开发.NET

sql-抽奖系统数据库怎样设计

问题描述 抽奖系统数据库怎样设计 RT,我想做一个抽奖的B/S,我是这样想的:用户提交信息后存入数据库,抽奖的时候再从数据库中读取,通过一些算法抽出来,但是,怎样避免重复中奖,SQL语句怎样写,新手,请指教啊! 解决方案 没做过抽奖的应用,我来说说我的想法! 1:需要搞清楚抽奖的时间范围? I 是很多用户在短时间(如:1000用户在一分钟)来抽奖,还是长时间(如:1000用户在一小时)来抽奖,如果是短时间,需要控制好并发! 2:抽奖前需要设置好所有奖项,比如:一等奖,二等奖各多少名!还需要设置好

数据库怎样设计可以同时比较好的支持微信支付和支付宝支付

问题描述 数据库怎样设计可以同时比较好的支持微信支付和支付宝支付 系统同时用到了微信支付和支付宝支付,两种支付方式的数据上有点区别,怎么样设计数据库可以比较简单明了的支持两种支付 解决方案 两种支付方式的数据,区别在哪里?

数据库怎么设计一个房间包含多个用户,一个用户又可以归属多个房间

问题描述 数据库怎么设计一个房间包含多个用户,一个用户又可以归属多个房间 对数据库也不是很懂,请教!!! 数据库怎么设计一个房间包含多个用户,一个用户又可以归属多个房间 解决方案 这就是多对多关系嘛.两个表各自有一个主键,有一个外键.然后关联起来. 再不会,随便找一个数据库,比如northwind,里面就有,看一下. 解决方案二: 楼上说的很对,多对多关系 解决方案三: 建三张表,房间表,用户表,中间表.建他们的主键放在中间表关联起来.

数据库的设计方法、规范与技巧_数据库其它

一.数据库设计过程 数据库技术是信息资源管理最有效的手段.数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求. 数据库设计中需求分析阶段综合各个用户的应用需求(现实世界的需求),在概念设计阶段形成独立于机器特点.独立于各个DBMS产品的概念模式(信息世界模型),用E-R图来描述.在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型,形成数据库逻辑模式.然后根据用户处理的要求,安全性的考虑,在基本表的基础上