- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
有没有办法只允许 https 而不是 http 与 Neo4j 服务器通信?另外,Neo4j Shell 的通信使用哪个 channel ,http 还是 https? 最佳答案 这来自 Neo4j
您好,我有新问题 :) 我正在构建带有面板的简单时事通讯,以向注册用户和时事通讯邮件地址发送邮件。 我有此代码,但时事通讯仅发送给注册用户。谁能告诉我为什么? $zapytanie = mys
第一次发帖,所以可能会有比必要的更多的信息,但我想彻底: 我们的 C 练习之一是创建发送器和接收器程序,通过 RS232 串行通信与零调制解调器交换数据。我们使用了虚拟端口程序(如果你想测试的话,我使
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有一台通过 RS485 连接到另一台设备的单板计算机。计算机应向设备发送请求并接收响应(使用设备相关协议(protocol))。我可以毫无问题地发送消息并且设备接收它们(例如,我可以更改设备的参数)
我目前正在尝试在我的 Visual Basic 6 应用程序中引用 .NET COM 库。我已经使用 Regasm 注册了它,并且在我的类(class)中将 ComVisible 设置为 true。但
Closed. This question needs to be more focused 。它目前不接受答案。 想改善这个问题吗?更新问题,使其仅通过 editing this post 关注一个
我尝试通过 https 协议(protocol)在 Archiva 和 Jenkins 之间建立通信,但我收到以下错误: [WARNING] Could not transfer metadata .
我完成了一个运行良好的客户端/服务器套接字通信程序。现在我想弄清楚如何做到这一点,以便我可以同时拥有到服务器的多个客户端连接。我环顾四周,似乎有不止几种不同的方法可以做到这一点。所以我来这里是想向你们
我正在 mailchimp 中制作时事通讯,我在使用 outlook 时遇到了这个问题,它一直在干扰我的两个专栏,如图所示: 这是这部分的代码:
我正在创建一份时事通讯,经过大量努力,它在除 android 的 gmail 应用程序之外的任何地方都有效。问题是它似乎有最小字体大小,这会导致我的表格损坏。 有没有办法克服最小字体大小而不是媒体查询
C++ 作为Client端 view plaincopy to clipboardprint? 复制代码 代码如下: // Client.cpp : Defines the entry poi
我创建了 ECM NewsLetter,其中包含一些网站链接(另一个项目)。在在线版本的 NewsLetter 链接中工作正常,但是当我将此 NewsLetter 发送到我的电子邮件并尝试单击我的邮件
无论出于何种原因,我的文本大小调整在 iPhone 上无法正常工作,但在 Android 和其他电子邮件格式中工作正常。似乎看不出这两个文件之间有任何区别。图片也调整了大小,似乎只是文本的问题。
我正在开发一个网站,我需要将 HTML 新闻稿发送到邮件列表。 我构建了一个 html 框架,其中包含“在浏览器中查看”和“取消订阅”链接(原因会有所不同)。在管理模块中,我发布 html 并为 ht
我正在尝试在 B-L072Z-LRWAN(Master) 和 Arduino(Slave) 之间进行 I2C 通信。 我使用以下代码成功将数据从主站发送到从站: B-L072Z-LRWAN 代码: #
我有 ECM NewsLetter,其中包含指向站点(另一个项目)的一些链接。当我通过单击发送按钮将此时事通讯发送到我的电子邮件时 - 当我从电子邮件收件箱中单击它们时,链接不起作用。它显示 404
我是一名优秀的程序员,十分优秀!