惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
有赞技术团队
有赞技术团队
Jina AI
Jina AI
H
Help Net Security
D
Docker
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
罗磊的独立博客
MyScale Blog
MyScale Blog
N
Netflix TechBlog - Medium
B
Blog RSS Feed
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
美团技术团队
M
MIT News - Artificial intelligence
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
Microsoft Security Blog
Microsoft Security Blog
IT之家
IT之家

Aimee's Blog

秒杀怎么防机器人:验证码之外的几道防线 防薅羊毛怎么做:号码风控、设备指纹与分层策略 接口限流怎么选:固定窗口、滑动窗口、令牌桶 批量打包下载怎么设计:流式 ZIP 与异步任务 图片处理怎么做:异步处理与 CDN 实时参数 大文件上传怎么设计:分片、断点续传、秒传 报表可重跑的设计:快照、水位线与幂等 UV 统计为什么有误差:精确计数与近似计数怎么选 大数据量导出怎么做:流式写入与异步任务 排行榜的两类需求,难度差了一个数量级 内容审核怎么选:先审后发,还是先发后审 实时热榜怎么设计:Redis ZSet 与热度分值 互关状态怎么保持同步:双向关系的维护与缓存失效 并发点赞的计数设计:原子操作与最终对账 定时消息任务触发了两次 消息量大,写扩散还是读扩散——接到这个需求先问清楚规模 同一条消息推送了三次 活动结束了,用户还在收短信 接到注销需求,先问两个问题 微服务与服务拆分:何时拆、怎么拆 异步与事件驱动架构:把协作从「打电话」改成「发消息」 高可用设计:怎么让系统尽量不宕机 可扩展性设计:怎么让系统加机器就能扛更多 缓存架构:多级缓存怎么搭 高并发三板斧:限流、熔断、降级 架构设计到底在设计什么 —— 从单体到微服务的演进 服务成本账:一个服务一个月烧多少钱 可观测性:线上出问题怎么查 API 设计:好接口长什么样 消息队列:为什么要 MQ,以及丢失、重复、顺序怎么破
删了父评论,子评论怎么处理——先想清楚用户看到的是什么
Aimee · 2026-08-05 · via Aimee's Blog

删了父评论,子评论怎么处理——先想清楚用户看到的是什么

产品来问:用户举报了一条评论,审核通过后要删除它,但这条评论下面有 12 条回复,删除父评论后,这 12 条回复怎么办?

这不只是个数据库问题,首先是个产品问题:用户看到的页面里,这 12 条回复还显示吗?

答案决定了技术方案。


三种策略,各有适用场景

策略一:级联删除

父评论删除,子评论一并删除。

用于:违规内容管理。父评论是违规内容,子评论通常是对违规内容的回应,留着没有意义,且可能传播违规上下文。

DELETE FROM comment WHERE id = ? OR parent_id = ?

或者用软删除,给父和所有子都打删除标记:

UPDATE comment SET deleted = 1 WHERE id = ? OR parent_id = ?

策略二:保留子评论,父评论显示"已删除"

父评论打删除标,展示时替换为"该评论已被删除"或"原评论不可见"。子评论正常显示,但显示上下文中父评论是占位符。

用于:用户自行删除评论,或温和审核(评论本身没有严重违规,只是被举报内容不妥)。子评论是独立的用户内容,不应受父评论影响。

// 展示时处理
if (comment.isDeleted()) {
    comment.setContent("该评论已删除");
    comment.setAuthorName(null);  // 不显示作者
}
// 子评论正常展示

策略三:查询时过滤父评论,子评论挂到更高层

实现最复杂,适合楼中楼结构(子评论不只一级)。父评论删除后,其子评论的展示位置上移一层,重新挂在祖父评论下。

普通业务场景用不到这个,过度复杂。


数据结构设计影响策略选择

评论表常见两种结构:

邻接表(存 parent_id):

CREATE TABLE comment (
    id        BIGINT PRIMARY KEY,
    post_id   BIGINT NOT NULL,
    parent_id BIGINT,   -- NULL 表示顶层评论
    content   TEXT,
    deleted   TINYINT DEFAULT 0
);

查询子评论:SELECT * FROM comment WHERE parent_id = ? 递归查所有后代需要多次查询,或用递归 CTE(MySQL 8.0+)。

闭包表(存所有祖先-后代关系):

CREATE TABLE comment_path (
    ancestor_id   BIGINT,
    descendant_id BIGINT
);

查所有后代:SELECT descendant_id FROM comment_path WHERE ancestor_id = ?

闭包表查询性能好,但删除时要同步维护路径表,实现稍复杂。二级评论场景邻接表够用,多级嵌套考虑闭包表。


审核删除 vs 用户自删

同一个删除操作,审核驱动和用户自行删除往往需要不同策略:

删除触发推荐策略
审核违规级联删除子评论
用户自行删除软删父评论,保留子评论
管理员删除业务决定,通常同审核

把删除类型记在删除操作的日志里,方便后续审计。