2025云栖大会,开启通往AGI的未来之旅 了解详情
写点什么

对评论系统设计的一点总结

  • 2019-09-22
  • 本文字数:1483 字

    阅读完需:约 5 分钟

对评论系统设计的一点总结

从我个人的理解,评论顾名思义,一般是由一个主题引发出来的一系列的讨论。

从现在的微博、百度贴吧、知乎等来看,评论系统一般来说可由多个小的部分组成,不同产品一般分别含有以下若干种小的功能,如评论主题、对评论进行回复、互评、点赞、举报、删除评论、查看两个人的会话列表。


本质上来看,如果把主题和每一条评论都抽象成一个节点,整个系统构成了一棵树,下面以微博为例做一次简单的模仿设计。



针对上图中的微博系统做一些形式化抽象与定义:


  • 主题是一个节点

  • 每一条评论是一个节点

  • 评论、主题的发布人信息、点赞信息等都认为是节点的属性

  • 直接对主题进行的评论叫直接评论

  • 在直接评论下面的评论叫子评论


显然会得到如下结论:


1.以主题节点为根可以构造一颗树


2.以直接评论为根节点可以构造一个子树,


3.所有子树和主题节点构成以主题节点为根的树。


抛开主题节点,对每个评论节点抽象,设计出如下的数据结构(c 代码表示节点中的属性):


