数据库存储树形结构数据:邻接列表模式实现评论回复功能

    xiaoxiao2022-06-30  107

    数据库存储树形结构数据

    前言开始评论的结构如下图邻接列表模式定义表设计连接查询的代码(Java)查询整合无序数据,放入树形结构中返回给前端的JSON数据 参考文档

    前言

    最近公司业务需要评论回复的功能,主要是模仿着百度贴吧类似的评论模块展示,我简单的分成评论表和回复表,刚开始设计的时候,我简单的以为评论下回复根据创建时间升序排序就好,后面发现这样排序有太大bug,不知道回复的到底是谁,一天下来算是白做了 后面在交流群里问了下,了解到像评论回复一般都是以树形结构存储的,感觉学习

    开始

    评论的结构如下图

    邻接列表模式

    定义

    根据节点之间的继承关系,显现的描述某一节点的父节点,从而建立二位的关系表。表的结构设计为{id,pid}:

    表设计

    本人设计的评论,回复表是隔离开的,因此,只有回复放入树形结构

    CREATE TABLE `reply` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID编号', `fromName` varchar(50) COLLATE utf8mb4_vietnamese_ci NOT NULL COMMENT '回复用户名', `fromId` int(11) NOT NULL COMMENT '回复用户ID', `fromImg` longtext COLLATE utf8mb4_vietnamese_ci COMMENT '回复用户头像', `commentId` int(11) NOT NULL COMMENT '评论ID', `date` int(11) NOT NULL COMMENT '回复时间,时间戳存储', `type` int(11) NOT NULL COMMENT '回复类型:回复评论,回复', `content` varchar(200) COLLATE utf8mb4_vietnamese_ci NOT NULL, `essay` int(11) NOT NULL COMMENT '文章Id', // toId就是定义中的pid `toId` int(11) DEFAULT '0' COMMENT '被回复的回复ID 如果为0 则回复的是根评论', `toName` varchar(50) COLLATE utf8mb4_vietnamese_ci DEFAULT NULL COMMENT '被回复的用户名', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_vietnamese_ci

    连接查询的代码(Java)

    查询
    // 查询评论下的所有回复 @Select("SELECT `id`,`fromName`,`fromId`,`fromImg`,`commentId`,`date`,`content`,`essay`,`toId`,`toName` " + "FROM `ezblock_reply`\n" + "WHERE `commentId` =#{commentId}") List<ReplyDTO> listReply(@Param("commentId") Integer commentId);
    整合无序数据,放入树形结构中
    private List<ReplyDTO> sortData(List<ReplyDTO> replys) { List<ReplyDTO> list = new ArrayList<>(); for (int i = 0; i < replys.size(); i++) { ReplyDTO dto1 = replys.get(i); List<ReplyDTO> children = new ArrayList<>(); for (int j = 0; j < replys.size(); j++) { ReplyDTO dto2 = replys.get(j); if (dto2.getToId().equals(0) ) { // toId = 0 回复的是根评论 continue; } if (dto1.getId().equals(dto2.getToId())) { children.add(dto2); } } dto1.setChildren(children); // 添加 toId 为空的评论,其他评论在父评论的 children 下 if (dto1.getToId().equals(0)) { list.add(dto1); } } return list; }
    返回给前端的JSON数据

    至于如何取出展示数据,那就是前端的事啦

    参考文档

    https://www.biaodianfu.com/adjacency-list.html https://juejin.im/post/5beea202e51d451f5b54cdc4#heading-3


    最新回复(0)