评论功能里数据库的设计

简介: 【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月前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
210 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
26天前
|
SQL 测试技术 数据库
|
1月前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
37 8
|
5月前
|
SQL 数据库 微服务
微服务03,最简单的Demo,我们每个服务不能重复开发相同业务,微服务数据独立,不要访问其他微服务的数据库,微服务的特点之一是提供不能功能的数据库互相分割,微服务需要根据业务模块拆分,做到单一职责,
微服务03,最简单的Demo,我们每个服务不能重复开发相同业务,微服务数据独立,不要访问其他微服务的数据库,微服务的特点之一是提供不能功能的数据库互相分割,微服务需要根据业务模块拆分,做到单一职责,
|
1月前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
37 1
|
1月前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
26 0
|
3月前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
58 1
|
4月前
|
存储 关系型数据库 MySQL
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
本文介绍了一个基于Python Django框架开发的医院管理系统,该系统设计了管理员、用户和医生三个角色,具备多用户功能,并使用MySQL数据库进行数据存储和管理。
180 4
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
|
5月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之数据库处于只读状态,如何恢复其读写功能
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之数据库处于只读状态,如何恢复其读写功能
|
4月前
|
存储 安全 测试技术
【计算机三级数据库技术】第4章 数据库应用系统功能设计与实现--附思维导图
重点介绍了数据库应用系统(DBAS)的功能设计和实现。
49 1