imsdk 數(shù)據(jù)庫設(shè)計(jì)

字符編碼泼橘,字符集

后面 字符編碼涝动,字符集統(tǒng)一 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

開發(fā)數(shù)據(jù)庫

10.10.60.195 9701 ksuser ksuser

數(shù)據(jù)分庫分表思想

如果用戶id 有序自增 最好的方式以用戶id 分段模式 決定分庫 , 然后對(duì)用戶id 進(jìn)行取模決定分表
目前公司的用戶id是uuid 所以說不能做到分段分庫 炬灭。 但是我們可以根據(jù)用戶創(chuàng)建時(shí)間來做分段
比如 2021年 7 月 起 到 2023年 8 月為庫1 (可為邏輯庫)
2023年 8 月 起 到 2024年 8 月為庫2 (可為邏輯庫)
每個(gè)庫下面的表 醋粟,以用戶id uuid hash 取模 分32個(gè)分片 。保證用戶會(huì)路由到指定數(shù)據(jù)庫的指定table上

會(huì)話消息表 需要單獨(dú)設(shè)計(jì) 重归,每張表1000 w 米愿,128張表也就12億 會(huì)話消息 。保存會(huì)話未讀消息

歷史消息 提前,以月進(jìn)行一個(gè)劃分吗货,每個(gè)月32張表。 后面應(yīng)該會(huì)用hbase 狈网,歷史消息會(huì)存在大量數(shù)據(jù) 宙搬,而這個(gè)數(shù)據(jù)保存期限笨腥,需要和產(chǎn)品商量。目前保存一個(gè)月 勇垛。 一個(gè)月后清除 (時(shí)間可以配置)

數(shù)據(jù)庫分表設(shè)計(jì)

分庫目前沒做脖母,但是預(yù)留了分庫的代碼,可以后面接入闲孤。

分表目前是按照:用戶uuid的hash值模以32取絕對(duì)值來分谆级,Math.abs(uuid.hashCode()) % 32)。對(duì)應(yīng)32張表讼积。表命名格式:基礎(chǔ)表_取模值肥照,取模值為[0,31] 例如:conversation _ index _ 31

私信相關(guān)表:
conversation_index_31 // 會(huì)話索引表,分表
conversation_msg_31 // 會(huì)話表勤众,分表
msg_record_31 // 未讀消息表舆绎,分表
msg_record_history_202106_31 // 消息歷史表,按 月份 和 uuid取模 兩個(gè)維度分们颜,單獨(dú)說明
關(guān)注相關(guān)表:
attention_conversation_31 // 會(huì)話表吕朵,分表
attention_msg // 消息記錄表,未分表
點(diǎn)贊回復(fù)相關(guān)表:
system_conversation_31 // 系統(tǒng)會(huì)話表窥突,分表
system_conversation_msg // 系統(tǒng)會(huì)話消息記錄表努溃,未分表

msg_record和msg_record_history:

  1. msg_record_history可以看成msg_record的備份表,私信聊天的消息會(huì)雙寫到這兩張表中阻问,已讀 回調(diào)的時(shí)候會(huì)刪掉msg_record中所有的消息梧税,msg_record中專門存放未讀消息,msg_record_history中存放所有的消息記錄则拷。

  2. msg_record_history會(huì)在每個(gè)月的4號(hào)5號(hào)0點(diǎn)時(shí)贡蓖,定時(shí)任務(wù)創(chuàng)建下個(gè)月的分表。以年月為索引煌茬,創(chuàng)建32張分表斥铺。

