用户动态数据表应当如何设计才能实现更强大的拓展性?
最近在写一个社区类的项目,需要设计一张 用户动态 的数据表。遇到了一下几点问题
- 动态的类型复杂,且存在随着功能增加而增加动态类型的可能
- 动态对象间的层级复杂,例如某位用户回复了A文章下的B评论,那么层级既是 回复 => 评论 => 文章
- 由于动态对象的层级复杂造成的数据查询问题,无法批量查询
- 动态的取消,举个例子,例如 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
内的数据进行迁移时很困难,某些动态的生成也许并不依赖新增数据,以及数据的查询问题。
大家有更好的主意嘛?欢迎集思广益~
推荐文章: