关于用户关注粉丝表设计方案的思考

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 方案一方案二方案三


方案一



  • follow(关注关系表)
字段名 类型 索引 注解
id primaryKey()
user_id integer()->unsigned()->notNull() normal 用户
followed_user integer()->unsigned()->notNull() 关注的人的id
status smallInteger()->unsigned()->defaultValue(1) 关注状态:是否取消关注等
created_at integer()->unsigned()->notNull() normal
updated_at integer()->unsigned()->notNull() normal
用户每关注一个人,都会在表中添加一条数据

优点

1.设计简单,方便查询

2.可以区分关注的每一个人进行特殊处理(例如,不同人的关注事件,是否互粉,特别关注等),方便扩展

3.好写代码。

缺点

当用户量大时表数据量会非常庞大,因此必需要采用水平分表的方式将用户分散到多个表。

例如,有10万用户,ID为1~10000的用户放在表1(follow_1), ID为10001~20000的用户放在表2(follow_2), 以此类推。

然而分表后又会面临另一个问题,当被关注者依照多个表反查自己的粉丝时将会非常麻烦。因此需要再建一个粉丝表:

  • fans(粉丝表)
字段名 类型 索引 注解
id primaryKey()
user_id integer()->unsigned()->notNull() normal 用户
follower integer()->unsigned()->notNull() 粉丝
status smallInteger()->unsigned()->defaultValue(1) 关注状态:是否取消关注等
created_at integer()->unsigned()->notNull() normal
updated_at integer()->unsigned()->notNull() normal

此数据表依然需要做水平分表处理。


方案二



  • follow(关注关系表)
字段名 类型 索引 注解
id primaryKey()
user_id integer()->unsigned()->notNull() 唯一 用户
followed_user text 关注的人
follower text 粉丝
created_at integer()->unsigned()->notNull() normal
updated_at integer()->unsigned()->notNull() normal
以json格式记录每个用户关注的人和粉丝

优点

1.每个用户只有一条记录

2.方便查询

缺点

1.当粉丝数或关注的人数过大时,followed_user 和 follower 字段的数据长度会非常大,当用户关注的人或者粉丝数达到十万级别时,一条数据的数据量将会达到 兆 级别,将会极大地降低mysql的查询和php数据处理的效率。

2.每一次使用该表时都要将整条数据取出进行计算,对资源耗费太过严重。


方案三



使用redis的Hash数据类型

Redis hash是一个string类型的field和value的映射表。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

每个用户分一张hash表,表名为用户id(可加前缀或后缀)

用户每关注一个人,便在hash表中添加一条数据

field: 关注用户的id

value:关注时间

  • user_1
field value
2 1483423443
3 1483423445
13 1483423440
... ...
  • user_2
field value
1 1483423443
5 1483423445
10 1483423440
... ...

......

优点

1.查询处理速度快。

缺点

1.消耗服务器内存和CPU。最好使用一台单独的服务器来运行 Redis

2.数据查询,处理不如关系型数据库灵活。

3.开发步骤复杂,学习成本高。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
缓存 Java 关系型数据库
某人事系统架构搭建设计记录
某人事系统架构搭建设计记录
dapp预约抢单排单互助系统开发逻辑详细/功能说明/案例分析/方案规则/源码出售
Allow users to register accounts and verify their identities to ensure that the identities of participants are valid and authentic.
|
6月前
|
供应链 数据库 UED
商城如何设计订单系统超级有用
商城如何设计订单系统超级有用
244 0
|
6月前
|
新零售 搜索推荐
三三复制公排滑落商城系统开发|详情方案
不能向客户提供高品质的购物体验,不能让顾客感受商品和服务,不能降低物流成本
|
SQL 缓存 NoSQL
社交系统中用户好友关系数据库设计
社交系统中用户好友关系数据库设计
1245 0
|
数据库
朋友圈或者qq动态相关的数据库设计
朋友圈或者qq动态相关的数据库设计
344 0
|
SQL 消息中间件 存储
微博评论功能系统设计
微博评论功能是一种非常常见的社交媒体功能,设计好该功能需要考虑用户体验、安全性、性能和可扩展性等方面。在设计微博评论功能时,需要进行功能需求分析、数据库设计、后端API设计、前端设计、安全性设计、性能优化设计和可扩展性设计等方面的工作。通过以上设计方案的实现,可以实现一个功能完善、性能优良、安全可靠、可扩展的微博评论系统。
661 0
微博评论功能系统设计
|
存储 JavaScript 前端开发
(小说版)【简历优化平台-3】随机唯一标识,贯穿时间长河
(小说版)【简历优化平台-3】随机唯一标识,贯穿时间长河
《网上图书销售系统》功能需求 建立“顾客建立图书订单”的顺序图
《网上图书销售系统》功能需求 建立“顾客建立图书订单”的顺序图
171 0
|
存储 SQL 分布式计算
用户/帖子/好友/订单中心如何进行数据库水平切分
用户/帖子/好友/订单中心如何进行数据库水平切分