数据库设计——评论回复功能

我的归宿就是健康与才干,一个人终究可以信赖的,不过是他自己,能够为他扬眉吐气的也是他自己,我要什么归宿?我已找回我自己,我就是我的归宿。——《胭脂》

1、概述

评论功能已经成为APP和网站开发中的必备功能。本文主要介绍评论功能的数据库设计。

评论功能最主要的是发表评论和回复评论(删除功能在后台)。评论功能的拓展功能体现有以下几方面:
(1)单篇文章的评论数量和信息展示;
(2)从时间维度,按照时间倒叙的方式展示动态的用户评论信息;
(3)不同栏目,不同模块,不同时间维度的评论排行展示;
(4)精华评论的单独推荐和聚合展示;
(5)评论后直接分享到绑定的第三方平台;
(6)点赞数、回复数等维度的排行等。

评论的后台管理:
(1)删除;
(2)推荐;
(3)精华;
(4)屏蔽,敏感关键字的库的完善、自动屏蔽或者替换功能。

本篇文章主要分析几种客户端评论数据表的设计。

2、数据表设计

2.1 一问一答模式

(1)需求分析

大部分APP采用简单的评论设计即可,即是一问一答模式,比如微信朋友圈的评论功能的设计。如:

A:今天天气真好!
B @ A :今天天气确实不错!

这种设计简单、直接,也满足了用户评论、回复的基本要求,对于没有大量用户评论的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来找到对应的路径。

闭包表在查询时非常方便,但是插入的性能稍差,因为除了插入评论表以外,还需要把该条评论所有的父子关系插入到父子关系表中。 插入性能会随着评论层级的加深而线性下降。

3、数据库优化

如果你的系统每天都会拥有成千上万条评论,那么单表的设计肯定是不行,优化的方式有以下几种思路。

(1)分库分表。 分库分表是最为常用也最有效的优化方式,建议按照主题来分库分表。 这样同一个主题下面的评论就会落到同一张表里,避免了跨表查询。

(2)适当的数据冗余。 如果你需要显示评论人的相关信息,那么在插入评论时就把这些信息写入评论表中,避免多次查询。 实际上,如果是纪录数据,都可以冗余对应的数据信息,因为它们的数据的实时行和一致性要求并不高。

(3)附加幂。数据只允许单项操作。 因为从幂性的要求来说,每个赞全都是一条记录。 评论的赞数如果都从点赞表中统计得出,那么性能开销会十分巨大,而且点赞如此轻量级的一个操作一定会加剧点赞表的竞争操作。 所以建议直接在评论表中添加一个like_count的计数器,该字段只增不减。客户端,可以设置取消效果。

(4)热门评论加缓存。 类似于网易新闻的热门评论,读取频度非常高,可以专门开接口做缓存。

  • 157
    点赞
  • 580
    收藏
    觉得还不错? 一键收藏
  • 376
    评论
