显示目录

答疑表设计

答疑主要涉及 2 个表,问题表和回复表,核心字段如下:

数据存储逻辑:

  • 问题存储到表 qa_question
  • 每个回复都存储问题的 ID
  • 直接对问题进行回复存储到表 qa_reply
    • target_reply_id 为 0
    • first_level_reply_id 为此回复的 id
    • level 为 1
  • 还可以对回复进行回复,存储到表 qa_reply,回复是一个有层级的树状结构
    • target_reply_id 为被回复的回复 ID
    • first_level_reply_id 为此回复所在第一级的回复 ID
    • level 为被回复的 level + 1

此设计的优点: 可以使用一条 SQL 语句分页查询出问题的 N 个一级回复、以及这些一级回复下所有相关的回复:子查询得到第一级的 N 个 reply id, 然后查找所有 first_level_reply_id 为这 N 个 reply id 的所有回复

1
2
3
4
5
6
7
SELECT qa_reply.*
FROM qa_reply,
(SELECT id FROM qa_reply
WHERE question_id = #{question_id} AND target_reply_id = 0
LIMIT #{offset}, #{count}
) AS fl_ids
WHERE question_id = #{question_id} AND qa_reply.first_level_reply_id = fl_ids.id

如果使用 level,还可以对回复层数进行过滤,当层数很多时,可以动态请求更深层次的回复,避免一次获取太多数据。

此外,根据业务,可以对问题表增加字段如是否加精、推荐置顶、点赞数量、回复数量等,回复表增加点赞数量、被回复者的名字 (方便显示) 等,对点赞、取消点赞、点击推荐等行为记录到日志表中。