评论功能里数据库的设计

简介: 【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:看是否需要排序
目录
相关文章
|
11天前
|
存储 搜索推荐 数据库
软件系统【标签tag功能】的两种数据库设计
软件系统中的标签功能可采用两种数据库设计。方案一,文章和Tag各一表,Tag信息存储在文章表内(`tags`和`tagids`字段),优点是模型简单,但查询效率低且易引发数据冗余和一致性问题。方案二,增加Tagmap表,用于存储标签-文章映射,利于索引查询和数据更新,适用于高效率需求,但结构更复杂。
13 0
软件系统【标签tag功能】的两种数据库设计
|
12天前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
59 2
|
13天前
|
存储 安全 关系型数据库
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
|
14天前
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
16 0
|
14天前
|
存储 SQL 数据管理
基于阿里云数据库 SelectDB 版内核 Apache Doris 全新分区策略 Auto Partition 应用场景与功能详解
自动分区的出现进一步简化了复杂场景下的 DDL 和分区表的维护工作,许多用户已经使用该功能简化了工作流程,并且极大的便利了从其他数据库系统迁移到 Doris 的工作,自动分区已成为处理大规模数据和应对高并发场景的理想选择。
|
23天前
|
Prometheus 监控 关系型数据库
数据库实时监控功能
【6月更文挑战第9天】数据库实时监控功能
21 4
|
26天前
|
存储 监控 数据管理
数据库原理与应用——简答题练习(数据管理技术发展、数据库主要特征、数据模型、关系模型、实体性之间的关系、DBMS的功能、相关术语解释、数据库系统)
数据库原理与应用——简答题练习(数据管理技术发展、数据库主要特征、数据模型、关系模型、实体性之间的关系、DBMS的功能、相关术语解释、数据库系统)
34 0
|
2月前
|
SQL 关系型数据库 开发工具
Beekeeper Studio是一个多功能的数据库管理和开发工具
【5月更文挑战第19天】Beekeeper Studio是一个多功能的数据库管理和开发工具
62 5
|
2月前
|
存储 SQL 关系型数据库
关系型数据库强大的查询功能
【5月更文挑战第9天】关系型数据库强大的查询功能
35 3
|
2月前
|
数据管理 关系型数据库 MySQL
数据管理DMS产品使用合集之DMS可以接入其他平台的MySQL数据库,是否还支持无感知变更功能
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。