開源信創(chuàng)國產(chǎn)即時通訊系統(tǒng)GGTalk源碼剖析之:數(shù)據(jù)庫設(shè)計
自從《開源即時通訊GGTalk 8.0發(fā)布,增加Linux客戶端,支持在統(tǒng)信UOS、銀河麒麟上運行!》一文在博客園發(fā)布后,有園友聯(lián)系我QQ,說能不能整理個更系統(tǒng)更詳細地介紹GGTalk源碼的文章,現(xiàn)在博客中的介紹比較零散,對于初級程序員而言,面對GGTalk大量的源碼,有點不知所措。想想也是如此,于是,我打算寫一個系列的文章來完整地介紹GGTalk的方方面面,專題的名字就叫做《GGTalk源碼剖析》吧。
一. 概述
這個《GGTalk源碼剖析》系列的文章將基于最新的 GGTalk V8.0 進行。
GGTalk V8.0 服務端支持Windows、Linux,客戶端支持 Windows、Android、iOS、Linux、以及銀河麒麟、統(tǒng)信UOS等國產(chǎn)操作系統(tǒng)。
數(shù)據(jù)庫支持SqlServer、MySql、以及達夢數(shù)據(jù)庫、人大金倉、南大通用等國產(chǎn)數(shù)據(jù)庫。本篇文章以 MySQL 數(shù)據(jù)庫為例來對GGTalk的數(shù)據(jù)庫設(shè)計進行詳細的介紹。
還沒有GGTalk源碼的朋友,可以點擊文章底部鏈接下載。
二. 數(shù)據(jù)表的設(shè)計
最新版本的?GGTalk?數(shù)據(jù)庫一共涉及到九張表,分別為:
GGUser:用戶表,所有注冊用戶都保存在該表中。
GGGroup:群組表,所有創(chuàng)建的群都保存在該表中。
OfflineMessage:離線消息表,當目標用戶不在線時,發(fā)送給他的消息存在該表中。
OfflineFileItem:離線文件表,當目標用戶不在線時,發(fā)送給他的文件對應的記錄存在該表中。
GroupBan:群禁言表,當群中的用戶被禁言時,對應的記錄將存在該表中。
ChatMessageRecord:聊天記錄表,一對一的聊天記錄、群聊天記錄都存在該表中。
AddFriendRequest:加好友請求表,所有添加好友的請求消息都存在該表中。
AddGroupRequest:入群請求表,所有申請入群的請求消息都存在該表中。
GGConfiguration:配置表,用于預留存儲與GGTalk相關(guān)的配置信息。
下面將分別對每一張表的字段進行說明。
1.GGUser(用戶表)
所有注冊用戶都保存在該表中。

補充說明:
UserId
同時也是?用戶賬號?和?用戶名?。Friends 字段
中包含分組信息,每個分組之間以;
進行分割。例如:朋友:friend1,friend2;同學:schoolmate1,schoolmate2;
CommentNames 字段
存儲用戶好友備注列表數(shù)據(jù),以用戶ID
?+?:
?+?備注
為一個好友的備注信息,多個備注信息之間以;
分割。例如:10000:張三;10001:李四
。HeadImageIndex 字段
存儲系統(tǒng)默認頭像索引數(shù)據(jù),當用戶上傳頭像后,HeadImageData 字段
會被賦值,且HeadImageIndex 字段
值被設(shè)置為-1
。Version 字段
保存用戶的版本,初始值為0
,每當用戶的信息更新,本字段值+1。
2. GGGroup(群組表)
所有創(chuàng)建的群都保存在該表中

補充說明:
Version 字段
保存群組在版本,初始值為0
,每當群組在信息更新,本字段值+1。Members 字段
存儲群組成員的用戶ID列表數(shù)據(jù),注意這個字段和?GGUser表?中的Groups 字段
間存在聯(lián)動關(guān)系。例如:當一個用戶退出一個群時,這個用戶的Groups
中會少一個群組ID,同時這個群組的Members
中會少一個用戶ID。
3. OfflineMessage(離線消息記錄表)
此表用于存儲離線消息數(shù)據(jù)。

補充說明:
當離線用戶上線時,服務器會把這條消息轉(zhuǎn)發(fā)給該用戶,同時這條消息會從表中刪除。
TimeTransfer 字段
存儲離線文件的路徑,默認在服務端程序根目錄\bin\Debug\OfflineFiles\接受者的用戶ID作為文件名
目錄下。
4. OfflineFileItem(離線文件表)
當目標用戶不在線時,發(fā)送給他的文件對應的記錄存在該表中。

補充說明:
離線文件默認存在服務端的運行目錄下的OfflineFiles文件夾下,RelayFilePath 指明了具體的相對路徑。
當離線用戶上線時,服務器會把這個文件轉(zhuǎn)發(fā)給該用戶,同時這個文件會從表中刪除。
5. GroupBan(群禁言表)
當群中的用戶被禁言時,對應的記錄將存在該表中。

6. ChatMessageRecord(聊天消息記錄表)
此表用于存儲聊天消息數(shù)據(jù)。

補充說明:
該表除了主鍵之外,還建有兩個聯(lián)合索引:
KEY?IX_ChatMessageRecord
?(SpeakerID
,AudienceID
,OccureTime
) USING BTREE
KEY?IX_ChatMessageRecord_1
?(AudienceID
,OccureTime
) USING BTREE
這兩個聯(lián)合索引,與客戶端兩種查詢聊天記錄的方式一一對應。
如此,服務端可以快速地從數(shù)據(jù)庫中加載滿足條件的聊天記錄返回給客戶端。
7. AddFriendRequest(加好友請求表)
所有添加好友的請求消息都存在該表中。

8. AddGroupRequest(入群請求表)
所有申請入群的請求消息都存在該表中。

9. GGConfiguration(系統(tǒng)配置表)
用于預留存儲與GGTalk相關(guān)的配置信息。

三. 小結(jié)
GGTalk 的數(shù)據(jù)庫只有9張表,而且都比較簡單。
每個表都有唯一的主鍵。
就實際使用來看,ChatMessageRecord?聊天記錄表的數(shù)據(jù)量將是最大的,所以,ChatMessageRecord 表必須建聯(lián)合索引,以支持快速查詢。
在我們接到的定制項目中,對于那些同時在線用戶量較大的(比如同時在線大于1萬人)使用場景,ChatMessageRecord 我們會采取按月分表的策略來應對,在這種情況下,GGTalk 的服務端代碼需要做相應的調(diào)整。有機會用到這種策略的朋友,可以和我們交流更多關(guān)于該策略的實現(xiàn)方案。
作為《GGTalk源碼剖析》的第一篇,差不多就這樣了。在接下來的一篇我們將介紹GGTalk服務端全局緩存。
敬請期待:《GGTalk 開源即時通訊系統(tǒng)源碼剖析之:服務端全局緩存》
點擊下面鏈接下載GGTalk 8.0版本源碼。
https://zhuanlan.zhihu.com/p/651560820