答疑主要涉及 2 个表,问题表 qa_queston 和回复表 qa_reply,核心字段如下:
此设计的优点:
可以使用一条 SQL 语句分页查询出问题的 N 个一级回复、以及这些一级回复下所有相关的回复:
- 查找到问题的 n 个第一级回复的 top_reply_id
x
- 查找问题的回复中所有第一级回复为
x
的回复
1 | SELECT q.*, r.* |
parent_id
为 0,说明是第一级回复。如果回复再增加 level 属性,还可以对回复层数进行过滤,当层数很多时,可以动态请求更深层次的回复,避免一次获取太多数据。
此外,根据业务,可以对问题表增加字段如是否加精、推荐置顶、点赞数量、回复数量等,回复表增加点赞数量、被回复者的名字 (方便显示) 等,对点赞、取消点赞、点击推荐等行为记录到日志表中。
以下部分用于测试
问题和回复
1 | 1. 特别定制「乌龙茶」,有人跟我一样只喜欢有味道的,或者冰的饮品嘛? |
清空数据库
1 | TRUNCATE TABLE qa_question; |
问题一
1 | INSERT INTO qa_question(id, clazz_id, user_id, user_name, content) VALUES (1, 1, 30, 'Bob', '特别定制「乌龙茶」,有人跟我一样只喜欢有味道的,或者冰的饮品嘛?'); |
问题二
1 | INSERT INTO qa_question(id, clazz_id, user_id, user_name, content) VALUES (2, 1, 30, 'Bob', '找一个靠谱的设计师长期合作?'); |
查询问题和回复
只在第一级回复上分页,同时查询出这个回复的所有后代:
- 查找到问题的 n 个第一级回复的 top_reply_id
x
- 查找问题的回复中所有第一级回复为
x
的回复
1 | SELECT q.*, r.* |
修改 question_id 查询不同问题的回复。