第一章 需求分析 1.1 BBS的功能与应用需求 1.1.1论坛的功能 论坛是Internet上的一种电子信息服务系统。它提供一块公共电子白板,每个用户都 可以在上面书写,可发布信息或提出看法。它是一种交互性强,内容丰富而即使的电子 信息服务系统。用户在论坛站点上可以获得各种信息服务、发布信息、进行讨论、聊天 等等。像日常生活中的黑板报一样,论坛按不同的主题分为许多版块,版面的设立依据 是大多数拥护的要求和喜好,用户可以阅读别人关于某个主题的看法,也可以将自己的 想法毫无保留地帖到论坛中。 随着计算机网络技术的不断发展,论坛的功能越来越强大,目前论坛的主要功能有以 下几点: (1) 供用户自我选择阅读若干感兴趣的专业组和讨论组内的信息。 (2) 可随意检查是否有新消息发布并选择阅读。 (3) 用户可在站点内发布消息或文章供他人查阅。 (4) 用户可就站点内其他人的消息或文章进行评论。 (5) 同一站点内的用户互通电子邮件, 设定好友名单 1.1.2应用需求 现实生活中的交流存在时间和空间上的局限性,交流人群范围的狭小,以及间断的交 流,不能保证信息的准确性和可取性。因此,用户需要通过网上论坛也就是论坛的交流 扩大交流面,同时可以从多方面获得自己的及时需求。同时信息时代迫切要求信息传播 速度加快,局部范围的信息交流只会减缓前进的步伐。论坛系统的开发能为分散于五湖 四海的人提供一个共同交流、学习、倾吐心声的平台,实现来自不同地方用户的极强的 信息互动性,用户在获得自己所需要的信息的同时也可以广交朋友拓展自己的视野和扩 大自己的社交面。 1.3数据字典 BBS论坛系统的数据流程图如下 说明: ——访问信息, ——用户信息, ——发帖子信息, 更新帖子信息, 搜索信息 ——获取帖子信息, 回复信息, 搜索用户, 更新用户信息, 获取用户资料 图2.6 数据流程图 概念结构设计 2.2实体E-R图 2.2.1用户E-R图 2.2.2主贴E-R图 2.2.3版块E-R图 2.2.4回帖E-R图 2.3实体总体E-R图 逻辑设计 数据模式 根据论坛的功能与应用需求的简要介绍,可以得出设计论坛系统所要的基本实体有BBSU ser(用户)、BBSSection(版块)、BBSTopic(主贴)、BBSReply(回复贴)。论坛又称BBS。 1-3-1  BBSUsers 用户信息 "中列名 "数据类型 "可否为空 "说明 " "UID "Int "not null(主键) "用户编号 " "UName "char "not null "用户姓名 " "UPassword "char "not null "用户密码 " "UEmail "char "not null "用户Email " "UBirthday "datetime "not null "用户生日 " "USex "bit "not null "用户性别 " "UClass "Int "not null "用户等级 " "UStatement "varchar "not null "用户个人说明 " "URegDate "datetime "not null "用户注册时间 " "UState "tinyint "not null "用户状态 " "UPoint "in "not null "用户积分 " 1-3-2  BBSTopic主贴信息格 "中列名 "数据类型 "可否为空 "说明 " "TID "Int "not null(主键) "主帖编号 " "TSID "Int "not null "主帖版块编号 " "Tuid "Int "not null "主帖用户编号 " "TReplyCount "Int "not null "主帖回复次数 " "TEmotion "Char(10) "not null "主帖情 " "TTopic "Varchar "not null "主帖标题 " "TContents "Text "not null "主帖内容 " "TTime "Datetime "not null "发帖时间 " "TClickCount "Int "not null "主帖点击次数 " "TLastClickT "Datetime "not null "主帖最后点击时间" 1-3-3  BBSSection板块信息 "中列名 "数据类型 "可否为空 "说明 " "sid "Int "Not null(主键) "版块编号 " "SName "char "Not null "版块名称 " "SMasterID "Int "Not null "版主编号 " "SStatement "Varchar "Not null "版块说明 " "SClickCo
库存管理系统需求说明书 引言 编写目的 目的: 库存管理是一般工业、商业企业街道管理环节中重要的一环,需要对库存基本信息管理 ,对库存调配信息等进行完整的监控,这样才能更有效地利用库存。 说明书读者: 系统开发人员、系统检测人员、系统使用人员 同其他系统的联系: 财物管理系统 背景 系统名称:库存管理系统 项目任务提出者:货物运输公司 项目开发者:XXXXXX大学 XXXXXX学院 项目使用者:货物运输公司 任务概述 目标 企业的库存物资管理往往是很复杂、很繁琐的。由于所掌握的物资种类众多,订货、 管理、发放的渠道各有差异,各个企业之间的管理体制不尽相同,各类统计报繁多, 因此仓库的库存管理必须编制一套库存管理信息系统,实现计算机化操作,而且必须根 据企业的具体情况制定相应的方案。 一个完整的企业物资供应管理系统应包括采购计划管理,合同收托管理、仓库库存管 理、定额管理、统计管理、财务管理等模块。其中仓库的库存管理是整个物资供应管理 系统的核心。因此有必要开发一套独立的库存管理系统来提高企业工作效率,而所使用的 这套库存管理系统是企业生产经营管理活动中的核心,此系统必须可以用来控制合理的 库存费用、适时适量的库存数量,使企业生产活动效率最大化。 现在我国的企事业特别是中小型生产企业的库存管理水平还停留在纸介质的基础上, 这样的机制已经不能适应时代的发展,因为它浪费了许多人力和物力,在信息时代这种 传统的管理方法必然被计算机为基础的信息管理所取代。而购买大型通用库存管理系统 ,对中小型企业来说,又需要付出昂贵的代价,而且库存管理项目不一定完全符合企业 库存管理的要求。因此根据企业目前实际的库存管理情况开发一套库存管理系统是十分 必要的。 用户的特点 操作人员: 库存管理人员: 高级管理员——本科以上学历,物流管理经验,计算机相关专业 普通管理员——本科以上学历,物流管理经验 预期使用频度: 视货物流量频度而定 假定和约束 经费限制:暂定 开发期限:2007-12-27 ~ 2008-1-20 需求规定 对功能的规定 "编号 "功能名称 "输 入 信 息 " "001 "库存基本信息 "库存编号,库存名称,库存规格,类" " " "别,计量单位 " "002 "库存入库信息 "入库编号,入库库存编号,库存名称" " " ",规格型号,种类,单位,数量,单" " " "价,金额,入库时间,经办,保管人" " " ",仓库,备注 " "003 "库存出库信息 "出库编号,出库库存编号,库存类型" " " ",规格号,种类,单位,数量,单价" " " ",金额,出库时间,领用人,经办人" " " ",仓库,备注 " "004 "库存余额信息 "库存编号,库存名称,规格型号,种" " " "类,单位,数量,金额,仓库,备注" "005 "用户管理信息 "用户编号,用户密码,用户说明 " 数据库管理能力要求 预计数据库大小为:3G ~ 6G 故障处理要求 数据库备份策略:全数据库备份,增量数据备份,事物日志备份。 故障处理: 如发生硬盘故障,导致数据丢失,首先进行全数据库回复,然后增量数据恢复,最后进 行事物日志恢复。 需求分析 库存的入库、出库过程需要记录大量的信息,通常的手工管理难以应付这样大密度的数 据,经常会出现各种问题。库存管理系统通过对库存流通的过程以及相关数据进行有效 管理,使得库存的流动更加规范。 基本功能划分 1.航班货运管理: 涉及到的主要数据模型及关系模型: 库存基本信息(库存编号,库存名称,库存规格,类别,计量单位) 库存入库信息(入库编号,入库库存编号,库存名称,规格型号,种类,单位,数量 ,单价,金额,入库时间,经办,保管人,仓库,备注) 库存出库信息(出库编号,出库库存编号,库存名称,规格型号,种类,单位,数量 ,单价,金额,出库时间,领用人,经办人,仓库,备注) 库存余额信息(库存编号,库存名称,规格型号,种类,单位,数量,金额,仓库, 备注) ----------------------- 数据库设计实验——库存管理系统全文共3页,当前为第1页。 数据库设计实验——库存管理系统全文共3页,当前为第2页。 数据库设计实验——库存管理系统全文共3页,当前为第3页。
酒店管理系统是一个常见的数据库课程设计项目,它涉及到数据库设计、数据模型、触发器、前后端连接等多个方面。以下是一个简单的介绍: 1. 数据库设计:酒店管理系统的数据库设计是整个项目的基础。它包括定义、字段、主键、外键等。可以使用E-R图来示实体和关系,以及流程图和模块图来示系统的功能和模块。 2. 触发器:触发器是数据库中的一种特殊对象,它可以在特定的数据库操作(如插入、更新、删除)发生时自动执行一些操作。在酒店管理系统中,可以使用触发器来实现一些业务逻辑,例如在预订房间时自动更新房间的状态。 3. Python编程:在酒店管理系统中,可以使用Python编程语言来实现一些功能,例如与数据库的交互、数据处理、界面设计等。同时,还可以使用一些第三方库来简化开发过程,例如Django、Flask等。 4. 前后端连接:酒店管理系统通常包括一个前端界面和一个后端数据库。前端界面用于用户交互和数据展示,后端数据库用于存储和管理数据。可以使用Python的Web框架(如Django)来实现前后端的连接,通过HTTP请求和数据库交互来实现数据的增删改查。 总结起来,酒店管理系统是一个综合性的数据库课程设计项目,涉及到数据库设计、触发器、Python编程和前后端连接等多个方面。通过这个项目,你可以学到数据库设计的基本原理和方法,以及如何使用Python来实现一个完整的应用系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 376
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值