评论功能里数据库的设计

简介: 【4月更文挑战第2天】本文探讨了评论系统的树形结构设计,提出了四种方法:邻接表、分段式path、Nested Set和Closure Table。针对评论业务功能,如加载评论页和查看回复,优先考虑邻接表和分段式path。采用邻接表思路,设计了评论表结构,包括Uid、Biz、BizID、RootID、PID、Content、索引和级联删除规则。同时提到了索引设计,如Uid、Biz+BizID、PID和Ctime/Utime,以优化查询性能。

回复评论的层级:

树形结构,资源 -> 一级评论 -> 二级评论 -> 三级评论

树形结构设计的几种思路

  1. 邻接表:有一个parent_id的列,指向父节点,值一般都是节点的主键。根节点的parent_id可以用NULL表示,也可以用非法值(比如-1表示)
  2. 分段式path:有一列维持根节点到当前节点的路径。比如path的值式a/b/c,那么根据路径的定义分别由两种解释,如果路径包含当前节点,当前节点就是c,父节点是b,根节点是a;如果路径不包含当前节点,c是当前节点的父节点。
  3. Nested Set:需要维持住两个额外的列nsleft和nsright,其中nsleft小于所有子节点的nsleft,nsright大于所有子节点的nsright,类似于二叉搜索树的概念,两个列的取值,也相当于是dfs的顺序
  4. Closure Table:用一张额外的表维护各个节点之间的关系,比如ancestor代表的是祖先节点,descendant表示后继节点。一个节点和后继节点会有一行数据,一个节点和祖先节点也会有一行数据,所以会产生大量的数据

评论的业务功能

  1. 加载某资源的第一页评论
  2. 加载某资源的第一页评论的直接评论,分批加载
  3. 查看某评论的更多评论

其中功能1是根据业务类型和业务id来查询,功能2-3都是查询某个节点的子节点。所以优先考虑思路1邻接表和思路2分段式path。思路2分段式path里,查询子节点是使用Like来查询的,性能较差。先考虑思路1邻接表的实现

根据思路1邻接表的写法,结合具体的业务,可以得到表结构设计如下:

  • Uid:表示发表评论的用户的唯一标识
  • Biz:表示该评论的业务场景,例如视频、评论、用户
  • BizID:表示评论的资源的唯一表示
  • RootID:根ID
  • PID:父评论的ID
  • ParentComment:外键约束,为了级联删除。指定外键使用的是PID,关联外键的字段是ID,OnDelete:CASCADE设置删除策略采用级联删除
type Comment struct {
   
    Id int64 `gorm:"autoIncrement,primaryKey"`
    Uid int64
    Biz     string `gorm:"index:biz_type_id"`
    BizID   int64  `gorm:"index:biz_type_id"`
    Content string
    RootID sql.NullInt64 `gorm:"column:root_id;index"`
    PID sql.NullInt64 `gorm:"column:pid;index"`
    ParentComment *Comment `gorm:"ForeignKey:PID;AssociationForeignKey:ID;constraint:OnDelete:CASCADE"`
    Ctime int64
    Utime int64
}

索引设计如下:

  • Uid:可选,比如如果需要查询某个用户发表过的所有评论,就需要该索引
  • Biz+BizID:解决查找某个资源的评论的场景
  • PID:为了查找子节点,某个评论下面的所有一级回复
  • Ctime/Utime:看是否需要排序
目录
相关文章
|
1天前
|
前端开发 关系型数据库 数据库
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
27 0
|
1天前
|
存储 安全 算法
【软件设计师备考 专题 】数据库的控制功能(并发控制、恢复、安全性、完整性)
【软件设计师备考 专题 】数据库的控制功能(并发控制、恢复、安全性、完整性)
60 0
|
1天前
|
数据管理 关系型数据库 MySQL
数据管理DMS产品使用合集之DMS可以接入其他平台的MySQL数据库,是否还支持无感知变更功能
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
1天前
|
存储 NoSQL 容灾
数据库非功能需求分析
本文探讨了业务研发在技术设计中如何满足非功能需求,重点关注数据库系统的角色。内容涵盖数据库的可用性、可靠性、性能、可修改性、安全性及成本。文章强调了根据业务场景选择合适的数据类型(如关系型、非关系型、内存型、图数据库和时间序列数据库)以及考虑数据容量和增长速度。对于性能需求,讨论了响应时间、吞吐量和并发处理能力。此外,还提到了升级路径、兼容性、备份方案和成本控制(硬件、软件和人力成本)在数据库管理中的重要性。
34 0
|
1天前
|
SQL 存储 安全
【软件设计师备考 专题 】数据库管理系统的功能和特征
【软件设计师备考 专题 】数据库管理系统的功能和特征
76 0
|
1天前
|
存储 SQL 数据挖掘
视图、触发器和存储过程:提升数据库功能
视图、触发器和存储过程:提升数据库功能
19 1
|
1天前
|
SQL 编解码 数据库
MyKtv点歌系统前台主要功能实现,内附数据库脚本,可以直接运行
MyKtv点歌系统前台主要功能实现,内附数据库脚本,可以直接运行
18 1
MyKtv点歌系统前台主要功能实现,内附数据库脚本,可以直接运行
|
1天前
|
Java 关系型数据库 MySQL
Java调用shell脚本实现数据库备份功能
本篇文章主要介绍怎样使用Java程序,执行服务器上的数据库备份Shell脚本进行MySQL数据库的备份功能。
|
1天前
|
SQL 存储 数据管理
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
36 1
|
1天前
|
存储 SQL NoSQL
云数据库提供了哪些优势和功能?
云数据库提供了哪些优势和功能?
59 0
http://www.vxiaotou.com