项目中如何设计通用的评论模块
转载:猿天地 链接: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个段,存储冗余的数据,对查询来说更方便。
做法三
直接在文章中加个评论数量的字段,每次添加评论以及回复的时候累加评论量的字段,这种在查询显示的时候非常方便,也快,但是添加的时候需要去维护这个字段。
如果使用第三种,则达不到通用的效果了,因为你绑定了你的文章表,后面做源码评论那也要绑定源码表,在源码评论的时候你要去更新源码中的数量,比较耦合,但是对于显示来说性能是最好的。
我个人比较推荐用第二种,耦合低,通用,当然在打数据量的时候统计次数会比较慢,这个可以用替代的方案来实现,加缓存之类的 。
下面给大家看下猿天地上面的评论效果
最下面是直接评论文章的,然后在每条评论中可以回复评论具体的内容。
基本的需求还是可以满足的....
- 另类大数据:中国有嘻哈的rapper们都在唱些什么?
- jquery属性值选择器
- sqlserver 2000/2005 Ambiguous column error错误解决办法
- jquery 层级选择器
- Twitter发布基于组件的轻量级JavaScript框架——Flight
- jquery的基本选择器
- WordPress 路径相关函数总结(一):站点路径相关函数
- 修复Visual Studio 2010 SP1的Toolbox导致的VS不可用
- 破解Excel 密码保护
- 配置Subversion
- WordPress 路径相关函数总结(二):主题路径相关函数
- ASP.NET 2.0 中 Web 事件
- Visual Studio 必备可视化插件推荐
- WordPress 路径相关函数总结(一):站点路径相关函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言探索BRFSS数据可视化
- 基于ThinkPhp6.0+Vue 开发的一套免费开源新零售商城系统
- Kubernetes之RBAC权限管理
- 这是一份 pip 常用命令小结~
- 聊聊claudb的Database
- WebSocket 初识篇
- (一)MessageQueue之消息入队
- 宇智波程序笔记2-kafka 生产发送消息失败无响应,
- 高并发系统三大利器之缓存
- Nuxt.js框架(SSR)学习笔记
- 也谈状态模式
- BFE.dev前端刷题1 - 实现curry()
- BFE.dev前端刷题2 - 实现curry() 并支持placeholder
- TKE集群日志解决方案之日志采集
- Newbe.Claptrap 框架入门,第三步 —— 定义 Claptrap,管理商品库存