如何实现一个评论模块

本文探讨了如何实现一个评论模块,从最初的简单设计到引入第三方评论系统,再到数据库设计和数据排序模拟。通过递归思想解决层级评论排序,并讨论了在实际应用中可能遇到的线程安全问题及解决方案。
摘要由CSDN通过智能技术生成

前言:

  这篇文章主要介绍了博主在学习过程中的一些思路、以及这个评论模块的大致的实现过程,可能并不是常规的做法(全都是自己YY出来的),希望能提供一些思路。

 

一、实现一个什么样的评论模块?

  最开始接触到评论的时候,是在自己做一个个人博客的时候遇到的,当时自己想的很简单,别人评论,然后博主回复。类似于这样:

  这种评论很简单,数据库里只需要把回复作为一个字段存进去就可以了,但是后来看到了 畅言 和 多说 ,两个免费的评论系统,只需要调用他们的API就可以把评论模块托管到第三方平台,比较方便。类似这种比较完善的评论模块,是可以评论别人的评论,然后又可以回复其他的评论,类似于这样:

 

二、数据库该怎么设计?

  刚开始是想设计成两个表,一个表是所有的评论,一个表存放所有的评论的子评论,然后子评论中多一个字段,存放父评论的ID,这样把两个表关联起来,但是如果再往下增加子节点,就要判断是往哪个数据表中插入,这就比较复杂了。其实仔细想一下这两张表的结构,使用ID关联起来的,完全可以合成一张表,表结构如下:

 

  最上层的评论的pid是0,子评论的pid就是父评论的id,好像这样的表结构就可以把所有的评论放到一个表中,但是又有一个问题了,像这样表结构存贮的数据取出来的结果是默认按id排序的:

 

  这样的表结构取出来的数据默认的排序规则是按照id排序的,在前台数据展示的时候,怎么把一个子评论放到其应有的位置呢? 例如:上表中的id值为105的这条数据,父评论是id为102的这条数据,所以,105的位置应该在102这条数据的后面,而这种默认的排序规则是不满足要求的;刚开始想的是怎么把这个数据表怎么填充到一棵树的节点上,因为这个评论系统的结构可以模拟成一棵树,但是怎么遍历这棵树让数据按照正确的规则显示到前台的页面上呢,数据结构和算法学得不是太好,思考未果。。。于是就想,数据都是正确的,只是顺序不对,只需要将它排序就行了。

 

三、进行数据模拟

  数据模拟的思路很简单,就是把数据库中的每一条记录都当成是一个对象实体,把整个表的数据放到一个对象数组里面,然后针对这个对象数组进行排序;首先肯定要遍历这个数组,每次循环只需要找到该条评论的子评论就行了,通过pid作为参数进行判断,每一次循环都是做同样的事,其实就是一种递归的思想,递归的深度就取决于子评论的深度;具体代码如下

package commet.sort.test;
import commet.sort.entity.Comment;
public class Test {
    public static void main(String[] args) {
        Comment[] comments = { 
                new Comment(1001, 0, "a", "a's comment", 1), 
                new Comment(1002, 0, "b", "b's comment", 1),
                new Comment(1003, 0, "c", "c's comment", 1), 
                new Comment(1004, 0, "d", "d's comment", 1),
                new Comment(1005, 1002, "e", "e's comment", 2), 
                new Comment(1006, 1002, "f", "f's comment", 2),
                new Comment(1007, 1005, "g", "g's comment", 3), 
                new Comment(1008, 0, "h", "h's comment", 1),
                new Comment(1009, 0, "i", "i's comment", 1), 
                new Comment(10010, 1003, "j", "j's comment", 1),
                new Comment(10011, 1010, "k", "k's comment", 1), 
                new Comment(10012, 1007, "l", "l's comment", 1),
                new Comment(10013, 1006, "m", "m's comment", 1), 
                new Comment(10014, 0, "n", "n's comment", 1), };
        sortByArray(comments, 0
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值