项目中如何设计通用的评论模块

时间:2022-05-06
本文章向大家介绍项目中如何设计通用的评论模块,主要内容包括张三 李四 文章ID 评论内容 评论时间 博客、李四 张三 文章ID 评论ID 回复内容 回复时间 博客、做法一、做法二、做法三、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

转载:猿天地 链接:http://cxytiandi.com/blog/detail/2289

猿天地在做完博客功能后,就有小伙伴提出了文章下不能评论啊,怎么跟原作者交流呢?

刻不容缓,得马上加上评论以及回复的功能,由于太忙了,上周2天和这周1天,总共花了3天时间基本上是把这块的功能做完了,在这里分享下实现的过程以及数据库表的设计。

设计这种功能时一定要考虑通用性,现在是对文章的评论及回复,后面别的评论是不是直接可以复用代码。

总共2张表,评论和评论的回复。

create table Comment(
  id int(11) not null auto_increment,
  content varchar(500) not null comment '评论内容',
  addTime datetime not null comment '评论时间',
  commentObj varchar(20) not null comment '评论对象(博客,源码,问题)',
  commentObjUserId int(11) not null comment '评论对象用户ID',
  commentObjId int(11) not null comment '评论对象ID',
  commentUserId int(11) not null comment '评论用户ID',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 comment='评论表';
create table CommentReply(
  id int(11) not null auto_increment,
  commentObj varchar(20) not null comment '评论对象(博客,源码,问题)',
  commentObjId int(11) not null comment '评论对象ID',
  commentId int(11) not null comment '评论ID',
  content varchar(500) not null comment '回复内容',
  addTime datetime not null comment '回复时间',
  replyCommentUserId int(11) not null comment '回复评论的用户ID',
  replyUserId int(11) not null comment '回复用户ID',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 comment='评论回复表';

在评论表中有commentObj评论对象,用这个来区分是对什么的评论,博客,源码等等。

张三评论李四的文章,那么此时有一条评论数据

张三 李四 文章ID 评论内容 评论时间 博客

李四回复张三的评论,此时就是回复的数据了

李四 张三 文章ID 评论ID 回复内容 回复时间 博客

此时要查询文章下面的所有评论就直接可以查评论表

select * from Comment where commentObj='博客' and commentObjId='文章ID';

查询评论下的所有回复直接查回复表

select * from CommentReply where commentId = '评论ID';

要查询这篇文章下总共有多少评论(现在基本上评论的回复也算是一条评论)

做法一

这样的话我们需要查2次,先根据文章ID查询评论中的数量

然后根据所有的评论ID去去做in查询回复的量,加起来得到总的量

做法二

先根据文章ID查询评论中的数量

然后根据commentObj,commentObjId,去查回复表,这样就不用in查询了

这就是为什么我要在回复表中也加上commentObj,commentObjId这2个段,存储冗余的数据,对查询来说更方便。

做法三

直接在文章中加个评论数量的字段,每次添加评论以及回复的时候累加评论量的字段,这种在查询显示的时候非常方便,也快,但是添加的时候需要去维护这个字段。

如果使用第三种,则达不到通用的效果了,因为你绑定了你的文章表,后面做源码评论那也要绑定源码表,在源码评论的时候你要去更新源码中的数量,比较耦合,但是对于显示来说性能是最好的。

我个人比较推荐用第二种,耦合低,通用,当然在打数据量的时候统计次数会比较慢,这个可以用替代的方案来实现,加缓存之类的 。

下面给大家看下猿天地上面的评论效果

最下面是直接评论文章的,然后在每条评论中可以回复评论具体的内容。

基本的需求还是可以满足的....