评论系统数据库设计及实现

评论系统数据库设计及实现

需求分析

一般我们浏览网站的时候经常能看到如下图的这种效果(图片来自CSDN)

这种评论层层嵌套,每个评论下面还挂着若干个对评论的回复。

这种结构类似于树状结构,用户看起来一目了然,也是一种非常主流的评论系统设计。

数据库设计

在以评论为主的树形结构中,数据库的设计非常灵活,可以是单表设计,每个评论都有一个parent_id指向父评论。还可以分开为两个表,评论一张表,对评论的回复是另一张表。

这里我使用的是单表设计。

数据表设计如下。由于我开发的是一个新闻系统,所以我就直接以项目举例。

表字段 ? ? 字段说明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
commentId 评论的id,自增值,每个评论都对应一个唯一的commentId
newsId ? ? 评论所对应的新闻的id ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
content ? 评论的内容 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
userId ? ? 发出该评论用户的id ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
parentId ? 指向父评论的id,如果不是对评论的回复,那么该值为null ?
date ? ? ? 评论产生日期 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

SQL语句:

评论表:

create table if not exists comments
(
? ? commentId bigint auto_increment primary key,
? ? newsId ? ?bigint not null,
? ? parentId ?bigint,
? ? content ? text ? not null,
? ? userId ? ?bigint not null,
? ? date ? ? ?timestamp default current_timestamp(),
? ? foreign key (parentID) references comments (commentId),
? ? foreign key (userID) references users (userId),
? ? foreign key (newsID) references news (newsId)
) charset = utf8mb4;

实现

  • 查询语句:
SELECT a.commentId,a.newsId,a.parentId,a.newsId,b.nickname,b.avatar,a.content,a.date
? ? ? ? FROM comments AS a,users AS b WHERE a.newsId=#{newsId} AND a.userId=b.userId

为了减少数据库查询次数,直接一次将一个新闻下的所有评论都查询了出来,然后通过程序来编排评论的显示结构。通过适当的冗余来提高性能也是常用的优化手段之一

  • 评论的实体类

import lombok.Data;
import java.util.Date;
import java.util.List;

@Data
public class Comment {
? ? Long commentId;
? ? Long newsId;
? ? Long parentId;
? ? Long userId;
? ? String nickname;
? ? String avatar;
? ? String content;
? ? Date date;
? ? List<Comment> child;
}

这里给出一段通过程序来组织所有评论的代码(为了文章的精简,只写逻辑相关的代码)

