在线客服系统客服消息表设计,我到底在想什么?​

​最近在搞客服系统的消息存储模块,设计了一张 message 表。今天就来聊聊,为什么这张表长这样,以及我在设计时的那些小心思。

gofly.v1kf.com

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_idvisitor_id:快速查找某个客服或访客的所有消息。
  • created_at:按时间范围查询(比如“查昨天下午的聊天记录”)。

​(2)联合索引​

  • idx_kefuid_mestype_status(客服ID + 消息类型 + 状态):
    • 典型场景:​​“查某个客服未回复的访客消息”​​。
    • 组合查询时,避免全表扫描。

​4. 未来可能的优化​

​(1)分表分库​

如果消息量特别大(比如日均百万条),可以按 ent_id 或时间分表,避免单表过大影响性能。

​(2)消息已读回执​

目前 status 只有已读/未读,未来可以细化成:

  • delivered(已送达)
  • read(已读)
  • replied(已回复)

​(3)支持富媒体消息​

现在只存文本,但未来可能要存图片、文件、语音等,可能需要额外字段或关联表。

​5. 总结:设计表就是做取舍​

这张表的设计,核心是:

  1. ​清晰记录消息来源​​(谁发的?发给谁?)。
  2. ​高效查询​​(索引要到位)。
  3. ​可扩展​​(未来加字段不影响现有逻辑)。

​数据库表设计就像搭积木,既要稳,又要留出扩展空间。​​ 一开始可能不会完美,但至少要保证核心需求跑得动,剩下的,等业务发展再优化。

(完)

posted @ 2025-08-11 10:59  唯一客服系统开发笔记  阅读(17)  评论(0)    收藏  举报