在线客服系统客服消息表设计,我到底在想什么?
最近在搞客服系统的消息存储模块,设计了一张 message
表。今天就来聊聊,为什么这张表长这样,以及我在设计时的那些小心思。
vx: llike620
1. 为什么要有这张表?
简单来说,就是记录客服和访客的聊天记录。但真正做起来,要考虑的东西可不少:
- 消息归属:谁发的?客服还是访客?
- 状态管理:消息是否已读?
- 历史查询:如何快速查找某次对话?
- 扩展性:未来会不会加新功能?
所以,这张表不能随便建,得考虑长远。
2. 核心字段设计
(1)基础信息:谁发的?发给谁?
kefu_id
(客服ID):标记这条消息是哪个客服处理的。visitor_id
(访客ID):标记这条消息来自哪个用户。mes_type
(消息类型):区分是客服发的(kefu
)还是访客发的(visitor
)。
为什么这么设计?
- 方便统计客服工作量(比如:某个客服回复了多少条消息)。
- 支持多客服、多访客的对话场景。
(2)消息内容:存什么?怎么存?
content
(原始消息):直接存用户或客服发送的文本。translated_content
(翻译后的消息):后来加的,因为系统要支持多语言,比如英文客服和中文访客聊天时,自动翻译内容。
为什么用 TEXT
而不是 VARCHAR
?
- 消息可能很长(比如用户粘贴了一堆错误日志),
TEXT
更灵活,不会像VARCHAR(255)
那样被截断。
(3)状态管理:消息是否已读?
status
(状态):read
(已读)或unread
(未读)。
为什么用 ENUM
而不是 TINYINT
?
- 可读性更强,查询时直接看
status='read'
而不是status=1
,减少记忆负担。
(4)时间管理:什么时候发的?
created_at
(创建时间):消息发送时间,默认CURRENT_TIMESTAMP
。updated_at
(更新时间):记录最后修改时间(比如标记已读时更新)。deleted_at
(删除时间):软删除标记,避免真删数据。
为什么用软删除?
- 客服误删消息时能恢复。
- 合规要求,某些行业(如金融、医疗)的聊天记录必须保留一段时间。
(5)企业隔离:数据属于哪家公司?
ent_id
(企业ID):支持 SaaS 模式,不同公司的客服数据隔离。
为什么需要这个?
- 避免 A 公司的客服看到 B 公司的聊天记录。
3. 索引设计:如何让查询更快?
(1)单字段索引
kefu_id
、visitor_id
:快速查找某个客服或访客的所有消息。created_at
:按时间范围查询(比如“查昨天下午的聊天记录”)。
(2)联合索引
idx_kefuid_mestype_status
(客服ID + 消息类型 + 状态):- 典型场景:“查某个客服未回复的访客消息”。
- 组合查询时,避免全表扫描。
4. 未来可能的优化
(1)分表分库
如果消息量特别大(比如日均百万条),可以按 ent_id
或时间分表,避免单表过大影响性能。
(2)消息已读回执
目前 status
只有已读/未读,未来可以细化成:
delivered
(已送达)read
(已读)replied
(已回复)
(3)支持富媒体消息
现在只存文本,但未来可能要存图片、文件、语音等,可能需要额外字段或关联表。
5. 总结:设计表就是做取舍
这张表的设计,核心是:
- 清晰记录消息来源(谁发的?发给谁?)。
- 高效查询(索引要到位)。
- 可扩展(未来加字段不影响现有逻辑)。
数据库表设计就像搭积木,既要稳,又要留出扩展空间。 一开始可能不会完美,但至少要保证核心需求跑得动,剩下的,等业务发展再优化。
(完)
十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》
一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网