- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
自从《 开源即时通讯GGTalk 8.0发布,增加Linux客户端,支持在统信UOS、银河麒麟上运行! 》一文在博客园发布后,有园友联系我QQ,说能不能整理个更系统更详细地介绍GGTalk源码的文章,现在博客中的介绍比较零散,对于初级程序员而言,面对GGTalk大量的源码,有点不知所措。想想也是如此,于是,我打算写一个系列的文章来完整地介绍GGTalk的方方面面,专题的名字就叫做《 GGTalk源码剖析 》吧.
这个《GGTalk源码剖析》系列的文章将基于最新的 GGTalk V8.0 进行。 GGTalk V8.0 服务端支持Windows、Linux,客户端支持 Windows、Android、iOS、Linux、以及银河麒麟、统信UOS等国产操作系统。 数据库支持SqlServer、MySql、以及达梦数据库、人大金仓、南大通用等国产数据库。本篇文章以 MySQL 数据库为例来对GGTalk的数据库设计进行详细的介绍。 还没有GGTalk源码的朋友,可以到 GGTalk源码下载中心 下载.
最新版本的 GGTalk 数据库一共涉及到九张表,分别为:
下面将分别对每一张表的字段进行说明.
所有注册用户都保存在该表中.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
UserID | varchar(50) |
用户ID,主键 |
PasswordMD5 | varchar(100) |
经过加密处理的用户密码 |
Phone | varchar(20) |
用户手机号码 |
Name | varchar(50) |
用户昵称 |
Friends | varchar(4000) |
用户好友列表,以 , 分隔 |
CommentNames | varchar(4000) |
用户好友备注列表,以 ; 分隔 |
Signature | varchar(100) |
用户个性签名 |
HeadImageIndex | int |
系统默认头像的索引 |
HeadImageData | mediumblob |
用户上传头像的二进制数据 |
Groups | varchar(1000) |
用户所在的群组列表,以 , 分隔 |
UserState | int |
用户状态:0正常,1冻结,2禁言,3停用 |
MobileOfflineTime | datetime |
移动端离线的时间节点 |
PcOfflineTime | datetime |
PC端离线的时间节点 |
CreateTime | datetime |
用户注册的时间节点 |
Version | int |
用户版本 |
补充说明:
UserId
同时也是 用户账号 和 用户名 。 Friends 字段
中包含分组信息,每个分组之间以 ;
进行分割。例如: 朋友:friend1,friend2;同学:schoolmate1,schoolmate2;
CommentNames 字段
存储用户好友备注列表数据,以 用户ID
+ :
+ 备注
为一个好友的备注信息,多个备注信息之间以 ;
分割。例如: 10000:张三;10001:李四
。 HeadImageIndex 字段
存储系统默认头像索引数据,当用户上传头像后, HeadImageData 字段
会被赋值,且 HeadImageIndex 字段
值被设置为 -1
。 Version 字段
保存用户的版本,初始值为 0
,每当用户的信息更新,本字段值+1。 所有创建的群都保存在该表中.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
GroupID | varchar(20) |
群组ID,主键 |
Name | varchar(20) |
群组名称 |
CreatorID | varchar(20) |
群组创建者的用户ID |
Announce | varchar(200) |
群公告 |
Members | varchar(4000) |
群组成员的用户ID列表,以 , 分隔 |
IsPrivate | tinyint |
是否允许群组成员之间私聊:0不允许,1允许 |
CreateTime | datetime |
创建群组的时间节点 |
Version | int |
群组版本 |
补充说明:
Version 字段
保存群组在版本,初始值为 0
,每当群组在信息更新,本字段值+1。 Members 字段
存储群组成员的用户ID列表数据,注意这个字段和 GGUser表 中的 Groups 字段
间存在联动关系。例如:当一个用户退出一个群时,这个用户的 Groups
中会少一个群组ID,同时这个群组的 Members
中会少一个用户ID。 此表用于存储离线消息数据.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
AutoID | int |
自增ID,主键 |
SourceUserID | varchar(50) |
发送离线消息的用户ID |
DestUserID | varchar(50) |
接收离线消息的用户ID |
SourceType | int |
发送者的设备类型:1DotNET,2Android,4IOS,9Linux |
GroupID | varchar(50) |
该字段用于群离线消息 |
InformationType | int |
信息的类型 |
Information | longblob |
信息内容 |
Tag | varchar(100) |
附带信息 |
TimeTransfer | datetime |
服务器接收到要转发离线消息的时间 |
补充说明:
TimeTransfer 字段
存储离线文件的路径,默认在 服务端程序根目录\bin\Debug\OfflineFiles\接受者的用户ID作为文件名
目录下。 当目标用户不在线时,发送给他的文件对应的记录存在该表中.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
AutoID | int |
自增ID,主键 |
FileName | varchar(100) |
文件名 |
FileLength | int |
文件长度 |
SenderID | varchar(50) |
发送者的用户ID |
SenderType | int |
发送者的设备类型:1DotNET,2Android,4IOS,9Linux |
AccepterType | int |
接受者的设备类型:1DotNET,2Android,4IOS,9Linux |
AccepterID | varchar(50) |
接收者的用户ID |
RelayFilePath | varchar(300) |
转发文件的路径 |
补充说明: 离线文件默认存在服务端的运行目录下的OfflineFiles文件夹下,RelayFilePath 指明了具体的相对路径。 当离线用户上线时,服务器会把这个文件转发给该用户,同时这个文件会从表中删除.
当群中的用户被禁言时,对应的记录将存在该表中.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
AutoID | int |
自增ID,主键 |
GroupID | varchar(20) |
群组ID |
OperatorID | varchar(20) |
禁言者的用户ID |
UserID | varchar(20) |
被禁言者的用户ID |
Comment2 | varchar(50) |
本次禁言的备注 |
EnableTime | datetime |
本次禁言的截至时间 |
CreateTime | datetime |
本次禁言的开始时间 |
此表用于存储聊天消息数据.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
AutoID | bigint |
自增ID,主键 |
SpeakerID | varchar(20) |
发言者的用户ID |
AudienceID | varchar(20) |
倾听者的用户ID或群组ID |
IsGroupChat | bit(1) |
是否是群组聊天:0不是,1是 |
Content | longblob |
聊天内容 |
OccureTime | datetime |
消息发送的时间节点 |
补充说明: 该表除了主键之外,还建有两个联合索引: KEY IX_ChatMessageRecord ( SpeakerID , AudienceID , OccureTime ) USING BTREE KEY IX_ChatMessageRecord_1 ( AudienceID , OccureTime ) USING BTREE 这两个联合索引,与客户端两种查询聊天记录的方式一一对应。 如此,服务端可以快速地从数据库中加载满足条件的聊天记录返回给客户端.
所有添加好友的请求消息都存在该表中.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
AutoID | int |
自增ID,主键 |
RequesterID | varchar(50) |
申请者的用户ID |
AccepterID | varchar(50) |
接收者的用户ID |
RequesterCatalogName | varchar(20) |
申请者的分组名称 |
AccepterCatalogName | varchar(20) |
接受者的分组名称 |
Comment2 | varchar(500) |
申请时的备注信息 |
State | int |
本次申请的状态:0请求中,1同意,2拒绝 |
Notified | bit(1) |
申请是否通知对方:0不通知,1通知 |
CreateTime | datetime |
申请添加好友的时间节点 |
所有申请入群的请求消息都存在该表中.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
AutoID | int |
自增ID,主键 |
RequesterID | varchar(20) |
申请者的用户ID |
GroupID | varchar(20) |
群组ID |
AccepterID | varchar(20) |
接收者的用户ID |
Comment2 | varchar(500) |
申请时的备注信息 |
State | int |
本次申请的状态:0请求中,1同意,2拒绝 |
Notified | bit(1) |
申请是否通知对方:0不通知,1通知 |
CreateTime | datetime |
申请加入群组的时间节点 |
用于预留存储与GGTalk相关的配置信息.
字段名称 | 字段类型 | 字段说明 |
---|---|---|
GGKey | varchar(20) |
配置的键名 |
GGValue | varchar(1000) |
配置的键值 |
GGTalk 的数据库只有9张表,而且都比较简单。 每个表都有唯一的主键。 就实际使用来看, ChatMessageRecord 聊天记录表的数据量将是最大的,所以,ChatMessageRecord 表必须建联合索引,以支持快速查询。 在我们接到的定制项目中,对于那些同时在线用户量较大的(比如同时在线大于1万人)使用场景,ChatMessageRecord 我们会采取按月分表的策略来应对,在这种情况下,GGTalk 的服务端代码需要做相应的调整。有机会用到这种策略的朋友,可以和我们交流更多关于该策略的实现方案。 作为《GGTalk源码剖析》的第一篇,差不多就这样了。在接下来的一篇我们将介绍GGTalk服务端全局缓存。 敬请期待:《GGTalk 开源即时通讯系统源码剖析之:服务端全局缓存》 。
最后此篇关于GGTalk开源即时通讯系统源码剖析之:数据库设计的文章就讲到这里了,如果你想了解更多关于GGTalk开源即时通讯系统源码剖析之:数据库设计的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
去年(2023年)年底我初学flutter,看了一些文档和教程,想找个东西*练练手。 小时候看过一个关于历史名人儿时事迹的短片,有一集是讲*总理的,有一个细节我记得很清楚:幼年***经常要做一个游戏
今天给大家分享一个我做的小工具,可以自定义扩展右键菜单的功能来提高工作效率,效果图如下: image 如上图,右键菜单多了几个我自定义的菜单
1、前言 大家好!我是付工。 我们在进行上位机开发时,从设备端获取到的数据之后,需要进行一定的数据处理及转换,才能生成我们需要用的数据。 这其中就涉及到了各种数据类型之间的相关转换,很多非科班
书接上回,今天继续和大家享一些关于枚举操作相关的常用扩展方法。 今天主要分享通过枚举值转换成枚举、枚举名称以及枚举描述相关实现。 我们首先修改一下上一篇定义用来测试的正常枚举,新增一个枚举项,
今天和大家享一些关于枚举操作相关的常用扩展方法。 我们平时用的比较多的是正常枚举,同时还有加[Flags]特性的位标志枚举,因此以下所有扩展方法同时适用正常枚举以及位标志枚举。 我们首先定义两
书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。 01、获取当前日期所在月的第一个指定星期几 该方法和前面介绍的获取当前日期所在周的第一天(周一)核心思想是一样的,只是把求周一改成
书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。 01、获取当天的开始时间 当天的开始时间指00:00:00时刻,因此只需要获取DateTime的Date属性只获取时间即可,具体代
书接上回,我们继续来分享一些关于时间转换的常用扩展方法。 01、时间转日期时间 TimeOnly 该方式是把TimeOnly类型转为DateTime类型,其中日期部分使用系统当前日期,时间部分
从事软件开发这么多年,平时也积累了一些方便自己快速开发的帮助类,一直在想着以什么方式分享出来,因此有了这个系列文章,后面我将以《开源-Ideal库》系列文章分享一些我认为比较成熟、比较方便、比较好的代
任何人都可以建议我应该使用什么程序/方法? 我需要有一个像谷歌地图这样的 map ,我可以在其中显示 map 、添加标记多边形等。 但是我不能依赖这样的在线服务,因为客户担心这样的服务会消失,我们的系
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 11年前关闭。 Improve this qu
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
您知道 EDA(电子设计自动化)领域有哪些开源项目正在寻找 C++ 程序员吗? 最佳答案 如果您经常关注 gEDA 的邮件列表,您也许能够加入 gEDA。详情:http://www.gpleda.or
如果现有Hadoop群集上有10个数据节点,则可以在4个或6个数据节点上安装NiFi吗? NiFi的主要目的是每天将数据从RDBMS加载到高容量的HDFS。 数据节点将配置为具有100 GB的高RAM
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
Closed. This question is off-topic。它当前不接受答案。
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
【Github源码】 《上一篇》 介绍了Xmtool工具库中的图形验证码类库,今天我们继续为大家介绍其中的扩展动态对象类库。 扩展动态对象是整个工具库中最重要的一个设计。
我是一名优秀的程序员,十分优秀!