用户动态数据表应当如何设计才能实现更强大的拓展性?
11

最近在写一个社区类的项目,需要设计一张 用户动态 的数据表。遇到了一下几点问题

  1. 动态的类型复杂,且存在随着功能增加而增加动态类型的可能
  2. 动态对象间的层级复杂,例如某位用户回复了A文章下的B评论,那么层级既是 回复 => 评论 => 文章
  3. 由于动态对象的层级复杂造成的数据查询问题,无法批量查询
  4. 动态的取消,举个例子,例如 A 用户点赞了 B 文章,那么就会生成一条 A 用户点赞 B 文章的动态,如果这个时候 A 用户取消了对 B 文章的点赞,那么便要相应的删除刚才生成的动态

自己思索了一下,同时也参考了 @overtrue 同学的提问: 类似QQ空间的社交网站的用户动态的数据库应该怎么设计? ,目前大概的设计是这样子

// 动态表
{
  user_id, // 动态创建用户的 ID
  action, // 此动态的类型,例如 reply
  data,   // 动态的详情数据 
  created_at, // 动态的生成时间
  deleted_at, // 删除此动态的时间
}

其中的 data 字段为 JSON 格式,用于存储此动态需要的数据的详情。

如果 A 用户点赞了一篇文章,那么此时的 data 字段是这个样子:

[
  'article_id' => 1, // 文章的ID
  'author_id'  => 1, 文章作者的ID
]

如果 A 用户对一篇文章进行了评论,那么此时的 data 字段是这个样子:

[
  'comment_id' => 1, // 评论的ID
  'user_id'    => 1, // 评论用户的ID
  'article_id' => 1, // 文章的ID
  'author_id'  => 1, // 文章作者的ID
]

为了规范 data 内的数据格式,我定义了一个抽象类,所有的动态的 data 字段都交由此动态类型的 Machine 类来实现数据构造

<?php

namespace App\Machines;

abstract class Machine
{
    public abstract function make(array $params);
}

接下来考虑到动态的取消操作,我又另外定义了一张表,用以记录动态与模型数据之间的关系:

// 动态记录表
{
  'model', // 触发此动态的 Model,例如 App\Models\Article
  'model_id', // 触发此条动态的 Model ID
  'dynamic_id', // 此条动态的 ID
}

然后在会触发动态的 Model 中监听模型事件 deleted ,然后逆向查找删除掉上级动态。

但是这样做的缺点就是后期 data内的数据进行迁移时很困难,某些动态的生成也许并不依赖新增数据,以及数据的查询问题。

大家有更好的主意嘛?欢迎集思广益~

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2
Ken

触发此动态的 Modal . Modal 敲错了

10个月前

@Ken 已更正

10个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!