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

简介: 方案一方案二方案三


方案一



  • 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中缓存半小时,同时定时任务是每隔5分钟执行一次,做持久化存储,这里的缓存时间和任务执行时间可根据项目情况而定。
3188 2
|
自然语言处理 前端开发 JavaScript
国际版抖音点赞系统开发【TikTok 点赞 APP 搭建教程】
国际版抖音点赞系统开发【TikTok 点赞 APP 搭建教程】
935 0
|
6月前
|
消息中间件 存储 缓存
如何设计10亿用户级的微博Feed流系统并应对100W QPS的挑战?
本文详解微博Feed流系统设计,涵盖Timeline与Rank模式、推拉结合机制及四层雪崩防护体系,分享应对百万QPS高并发的架构经验,助力构建高效、稳定的大规模社交系统。
|
11月前
|
存储 缓存 自然语言处理
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
326 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
|
消息中间件 Java Kafka
掌握Kafka事务,看这篇就够了
先赞后看,南哥助你Java进阶一大半Kafka事务实际上引入了原子多分区写入的概念,播客画了以下流程图,展示了事务在分区级别如何工作。我是南哥,一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。
554 3
掌握Kafka事务,看这篇就够了
|
人工智能 JSON 测试技术
Search-o1:人大清华联合推出动态检索推理框架,使模型能够在推理过程中动态检索外部知识
Search-o1 是中国人民大学和清华大学联合推出的创新框架,通过动态知识检索和精炼,提升大型推理模型在复杂任务中的推理能力。
632 23
Search-o1:人大清华联合推出动态检索推理框架,使模型能够在推理过程中动态检索外部知识
|
NoSQL Java 应用服务中间件
大厂面试必备:如何轻松实现分布式Session管理?
这篇文章介绍三种分布式Session的实现方案:基于JWT的Token、基于Tomcat的Redis和基于Spring的Redis。JWT方案通过生成Token存储用户信息,实现无状态、可扩展的会话管理,但可能增加请求负载且数据安全性较低。Tomcat与Redis结合,通过配置Tomcat和Redis,实现Session集中管理和高性能存储,但配置相对复杂。Spring整合Redis适用于SpringBoot和SpringCloud项目,集成方便,扩展性强,但同样依赖外部Redis服务。每种方法有其优缺点,适用场景不同。作者小米是一个技术爱好者,欢迎关注其微信公众号“软件求生”获取更多技术内容
975 4
|
JSON API 开发者
1688店铺所有商品API接口(1688API系列)
1688店铺所有商品API接口允许开发者通过输入店铺ID,获取指定店铺内的全部商品信息,包括名称、价格、库存、图片和销售数据等。该接口支持排序和分页参数,返回JSON格式数据,便于解析和应用。Python示例展示了如何使用requests库发送GET请求并处理响应,助力电商数据分析与业务拓展。
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
1602 0
|
关系型数据库 MySQL Java
天天使用MySQL,你知道MySQL数据库能抗多少压力吗?附(真实案例)
天天使用MySQL,你知道MySQL数据库能抗多少压力吗?附(真实案例)
2925 0