评论(评价)数据库表的设计
本文来源技术大牛,也是我的启蒙给的资料。若有侵权,请联系博主
概述
评论功能已经成为APP和网站开发中的必备功能。本文主要介绍评论功能的数据库设计。
评论功能最主要的是发表评论和回复评论(删除功能在后台)。
评论功能的拓展功能体现有以下几方面:
(1)单篇文章的评论数量和信息展示;
(2)从时间维度,按照时间倒叙的方式展示动态的用户评论信息;
(3)不同栏目,不同模块,不同时间维度的评论排行展示;
(4)精华评论的单独推荐和聚合展示;
(5)评论后直接分享到绑定的第三方平台;
(6)点赞数、回复数等维度的排行等。
评论的后台管理:
(1)删除;
(2)推荐;
(3)精华;
(4)屏蔽,敏感关键字的库的完善、自动屏蔽或者替换功能。
本篇文章主要分析几种客户端评论数据表的设计。
数据表设计
2.1一问一答模式
(1)需求分析
大部分APP采用简单的评论设计即可,即是一问一答模式,比如微信朋友圈的评论功能的设计。如:
A:今天天气真好!
B @ A :今天天气确实不错!
1
2
这种设计简单、直接,也满足了用户评论、回复的基本要求,对于没有大量用户评论的APP需求足够。
(2)数据库设计
这种场景下一般评论较少,评论不活跃,可以不区分评论和回复,统一看成评论。区别是,有些评论是直接评论主题,而有些是@其他用户,使用一张表就可以达到效果,评论表设计如下:
表字段 字段说明
id 主键
topic_id 主题id
topic_type 主题类型
content 评论内容
from_uid 评论用户id
to_uid 评论目标用户id
topic_type:为了能复用评论模块,我们引入这个字段来区分主题的类别。from_uid:表示评论人的id,通过该id我们可以检索到评论人的相关信息。to_uid 是评论目标人的id,如果没有目标人,则该字段为空
出于性能的考虑,往往我们会冗余评人的相关信息到评论表中,比如评论人的nick、头像,目标用户也是如此。
这样一来我们就只用查询单表就可以达到显示的效果有时,目标用户有多个,那么可以将to_uid字段修改为to_uids,保存时用分隔符来分割用户id,而目标用户的信息再去查询缓存或者数据库。也可以简单的将多个目标用户的信息一起存成json格式,可以应付简单的展现需求。
2.2 评论为主模式
(1)需求分析
如果以评论为主的显示模式,类似于下面的CSDN的评论显示模式:
这里将评论分为评论和回复,所有评论均挂在评论下面,类似于树状结构。
(2)数据库设计
在以评论为主的树形显示情况下,数据库的设计十分灵活,可以使用单表,添加一个parent_id字段来指向父评论,需要嵌套查询。
同时也可以将评论拆分为评论表和回复表,评论挂在各种主题下面,而回复挂在评论下面。
评论表设计如下:
表字段 字段说明
id 主键
topic_id 主题id
topic_type 主题类型
content 评论内容
from_uid 评论用户id
回复表设计:表字段 字段说明
id 主键
comment_id 评论id
reply_id 回复目标id
reply_type 回复类型
content 回复内容
from_uid 回复用户id
to_uid 目标用户id
由于我们拆分了评论和回复,那么评论表就不再需要目标用户字段了,因为评论均是用户对主题的评论,评论表的设计更佳简洁了
回复表添加了一个comment_id字段来表示该回复挂在的根评论id,这样设计也是出于性能方面的考虑,我们可以直接通过评论id一次性的找出该评论下的所有回复,然后通过程序来编排回复的显示结构。 通过适当的冗余来提高性能也是常用的优化手段之一。
reply_type:表示回复的类型,因为回复可以是针对评论的回复(comment),也可以是针对回复的回复(reply), 通过这个字段来区分两种情景。
reply_id:表示回复目标的id,如果reply_type是comment的话,那么reply_id=commit_id,如果reply_type是reply的话,这表示这条回复的父回复。
2.3 网易新闻盖楼模式
(1)需求分析
这种场景中评论和回复是同级显示的,回复不在显示结构上不用挂在一个评论下面。 双表的设计在这里就不太合适了,因为涉及到评论和回复的混排,使用双表则会导致查询的逻辑过于复杂。 所以建议还是采用单表的设计,不区分评论和回复会简化应用层的逻辑。 我们统一都看成评论,而有些评论是可以引用其他评论的。
(2)数据库设计
本人推荐采用闭包表的设计,例如:
comment表设计:表字段 字段说明
id 主键
topic_id 主题id
topic_type 主题类型
content 评论内容
from_uid 评论用户id
parent_child表:表字段 字段说明
id 主键
parent_id 父id
child_id 子id
comment表保存所有评论内容,而parent_children表则记录评论表中各个评论的父子关系。
查询时往往会按照时间排序,我们可以直接按id或者创建时间降序排列查询comment表即可。 如果用户想查询一条评论的完整引用,则可以通过parent_children来找到对应的路径。
闭包表在查询时非常方便,但是插入的性能稍差,因为除了插入评论表以外,还需要把该条评论所有的父子关系插入到父子关系表中。
插入性能会随着评论层级的加深而线性下降。
数据库优化
如果你的系统每天都会拥有成千上万条评论,那么单表的设计肯定是不行,优化的方式有以下几种思路。
(1)分库分表。 分库分表是最为常用也最有效的优化方式,建议按照主题来分库分表。 这样同一个主题下面的评论就会落到同一张表里,避免了跨表查询。
(2)适当的数据冗余。 如果你需要显示评论人的相关信息,那么在插入评论时就把这些信息写入评论表中,避免多次查询。 实际上,如果是纪录数据,都可以冗余对应的数据信息,因为它们的数据的实时行和一致性要求并不高。
(3)附加幂。数据只允许单项操作。 因为从幂性的要求来说,每个赞全都是一条记录。 评论的赞数如果都从点赞表中统计得出,那么性能开销会十分巨大,而且点赞如此轻量级的一个操作一定会加剧点赞表的竞争操作。 所以建议直接在评论表中添加一个like_count的计数器,该字段只增不减。客户端,可以设置取消效果。
(4)热门评论加缓存。 类似于网易新闻的热门评论,读取频度非常高,可以专门开接口做缓存。
本文来源技术大牛,也是我的启蒙给的资料。若有侵权,请联系博主
评论(评价)数据库表的设计相关推荐
- 数据库表的设计什么时候可以存在冗余?
数据库表的设计什么时候可以存在冗余? 这个是今天的一个面试题,一般我们在设计表的时候至少需要满足第二范式,全满足第三范式可能会有很多表,在一个大型系统中,表的设计肯定是需要做冗余的但是什么时候做冗余呢 ...
- MySQL之数据库表的设计
MySQL之数据库表的设计 一.表与表关系分类 1.一对多 2.多对多 3.一对一 二.表与表关系设计 1.创建四张表 2.表间关系分析: 3.设计例子 三.数据库范式 1.什么是范式? 2.函数依赖 ...
- 旅游项目之数据库表的设计
一.数据库表的设计思路 1.从业务出发 不应该针对整个系统进行数据库表的设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计:不同组件间对应的数据库表之间的关联尽可能 ...
- 关于数据库表冗余设计的优缺点
优点就是:可以快速查询(很多冗余就是为了避免多表链查),缺点就是:可能出现数据不同步问题. 为了方便大家理解举个例子(查询上海的用户20名 ) 有1000个用户 需要做地址address省份排序. 一 ...
- 程序员面试之MySQL数据库表的设计
如果要选择一门程序员必备的技能,那答案无疑是数据库,而MySQL是首选.很多企业在面试过程中会提问MySQL数据库表设计要注意什么,接下来小千就给大家讲解一下. MySQL相较于MSSQL SERVE ...
- 怎么用java实现一二级菜单,以及对应的数据库表怎么设计?
一.引言 怎么实现首页中一二级菜单联动效果?在我们开发过程中经常看到有菜单的出现,一般菜单也是有分类的.一般来说一级菜单下有N个二级菜单,在我们做管理系统的时候菜单是必不可免的.那我们应该怎么 ...
- 设计类似于抖音、小红书、微博等方式的主题点赞与评论的数据库表
转载请注明Garcia 主题设计: 主题ID.用户ID.主题标题.主题城市.主题位置名称.主题位置详细地址.地理经度.地理纬度. 主题展示内容(100).主题展示媒体文件路径(List图片名称 ...
- 对于数据库进行设计在PHP,关于数据库表的设计
如图所示 我的项目需要将已经爬取的coursera数据导入数据库,以备后续工作使用,如php等 现在数据已经爬取完毕,如图格式存在文件夹中,图片所示属于一个目录,我是一个数据菜鸟,不知道如何设计数据库 ...
- MySQL 数据库表的设计
数据库设计步骤: 收集信息--了解本项目的功能--图书管理系统.借书,换书 标识实体--标识项目中的客观对象--图书.借阅者.借书记录...... 标识实体属性:图书信息--图书id.书名.价格... ...
- Mysql数据库表如何设计?
三范式 三范式是一种数据库设计原则,要求将数据分解成更小.更简单的表,以减少数据冗余和提高数据一致性,同时保证每个表都符合第一范式.第二范式和第三范式的要求. 1. 代码实现 假设我们需要设计一个简单 ...
最新文章
- Python3编写网络爬虫04-爬取猫眼电影排行实例
- Spring 梳理 - ContentNegotiatingViewResolver
- python实现滑块验证功能_python3.8.1+selenium实现登录滑块验证功能
- 实现类似微博、QQ空间等的动态加载
- Java 第四周总结
- iOS:步进UIStepper、滑动块UISlider、开关UISwitch的基本使用
- [html] 列举几种瀑布流布局的方法
- 虚拟机体验苹果系统.Mac OS X On VMware.[Intel/AMD]版本
- rust显卡要求 steam_Steam夏促游戏销量排行,Epic称暂时不要买地平线黎明时分,虚幻5引擎配置要求不高,热血无赖电影开拍,Steam夏促育碧专区...
- Rust: Rangechar 'a'..'z' 能干什么?......待续
- 编解码格式 -- AAC
- 记Thinkpad的一次扩容升级经历
- python 批量打印PDF
- Redhat rpm常用命令以及如何配置yum软件仓库使用yum install
- 使用wangeditor遇到的坑,插入视频只显示音频
- 你离大厂前端工作,升职加薪有时就差一点算法,今天全部教给你!
- github git上传代码简单使用
- 深度图像基础知识(一)
- 微软认证一览表(附图)
- Obsidian DataView插件介绍