數(shù)據(jù)庫原始表
/*
 Navicat Premium Data Transfer

 Source Server         : 10.10.60.195 開發(fā)
 Source Server Type    : MySQL
 Source Server Version : 50620
 Source Host           : 10.10.60.195:9701
 Source Schema         : private_message

 Target Server Type    : MySQL
 Target Server Version : 50620
 File Encoding         : 65001

 Date: 15/04/2021 15:00:02
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for conversation_index
-- ----------------------------
DROP TABLE IF EXISTS `conversation_index`;
CREATE TABLE `conversation_index` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `conversation_id` bigint(15) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話id',
  `read_msg_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '已讀消息id',
  `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時(shí)間',
  `ext_index1` int(11) NOT NULL DEFAULT '0',
  `ext_index2` int(11) NOT NULL DEFAULT '0',
  `ext_field1` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_cid` (`conversation_id`) USING BTREE,
  KEY `idx_read_msg_id` (`read_msg_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '會(huì)話索引表';

-- ----------------------------
-- Table structure for conversation_msg
-- ----------------------------
DROP TABLE IF EXISTS `conversation_msg`;
CREATE TABLE `conversation_msg` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `conversation_id` bigint(15) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話id',
  `msg_to` varchar(16) NOT NULL DEFAULT '' COMMENT '接受者userid',
  `msg_from` varchar(16)  NOT NULL DEFAULT '' COMMENT '發(fā)送者userid',
  `sender_nickname` varchar(50) NOT NULL DEFAULT '' COMMENT '發(fā)送者nickname',
  `msg_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話的最新的msgid   ',
  `msg_content` text COMMENT '消息內(nèi)容',
  `msg_img` varchar(255)  NOT NULL DEFAULT '' COMMENT '會(huì)話展示圖片 紅點(diǎn)地址  ',
  `client_seq` int(14) unsigned NOT NULL DEFAULT '0' COMMENT '客戶端 時(shí)間戳   ',
  `unread_num` int(5) unsigned NOT NULL DEFAULT '1' COMMENT '未讀消息數(shù)  ',
  `is_del` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `ext_field1` varchar(255) NOT NULL DEFAULT '',
  `ext_field2` varchar(255) NOT NULL DEFAULT '',
  `create_time` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `msg_to` (`msg_to`,`msg_from`),
  UNIQUE KEY `idx_cid` (`conversation_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '會(huì)話表';

-- ----------------------------
-- Table structure for msg_record
-- ----------------------------
DROP TABLE IF EXISTS `msg_record`;
CREATE TABLE `msg_record` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `conversation_id` bigint(15) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話id',
  `msg_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'msg id',
  `msg_to` varchar(32) NOT NULL DEFAULT '' COMMENT '接受者userid',
  `msg_from` varchar(32)  NOT NULL DEFAULT '' COMMENT '發(fā)送者userid',
  `msg_content` text  NOT NULL COMMENT '消息內(nèi)容',
  `client_seq` int(14) unsigned NOT NULL DEFAULT '0' COMMENT '客戶端序列號(hào)',
  `msg_type` int(5) unsigned NOT NULL DEFAULT '0' COMMENT '消息類型',
  `msg_code` int(5) unsigned NOT NULL DEFAULT '0' COMMENT '消息碼,映射他趣消息類型',
  `is_del` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `create_time` bigint(20) NOT NULL DEFAULT '0',
  `push_time` bigint(20) NOT NULL DEFAULT '0',
  `ext_field1` varchar(255)  NOT NULL DEFAULT '',
  `ext_field2` varchar(255)  NOT NULL DEFAULT '',
  `ext_field3` varchar(255)  NOT NULL DEFAULT '',
  `ext_field4` varchar(255)  NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_cid` (`conversation_id`,`msg_id`) USING BTREE,
  KEY `idx_msg_to` (`msg_to`),
  KEY `idx_msg_from` (`msg_from`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '消息記錄表';

-- ----------------------------
-- Table structure for system_msg
-- ----------------------------
DROP TABLE IF EXISTS `system_msg`;
CREATE TABLE `system_msg` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `conversation_id` bigint(15) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話id',
  `msg_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'msgid',
  `action` varchar(255)  NOT NULL DEFAULT '' COMMENT '紅包點(diǎn)擊跳轉(zhuǎn)    ',
  `file` varchar(255)  NOT NULL DEFAULT '' COMMENT '紅包圖片地址 or 文件地址 or 語音地址 or 視頻    ',
  `content` varchar(255)  NOT NULL DEFAULT '' COMMENT '保存title 或者富文本消息  ',
  `is_del` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `create_time` bigint(11) NOT NULL DEFAULT '0',
  `ext_field1` varchar(255)  NOT NULL DEFAULT '',
  `ext_field2` varchar(255)  NOT NULL DEFAULT '',
  `ext_field3` varchar(255)  NOT NULL DEFAULT '',
  `ext_field4` varchar(255)  NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_cmid` (`conversation_id`,`msg_id`)
)  ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '系統(tǒng)消息表';

SET FOREIGN_KEY_CHECKS = 1;

-- ----------------------------
-- Table structure for attention_msg
-- ----------------------------
CREATE TABLE `attention_msg` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水號(hào)',
  `msg_to` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '接受者userid',
  `msg_from` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '發(fā)送者userid',
  `msg_content` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息內(nèi)容',
  `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時(shí)間',
  `conversation_id` int(15) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話id',
  `msg_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '消息id',
  PRIMARY KEY (`id`),
  KEY `idx_msg_to` (`msg_to`),
  KEY `idx_msg_from` (`msg_from`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=186 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='關(guān)注消息表';

-- ----------------------------
-- Table structure for attention_conversation
-- ----------------------------
CREATE TABLE `attention_conversation` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `conversation_id` int(15) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話id',
  `uuid` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '被關(guān)注用戶id',
  `un_read_num` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '未讀數(shù)量',
  `read_msg_id` int(11) NOT NULL DEFAULT '0' COMMENT '最新已讀的msg_id',
  `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時(shí)間',
  `update_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新時(shí)間',
  PRIMARY KEY (`id`),
  KEY `idx_uuid` (`uuid`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='關(guān)注會(huì)話表';

-- ----------------------------
-- Table structure for system_conversation
-- ----------------------------
CREATE TABLE `system_conversation` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `conversation_id` int(15) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話id',
  `uuid` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用戶id',
  `un_read_num` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '未讀數(shù)量',
  `msg_content` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '最新消息內(nèi)容',
  `type` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '類型:0:點(diǎn)贊坛善,1:回復(fù)晾蜘,....',
  `read_msg_id` int(11) NOT NULL DEFAULT '0' COMMENT '最新已讀的msg_id',
  `last_msg_id` int(11) NOT NULL DEFAULT '0' COMMENT '最新的msg_id',
  `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時(shí)間',
  `update_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新時(shí)間',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_uuid` (`uuid`,`type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系統(tǒng)會(huì)話表';

-- ----------------------------
-- Table structure for system_conversation_msg
-- ----------------------------
CREATE TABLE `system_conversation_msg` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水號(hào)',
  `msg_to` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '接受者userid',
  `msg_from` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '發(fā)送者userid',
  `msg_content` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息內(nèi)容',
  `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時(shí)間',
  `conversation_id` int(15) unsigned NOT NULL DEFAULT '0' COMMENT '會(huì)話id',
  `msg_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '消息id',
  PRIMARY KEY (`id`),
  KEY `idx_msg_to` (`msg_to`),
  KEY `idx_msg_from` (`msg_from`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=212 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系統(tǒng)會(huì)話對(duì)應(yīng)的消息表';

舊設(shè)計(jì)待刪除

不會(huì)出現(xiàn)在會(huì)話列表中數(shù)據(jù),應(yīng)該是不需要插入會(huì)話列表的 眠屎。但如果哪天這些消息需要出現(xiàn)在會(huì)話列表呢剔交。
這時(shí)候 ,我們?cè)诓迦胍膊贿t 改衩。因?yàn)闀?huì)話表是保持單一會(huì)話一條消息岖常。

系統(tǒng)消息表和私信 是否需要區(qū)分呢。個(gè)人建議的話 葫督,還是區(qū)分
私信和 系統(tǒng)消息竭鞍,讀寫訪問量是不同的板惑。
最好能根據(jù)不同場(chǎng)景定義不同消息。而不是一張表care 所有消息偎快。

目前關(guān)注消息冯乘,紅點(diǎn)消息 , 回執(zhí)流程 晒夹。是否可以多次關(guān)注 裆馒。

1 . 分庫uuid 研究 (暫時(shí)不開發(fā))0.5天
2 . 分表從etcd 獲取配置 tablename , num (num 用于取模)丐怯,分表路由 2天
3 . 定時(shí)任務(wù)創(chuàng)建歷史消息表 喷好,其他分表腳本 1天
4 . 私信歷史消息表 對(duì)應(yīng) 發(fā)送私信接口 ,歷史消息接口 變更 (2天)
5 . 系統(tǒng)消息 關(guān)注 attention_msg 读跷,回復(fù)绒窑,點(diǎn)贊 只是日志表可以不用管 ,會(huì)話表需要處理 (1天)舔亭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蟀俊,隨后出現(xiàn)的幾起案子钦铺,更是在濱河造成了極大的恐慌,老刑警劉巖肢预,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矛洞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烫映,警方通過查閱死者的電腦和手機(jī)沼本,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锭沟,“玉大人抽兆,你說我怎么就攤上這事∽寤矗” “怎么了辫红?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祝辣。 經(jīng)常有香客問我贴妻,道長,這世上最難降的妖魔是什么蝙斜? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任名惩,我火速辦了婚禮,結(jié)果婚禮上孕荠,老公的妹妹穿的比我還像新娘娩鹉。我一直安慰自己攻谁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布底循。 她就那樣靜靜地躺著巢株,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熙涤。 梳的紋絲不亂的頭發(fā)上阁苞,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音祠挫,去河邊找鬼那槽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛等舔,可吹牛的內(nèi)容都是我干的骚灸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼慌植,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼甚牲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝶柿,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤丈钙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后交汤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雏赦,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年芙扎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了星岗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戒洼,死狀恐怖俏橘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情圈浇,我是刑警寧澤敷矫,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站汉额,受9級(jí)特大地震影響曹仗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蠕搜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一怎茫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦轨蛤、人聲如沸蜜宪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圃验。三九已至,卻和暖如春缝呕,著一層夾襖步出監(jiān)牢的瞬間澳窑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工供常, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摊聋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓栈暇,卻偏偏與公主長得像麻裁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子源祈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 本文主要將業(yè)界知名的開源分庫分表中間件—ShardingJdbc集成至SpringBoot工程中煎源,利用Shardi...
    Java小鋪閱讀 2,235評(píng)論 0 5
  • 1.數(shù)據(jù)庫設(shè)計(jì) 1.1庫名 1.庫的名稱盡量控制在32個(gè)字符以內(nèi),最長不超過64個(gè)字符香缺,相關(guān)模塊的表名與表名之間盡...
    Mwk閱讀 2,158評(píng)論 0 4
  • [TOC] 一薪夕、基本概念 1、為什么要使用數(shù)據(jù)庫赫悄? 數(shù)據(jù)存放的位置通常由兩個(gè)地方,內(nèi)存和硬盤馏慨,存放在內(nèi)存中的數(shù)據(jù)訪...
    yaco閱讀 1,135評(píng)論 0 5
  • 1. MySQL 索引使用有哪些注意事項(xiàng)呢埂淮? 可以從三個(gè)維度回答這個(gè)問題:索引哪些情況會(huì)失效,索引不適合哪些場(chǎng)景写隶,...
    寂水流深閱讀 2,103評(píng)論 0 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月倔撞,有人笑有人哭,有人歡樂有人憂愁慕趴,有人驚喜有人失落痪蝇,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,535評(píng)論 28 53