public List<Comment> getComments(Long newsId) {
? ? ? ? List<Comment> allComments = commentMapper.getComments(newsId);
? ? ? ? if (allComments == null || allComments.size() == 0) {
? ? ? ? ? ? return new ArrayList<>();
? ? ? ? }
? ? ? ? List<Comment> comments = new ArrayList<>();
? ? ? ? List<Comment> parents = new ArrayList<>();
? ? ? ? for (Comment comment : allComments) {
? ? ? ? ? ? if (comment.getParentId()==null) {
? ? ? ? ? ? ? ? comments.add(comment);
? ? ? ? ? ? ? ? parents.add(comment);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? boolean foundParent=false;
? ? ? ? ? ? ? ? for (Comment parent : parents) {
? ? ? ? ? ? ? ? ? ? if (comment.getParentId() == parent.getCommentId()) {
? ? ? ? ? ? ? ? ? ? ? ? if (parent.getChild() == null) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? parent.setChild(new ArrayList<>());
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? parent.getChild().add(comment);
? ? ? ? ? ? ? ? ? ? ? ? parents.add(comment);
? ? ? ? ? ? ? ? ? ? ? ? foundParent=true;
? ? ? ? ? ? ? ? ? ? ? ? //如果对list迭代过程中同时修改list,会报java.util.ConcurrentModificationException 的异常,所以我们需要break,当然break也可以提高算法效率
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (!foundParent) {
? ? ? ? ? ? ? ? ? ? throw new RuntimeException("can not find the parent comment");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return comments;

最终形成的效果图。

接口返回的数据如下:

{
? ? "code": "success",
? ? "message": "获取评论成功",
? ? "status": "200",
? ? "data": [
? ? ? ? {
? ? ? ? ? ? "id": "236051",
? ? ? ? ? ? "author_name": "Jianbo",
? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/Qib5jkFMntPJnT8b2nyzKicoYSuXLeyl07ia1dianxx1fWcic9hJL4UOEuIJvoWWbx7IFia3olUGqiabZvTe0dmeFBicHQ/132",
? ? ? ? ? ? "date": "6小时前",
? ? ? ? ? ? "content": "tt",
? ? ? ? ? ? "userid": "24",
? ? ? ? ? ? "child": []
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "id": "236028",
? ? ? ? ? ? "author_name": "起航",
? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/7Aq39lKL2jxoWSMgbiaYkQzOR0mOMTm2TLjVhRicYaFXAzg20I8gpcqySYYYQMWG60p8r5kibG3ibiav3CC8Bzibjblw/132",
? ? ? ? ? ? "date": "2019-04-11",
? ? ? ? ? ? "content": "很朴实的文字,又让人感动唏嘘",
? ? ? ? ? ? "formId": null,
? ? ? ? ? ? "userid": "9676",
? ? ? ? ? ? "child": [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? "id": "236032",
? ? ? ? ? ? ? ? ? ? "author_name": "Jianbo",
? ? ? ? ? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/Qib5jkFMntPJnT8b2nyzKicoYSuXLeyl07ia1dianxx1fWcic9hJL4UOEuIJvoWWbx7IFia3olUGqiabZvTe0dmeFBicHQ/132",
? ? ? ? ? ? ? ? ? ? "date": "2天前",
? ? ? ? ? ? ? ? ? ? "content": ":-)",
? ? ? ? ? ? ? ? ? ? "userid": "24",
? ? ? ? ? ? ? ? ? ? "child": [
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? "id": "236040",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "author_name": "God loves me",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/QTU6iasloiaun5OX6ZcZB964vhHLAc5RuIf8kMR3nwIXvy0HibYOe9RJ9o8escDOIj7MB1vica5ibZ2XSDXIibfQMsJA/132",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "date": "1天前",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "content": "为什么有人会选择安乐死呢,活着难道比不上痛苦吗",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "userid": "9663",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "child": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "id": "236042",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "author_name": "Jianbo",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/Qib5jkFMntPJnT8b2nyzKicoYSuXLeyl07ia1dianxx1fWcic9hJL4UOEuIJvoWWbx7IFia3olUGqiabZvTe0dmeFBicHQ/132",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "date": "1天前",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "content": "如果无法有尊严的活着,就难受",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "child": []
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ]
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ]
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ]
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "id": "236024",
? ? ? ? ? ? "author_name": "倡萌",
? ? ? ? ? ? "author_url": "../../images/gravatar.png",
? ? ? ? ? ? "date": "2019-04-11",
? ? ? ? ? ? "content": "每个人都有自己难以忘怀的过往,昨天今天明天,努力过好每一天!",
? ? ? ? ? ? "userid": "0",
? ? ? ? ? ? "child": [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? "id": "236041",
? ? ? ? ? ? ? ? ? ? "author_name": "Jianbo",
? ? ? ? ? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/Qib5jkFMntPJnT8b2nyzKicoYSuXLeyl07ia1dianxx1fWcic9hJL4UOEuIJvoWWbx7IFia3olUGqiabZvTe0dmeFBicHQ/132",
? ? ? ? ? ? ? ? ? ? "date": "1天前",
? ? ? ? ? ? ? ? ? ? "content": "过好今天,很重要",
? ? ? ? ? ? ? ? ? ? "userid": "24",
? ? ? ? ? ? ? ? ? ? "child": []
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ]
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "id": "236018",
? ? ? ? ? ? "author_name": "Jielinfan",
? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJBXIvvpMo5nXdlk6Mxwia9chS9E8VHGEQbDmyEAx8opRibztDzmpGHpbC3lR5vh8l4fsScZWoyEWyQ/132",
? ? ? ? ? ? "date": "2019-04-08",
? ? ? ? ? ? "content": "祝福老哥。",
? ? ? ? ? ? "userid": "280",
? ? ? ? ? ? "child": [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? "id": "236019",
? ? ? ? ? ? ? ? ? ? "author_name": "Jianbo",
? ? ? ? ? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/Qib5jkFMntPJnT8b2nyzKicoYSuXLeyl07ia1dianxx1fWcic9hJL4UOEuIJvoWWbx7IFia3olUGqiabZvTe0dmeFBicHQ/132",
? ? ? ? ? ? ? ? ? ? "date": "2019-04-09",
? ? ? ? ? ? ? ? ? ? "content": ":-)",
? ? ? ? ? ? ? ? ? ? "userid": "24",
? ? ? ? ? ? ? ? ? ? "child": []
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ]
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "id": "236017",
? ? ? ? ? ? "author_name": "增大网",
? ? ? ? ? ? "author_url": "../../images/gravatar.png",
? ? ? ? ? ? "date": "2019-04-08",
? ? ? ? ? ? "content": "送你一片大海,让你一帆风顺;送你一个太阳,让你热情奔放;送你一份真诚,祝你开心快乐;送你一份祝福,让你快乐天天!",
? ? ? ? ? ? "formId": null,
? ? ? ? ? ? "userid": "0",
? ? ? ? ? ? "child": []
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "id": "236011",
? ? ? ? ? ? "author_name": "今日新闻",
? ? ? ? ? ? "author_url": "../../images/gravatar.png",
? ? ? ? ? ? "date": "2019-04-07",
? ? ? ? ? ? "content": "文章不错非常喜欢",
? ? ? ? ? ? "userid": "0",
? ? ? ? ? ? "child": [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? "id": "236052",
? ? ? ? ? ? ? ? ? ? "author_name": "Jianbo",
? ? ? ? ? ? ? ? ? ? "author_url": "https://wx.qlogo.cn/mmopen/vi_32/Qib5jkFMntPJnT8b2nyzKicoYSuXLeyl07ia1dianxx1fWcic9hJL4UOEuIJvoWWbx7IFia3olUGqiabZvTe0dmeFBicHQ/132",
? ? ? ? ? ? ? ? ? ? "date": "6小时前",
? ? ? ? ? ? ? ? ? ? "content": "谢谢",
? ? ? ? ? ? ? ? ? ? "userid": "24",
? ? ? ? ? ? ? ? ? ? "child": []
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ]
? ? ? ? }
? ? ]
}

原文地址:https://www.cnblogs.com/godlovesme/p/10708358.html

时间: 2024-08-01 06:32:32

评论系统数据库设计及实现的相关文章

机房收费系统——数据库设计说明书

GB8567--88 数据库设计说明书 1      引言 优质数据库在处理大数据的程序或系统中是有非常重要的作用的,所以对于数据库的设计有很多的要求和规定.首先数据库要有很好的可维护性.灵活性,并且数据库的算法逻辑性也要有一定的优化性,这样可以对资源进行有效利用,并且处理数据的时间也会缩短. 1.1   编写目的 由于上机的人越来越多,产生的上机数据越来越多,原始的保存方式已经不能满足数据存储的需要,所以使用数据库对各种记录进行存储.并且数据库可以节省很多的资源,如人力.时间.空间等. 数据库

机房收费系统数据库设计

之前,学习编写机房收费系统的文档时,曾写过 机房收费系统数据库概念设计模型--ER图 这篇文章,现在到了机房收费系统个人版重构阶段,需要再次进行数据库的设计.可以说,之前的数据库的概念设计给我现在的设计奠定了一定的基础,但是仍然发现自己的设计中有许多不合理并且需要改进的地方. 在这次的数据库设计当中,学习了一些数据库的命名规范,重温了经典的三范式(属性原子化,避免局部依赖,避免传递依赖).但是发现,在需求面前,一些分属两张表的字段,为了方便,还是得放到一张表中,不得不破坏三范式. 现在将自己设计

VB.NET版机房收费系统—数据库设计

之前第一遍机房收费的时候,用的数据库是别人的,认知也只能建立在别人的基础上,等自考中<数据库系统原理>这本书学完了之后,再去看以前的数据库,发现数据库真的还需要进一步的优化,下面是我设计数据库的一些见解,希望大家多提些意见. 数据库设计 E-R模型: 在观念模型设计阶段,一个系统都是建立在ER模型上的,设计好ER模型,很重要. 我设计的ER图: 系统中的实体:很简单,就是将系统中的名词都抽象出来,再具体了就是转换为数据库的逻辑设计时才要考虑的. 系统中的联系:在图中可以看得很清楚,这里我要重点

ylbtech-KeFuYunWei(服务运维考核系统)-数据库设计

ylbtech-DatabaseDesgin:ylbtech-KeFuYunWei(服务运维考核系统)-数据库设计 DatabaseName:KEFUYUNWEI Model:Admin 用户后台管理数据设计 Type:管理软件 Url: 1.A,数据库关系图(Database Diagram) 返回顶部 1.B,数据库设计脚本(Database Design Script)返回顶部 use master go -- =======================================

VB.Net版机房收费系统 ---数据库设计

数据库设计是根据用户需求设计数据库结构的过程,具体来说,数据库设计是对于给定的应用环境,在厝数据库理论的指导下,构造最优的数据库模式,在数据库管理系统上建立数据库及其应用系统,使之能有效地存储数据,满足用户的各种需求的过程.到底数据库该如何设计,古往今来,每个人都有每个人的想法,所以数据库设计并没有优劣之分,好坏之别,合适的数据库设计就是最好的. 走过自考--<数据库系统原理>,看过耿建玲老师的视频,对数据库设计有了一点了解,VB版的机房收费系统,直接用原来的脚本生成的数据库,当时对数据库设计

在线笔试系统 数据库设计

试卷模板:papertemaplate 岗位类型:positiontype 题库:question 答卷:sheet 应聘者答案(答卷明细表):ansersheet 用户表(包含面试吗.HR.应聘者):user 角色表:role (用来区分用户的类型) 试卷模板和题库的关系(试卷明细表): paperdetails 应聘者和岗位的关系:userpositiondertails 用户表(用户表包含3个角色)user 列名 含义 类型 属性 id 记录编号 INT 自增.主键.非空 loginnam

02-大鸭梨博客系统数据库设计及Dapper的使用

毫无疑问,数据库的设计在一个系统中起了至关重要的作用.我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计.构建一个完善的系统需要这两个阶段的充分考量.周密设计.合理联接以及密切配合.数据库设计是整个系统的根基,它关乎系统功能的实现.稳定性.扩展性等多个方面,可见数据库设计的重要性. 那么好的数据库设计应该具备什么样的基本条件呢,大致有这么几点: 1.充分体现系统的需求 不管是数据库设计还是功能设计,我们最终的目的都是要实现客户的业务需求,所以数据库设计的第一准则就是要符合业

重构机房收费系统——数据库设计

曾记得,第一次编写机房收费系统的文档模板,整整有12个文档需要编写,仅仅花了两三天的时间就让师傅验收,完结项目,就这样囫囵吞枣的文档编写完成了. 要知道:欠下的账,终究是要还的.现在到了机房收费系统个人版重构阶段, (1)进行数据抽象,设计局部概念模型: (2)将局部概念模型综合成全局概念模型 (3)就可以按要求绘制机房收费系统数据库概念设计模型--ER关系图. 可以说,之前的数据库的概念设计给我奠定了一丢丢的设计基础,外加<数据库系统原理>中的三范式定理,本着求知好学.虚心请教的理念,于是乎

业务系统数据库设计常见的隔离和共享模式

多年开发和维护某些业务系统的经验,让人真正理解了什么叫“数据库设计良好,系统就成功了一半”,尤其是那些面向多商户的基础服务平台.公共服务平台.开放服务平台.或者由它们组合而成的综合服务平台.数据库设计之初,必须对业务系统DB的隔离和共享模式的优缺有充分的调研,平衡好业务系统的边界,合理设计使用必要的冗余,以适应系统后续的不断变化,否则后期开发人员将陷入无尽的烦恼和痛苦之中,这绝不是危言耸听,只有开发和维护过平台类产品的人才能深刻体会.下面就介绍三种业务系统中最常见的数据库设计的隔离和共享模式: