背景
由于最近的公司的项目有涉及到类似的微信朋友圈的功能, 于是最近开始研究数据库层面的朋友圈的设计。
思考
- 订阅与发布
- 分享与朋友圈
- 评论
- 朋友圈的时间轴
开始
数据库设计
用户表 users
id
phone
email
password
关注表 subscriptions
id
user_id
subscriber_id
朋友圈 moments
id
user_id
content
images
sharing_id
分享 sharings
id
title
thumbnail
link
评论表 replies
id
user_id
moment_id
to_user
content
业务实现
- 朋友圈的时间轴
根据登录用户查询关注列表的 subscriber_id 的集合,根据集合使用 where in 查询朋友圈,根据发布时间排序取分页。
给订阅人数增加上线,避免 where in 数据量过大,微信的朋友上线为1000 - 朋友圈的发布
images 以 json 形式存储, {[id, path]},id 可以排序,最多是 9 张图片,图片不涉及到单独查询,所以可以用 json。 - 分享
朋友圈有分享也是朋友圈发布,但是要补充一部分数据:分享的标题、链接、缩略图。所以添加额外 sharings 表存储,评论就是朋友圈的 content 主题内容,sharing_id 就是分享具体内容。 - 评论
记录评论者,以及需要 @ 的人和具体内容部分。
效率考虑
- 使用 redis(或其他缓存) 做朋友圈时间轴的缓存,但要记住用户删除、发布朋友圈时的更新和删除
- 可以使用 LIST 和 HASH,LIST键:list:{$user_id} => [moment_id, ...],HASH键:hash:moment:{$id} => 朋友圈数据表一行数据
- 使用 redis 做关注表缓存
- 可以使用 LIST ,LIST 键:list:{$user_id} => [subscriber_id, ...]
- 使用 redis 做评论表缓存
- 可以使用 LIST 和 HASH;LIST 键:list:{$moment_id} => [reply_id, ...],HASH键:hash:reply:{$id} => 评论表一行数据