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

分享 Seaony ⋅ 于 7个月前 ⋅ 最后回复由 Seaony 7个月前 ⋅ 707 阅读

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

  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内的数据进行迁移时很困难,某些动态的生成也许并不依赖新增数据,以及数据的查询问题。

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

本文章首发在 Laravel China 社区
回复数量: 2
暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

Elasticsearch-PHP 中文文档

Lumen 中文文档

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档