留言板的评论和回复存一个表好还是存两个表好?回复层级没有限制
时间: 2023-12-22 21:19:47 浏览: 132
jQuery评论插件可回复评论代码
对于留言板的评论和回复来说,存储在两个不同的表中是更好的选择,因为评论和回复是不同的实体,它们具有不同的属性和方法。将它们存储在不同的表中可以使数据的组织更加清晰和可维护,并且有助于避免数据冗余。
在这种情况下,建议使用两个表:一个用于存储评论,另一个用于存储回复。每个回复都应该有一个指向其父评论的外键,以便您可以轻松地构建回复层次结构。此外,您可以使用递归查询或使用特定的查询技术来检索回复层次结构。
下面是两个表的简单示例:
**评论表(comment)**
| 字段 | 类型 | 描述 |
| --- | --- | --- |
| id | 整数 | 评论的唯一标识符 |
| 评论者 | 字符串 | 评论者的名称 |
| 内容 | 字符串 | 评论的内容 |
| 创建时间 | 日期时间 | 评论创建的时间 |
**回复表(reply)**
| 字段 | 类型 | 描述 |
| --- | --- | --- |
| id | 整数 | 回复的唯一标识符 |
| 评论ID | 整数 | 与回复相关的评论的ID |
| 回复者 | 字符串 | 回复者的名称 |
| 内容 | 字符串 | 回复的内容 |
| 创建时间 | 日期时间 | 回复创建的时间 |
| 父回复ID | 整数 | 指向父回复的外键 |
在MyBatis中查询这两个表,您可以使用MyBatis的注解或XML映射器。下面是一个简单的XML映射器示例,该示例定义了查询评论及其相关回复的语句:
```xml
<select id="getCommentWithReplies" resultMap="commentWithReplies">
SELECT c.id, c.commenter, c.content, c.create_time,
r.id AS reply_id, r.comment_id AS reply_comment_id, r.replier AS reply_replier,
r.content AS reply_content, r.create_time AS reply_create_time, r.parent_reply_id AS reply_parent_id
FROM comment c
LEFT JOIN reply r ON c.id = r.comment_id
WHERE c.id = #{id}
ORDER BY r.create_time ASC
</select>
<resultMap id="commentWithReplies" type="Comment">
<id property="id" column="id" />
<result property="commenter" column="commenter" />
<result property="content" column="content" />
<result property="createTime" column="create_time" />
<collection property="replies" ofType="Reply">
<id property="id" column="reply_id" />
<result property="commentId" column="reply_comment_id" />
<result property="replier" column="reply_replier" />
<result property="content" column="reply_content" />
<result property="createTime" column="reply_create_time" />
<association property="parentReply" javaType="Reply" column="reply_parent_id" select="getReplyById" />
</collection>
</resultMap>
<select id="getReplyById" resultMap="replyResult">
SELECT id, comment_id, replier, content, create_time, parent_reply_id
FROM reply
WHERE id = #{id}
</select>
<resultMap id="replyResult" type="Reply">
<id property="id" column="id" />
<result property="commentId" column="comment_id" />
<result property="replier" column="replier" />
<result property="content" column="content" />
<result property="createTime" column="create_time" />
<association property="parentReply" javaType="Reply" column="parent_reply_id" select="getReplyById" />
</resultMap>
```
在这个示例中,我们使用LEFT JOIN来获取评论及其相关回复,并将其映射到Comment对象及其相关的Reply对象列表中。如果回复是其他回复的子级,则我们使用SQL递归查询来获取它的父回复。
阅读全文