请教一下,类似于微博评论的功能怎么做的,或者说表该怎么设计

1. 问题

目前我在做一个项目,他有4级的文章,然后其中二、三、四级的文章可以评论,然后评论可以有3级。表我已经设计好了,就是有些业务情况会很麻烦:比如删除一级文章的时候需要把一级文章下面的所有文章都删除以及所有的评论。

1).我的处理

文章表:id,parent_id(文章上级ID)
评论表:id,parent_id(评论上级ID),article_id(文章ID)
删除1级文章的时候我是把,一级下面的所有级的文章id都搜出来删除,然后又根据每一级文章iD把所有评论给搜出来删除(每一级评论都带了当前文章的ID的)。这样感觉有点不科学了,想请教下有没有什么合理的办法。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 20
ShiKi

添加冗余字段来处理呗

1年前 评论
Laravel_Panda (楼主) 1年前

表结构和你一样,我这边做法是按条件全部取出来,然后在函数里面进行递归整理好层级顺序

1年前 评论
Laravel_Panda (楼主) 1年前

分类表:id,parent_id(分类上级 ID),path(如:1,3,4,7 4或7是上级分类)

文章表:id,parent_id(文章上级 ID)

评论表:id,article_id(文章 ID)

评论详情表:id,评论表ID

分批删除

  1. 查询所有子分类 ID
  2. 根据分类id 分批次查询文章
  3. 根据获取2部的文章ID 查询评论及评论内容,并删除
  4. 返回删除文章,获取2部的文章ID对应文章
  5. 当评论,文章删除干净后, 删除对应分类

当然我建议加个 回收站功能, deleted_at, 也可以定时清理指定时间之前的内容,如1月之前的

1年前 评论
Laravel_Panda (楼主) 1年前

删除文章 就把文章的下级删除就行 评论不用管(没有文章了,也就没有查看对应评论的入口了)

1年前 评论
Laravel_Panda (楼主) 1年前

业务要求高 就用观察者 不高就用外键不就够了

1年前 评论

文章表

id parent_id (string)
1 0
2 1
3 1-2
4 1-2-3

评论表:

id article_id parent_id (string)
1 2 0
2 2 1
3 2 1-2
4 2 0
5 2 1-2
删除 id = 11 级文章及下级所有文章
Article::where('id', 1)->delete();
Article::where('id', 'like', '1%')->delete();
这样和 id = 1 的所有相关文章就删除了
删除这些文章下的评论就用观察者就行了
1年前 评论
Master-Huang 1年前
liziyu 1年前
Su (作者) 1年前
liziyu 1年前
陈先生

有没有可能加一个 level 的字段来表示是第几楼,再加一个pid 表示父级。全都查出来重新组装就好了。

1年前 评论

我的想法是代码逻辑里面删除当前层级,更多层级的工作交给任务队列,这样在保障了性能的情况下,用户体验也不会有太多损失

1年前 评论

添加一个 descendants json 字段, 存储所有子孙的id

1年前 评论

该冗余冗余, 不能总撞库, 一个请求能解决就一个。
楼上挺多说法, 直接一个 json 冗余出来我比较支持。
不过要实现对应的观察者, 在文章/评论出现更改时, 同步这个 json,或者同步到缓存里。

其他说法在 dba 和产品理解的角度更科学, 但是会显著增加代码成本,后期维护的理解成本, 没啥必要。 我们追求的是把产品先突突出来, 不是做科学家。

1年前 评论

关联模型,删除时laravel可以触发一个 Eloquent ORM 提供的 deleting 事件,可以删除关联的所有数据

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!