typedef struct {  int id;  int replied_id; //被评论的id  int replied_root_id;//直接评论的ID,不是主题的id  char * content; //评论的内容  } CommentNode;
复制代码


现在根据这个简单的数据结构怎么实现互评、评论功能?仔细观察不难发现,构造规则其实很简单,如下:


如果节点为直接评论节点,replied_id,replied_root_id 直接置为 0


如果为子评论,则 replied_id 为被回复的评论 id, replied_root_id 为所在的直接评论 id


现实中经常有一条信息可能会由于种种原因会被删除。那我们是否是就真的要删除这个节点呢?


直接删除节点会引出其他一些问题。


首先,整个树形结构将被破坏,结构出现不完整。 其次,本节点为根节点的子树中其他节点将丢失父节点信息。


删评论的本质并不是删的这个节点,而是要清空这个节点的内容。直接的方式就是清空 content 字段的内容,并增加一个字段表示节点的状态。


如下所示设置一个 color 枚举字段,用于对节点着色,用以表示不同的节点的状态。达到了删评论的目的,同时保留了结构的完整性。


typedef enum{  GREEN, //表示节点正常  RED,//表示节点被删除}NodeColor;typedef struct {  int id;//所有的值 > 0  int replied_id; //被评论的id  int replied_root_id;//直接评论的ID,不是主题的id  char * content; //评论的内容  NodeColor color;} CommentNode;
复制代码


类似赞成数、反对数的等功能,在这个基础上额外的增加两个字段就简单的实现这个功能,但也会有一致性的问题存在其中,此处不再赘述。


对于会话列表这个功能应该怎么实现呢?会话列表从形态来看就是两个人直接互相回复的评论构成的对话流。在节点中增加发评论用户和被评论用户两个基础的用户信息比如 user_id 即可。


typedef enum{  GREEN, //表示节点正常  RED,//表示节点被删除}NodeColor;typedef struct {  int id;//所有的值 > 0  int replied_id; //被评论的id  int replied_root_id;//直接评论的ID,不是主题的id  char * content; //评论的内容  NodeColor color;//节点状态  int from_user_id; //回复人id  int to_user_id; //被回复的用户id} CommentNode;
复制代码


程序设计的关键在数据结构的设计,良好的数据结构设计往往能起到事半功倍的效果。在评论系统设计的过程中,每当需要增加一个新功能的时候,就去扩充一下数据结构,对应的功能就能得到扩充,修改成本不大,也保证了前向兼容。


以上就是在设计评论系统实现中的一点简单的个人总结。


作者介绍:


杨振振,技术保障部部,17 年 8 月加入链家。先后参与过热链计划、移动审批、圣诞大屏、邮箱代理等项目。


本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。


原文链接:


https://mp.weixin.qq.com/s/fSrWF4PFZkvky7rkeCf46w


2019-09-22 22:344513

评论

发布
暂无评论
发现更多内容

制造业专家黄培博士:沃丰科技ServiceGo 智能售后服务成就高绩效企业

科技怪咖

新定位人工智能+营销服务 沃丰科技入选国家级专精特新“小巨人”

科技怪咖

再谈回声消除测评丨Dev for Dev 专栏

声网

音频 Dev for Dev 实时互动

阿里云实时计算 Flink 版 x Hologres: 构建企业级一站式实时数仓

Apache Flink

大数据 flink 流计算 实时计算 实时数仓

开源一夏 | React对于生命周期的深入研究

恒山其若陋兮

开源 8月月更

客户案例|雅森帮携手观测云,保障海量在线用户服务体验

观测云

[JS入门到进阶] 哎,被vite小坑了一波,大家记得配置build.cssTarget为'chrome61'

HullQin

CSS JavaScript html 前端 8月月更

SMTP协议详解

工程师日月

8月月更

当满世界喧嚣“All in Web3”,但你可以慢慢来

One Block Community

区块链 程序员 开发者 就业 黑客马拉松

我是咖啡师,在软件公司上班|ONES 人物

万事ONES

夯实中国智能制造软实力沃丰科技ServiceGo让物流机器人龙头企业售后无忧

科技怪咖

Python 教程之数据分析(1)—— 使用 Bokeh 进行数据可视化

海拥(haiyong.site)

Python Bokeh 8月月更

EMQX + PolarDB-X 一站式 IoT 数据解决方案

阿里云数据库开源

数据库 阿里云 开源 :MySQL 数据库 PolarDB-X

页面切换转场动画,英雄救场更有趣!

岛上码农

flutter ios 前端 移动端开发 8月月更

J-Tech Talk | 编写Dockerfile的最佳实践

Jina AI

Docker J-Tech Talk

iOS端如何实现MobLink的场景还原功能

MobTech袤博科技

ios sdk moblink

开源一夏 |为什么线程池不允许使用Executors去创建?

六月的雨在InfoQ

开源 OOM Executors ThreadPoolExecutor 8月月更

区块链合约安全系列(四):如何认识及预防公链合约中的算术溢出攻击

BSN研习社

区块链 智能合约

如何进行企业数字化转型?数字化转型的3大核心规律

优秀

企业数字化转型

头脑风暴:二叉搜索树中的众数

HelloWorld杰少

算法 LeetCode 8月月更

如何快速地学习东西(上篇)

宇宙之一粟

学习 成长 8月月更

明势资本黄明明:创新与世界,下一代基础软件的中国突围之路

TDengine

数据库 tdengine 时序数据库

系统故障工程师居然可以不背锅?看看几家大厂是怎么做到的!(内附复盘模板)

TakinTalks稳定性社区

SRE 故障 定责

实时数仓Workshop · 广州站 9.15 邀您参加!

Apache Flink

大数据 flink 流计算 实时计算 实时数仓

每日一R「16」实践课之 kv-server(二)

Samson

学习笔记 8月月更 ​Rust

中国掀起数字化浪潮|沃丰科技AI外呼机器人助家电企业潜客筛选自动化

科技怪咖

对话HR专家崔晓燕 沃丰科技AI+HRSSC如何提升企业人效

科技怪咖

TDengine 的存储引擎升级之路

TDengine

数据库 tdengine 时序数据库

leetcode 205. Isomorphic Strings 同构字符串(简单)

okokabcd

LeetCode 算法与数据结构

StarRocks 与奥威软件完成产品兼容认证,共同打造数据驱动的智慧企业

StarRocks

数据库

索信达控股上半年成绩出炉:核心业务收入大幅增长75.3%

索信达控股

对评论系统设计的一点总结_文化 & 方法_杨振振_InfoQ精选文章