答案:数据库包含用户、会话、消息三张核心表。用户表通过角色字段区分客户与客服;会话表记录对话状态及参与人员;消息表存储具体通信内容,并关联发送者与会话,支持高效查询与扩展。

设计一个简易客服系统数据库,核心是围绕用户、客服人员、会话和消息这几个关键实体展开。目标是支持基本的对话记录、消息传递和状态管理,结构清晰且易于扩展。
1. 用户与客服表(users)
可以统一用一张用户表区分角色,通过字段标识是普通用户还是客服人员。
表名: users
- id:主键,自增
- username:用户名(唯一)
- role:角色(如 ‘customer’, ‘agent’)
- created_at:注册时间
这样设计便于权限控制和登录验证,后续也可加入邮箱、密码等字段。
2. 会话表(conversations)
每开启一次对话生成一条会话记录,用于跟踪对话生命周期。
表名: conversations
- id:主键,自增
- customer_id:发起会话的用户ID(外键关联 users.id)
- agent_id:分配的客服ID(可为空,表示未接入)
- status:会话状态(如 ‘open’, ‘closed’)
- opened_at:会话开始时间
- closed_at:会话关闭时间(可为空)
该表可用于统计活跃会话、响应时长等基础指标。
3. 消息表(messages)
存储所有发送的消息内容,是系统最频繁写入的表。
表名: messages
- id:主键,自增
- conversation_id:所属会话ID(外键关联 conversations.id)
- sender_id:发送者ID(外键关联 users.id)
- content:消息文本
- sent_at:发送时间,默认 CURRENT_TIMESTAMP
建议在 conversation_id 和 sent_at 上建立索引,提升按会话拉取消息的速度。
4. 简单查询示例
获取某个会话的全部消息:
SELECT u.username, m.content, m.sent_at FROM messages m JOIN users u ON m.sender_id = u.id WHERE m.conversation_id = 123 ORDER BY m.sent_at;
查看用户打开的会话:
SELECT * FROM conversations WHERE customer_id = 101 AND status = 'open';
基本上就这些。结构简单,但已能支撑基本的客服交互功能。后续可根据需要添加已读状态、附件支持、自动分配逻辑等。