0

0

mysql在在线直播系统中的用户和频道表设计

P粉602998670

P粉602998670

发布时间:2026-02-27 09:34:03

|

548人浏览过

|

来源于php中文网

原创

用户表应仅存身份认证和基础状态字段:id(bigint unsigned)、account_type、account_id、password_hash、status(tinyint)、created_at、updated_at;禁用头像、昵称等社交字段,避免后续分库分表时主键查询性能下降。

mysql在在线直播系统中的用户和频道表设计

用户表要存什么字段,别一上来就加头像和昵称

在线直播系统里,user 表核心是身份认证和基础状态,不是社交平台。很多团队早期把 avatarintroduction 全塞进去,结果后续做读写分离或分库分表时字段膨胀拖慢主键查询。

  • id 用 BIGINT UNSIGNED AUTO_INCREMENT(别用 UUID,索引碎片高,JOIN 慢)
  • 必须有 account_type(如 'phone''wechat_mini''guest'),区分登录来源,避免后期硬编码判断
  • status 建议用 tinyint:0=禁用,1=正常,2=待实名,别用字符串枚举——MySQL 8.0+ 虽支持 CHECK,但 ORM 层解析易出错
  • 密码字段叫 password_hash,不是 password;留空 salt 字段(bcrypt/scrypt 不需要单独存 salt)
  • 删掉 created_at 的 DEFAULT CURRENT_TIMESTAMP —— 如果用多机房部署,时钟不同步会导致主从延迟误判

频道表的 status 和 live_status 必须拆成两个字段

常见错误是只设一个 status 字段,用 0/1/2/3 表示“未开播/直播中/已下播/已封禁”,这会导致业务逻辑耦合严重:比如运营后台要查“所有可进入的频道”,得排除封禁 + 下播 + 未开播三种状态,SQL 写起来绕,缓存也难命中。

  • status:生命周期状态,只管“这个频道还能不能被创建/编辑/删除”,值域为 0=deleted1=active(软删除必备)
  • live_status:实时状态,只在直播服务推流时更新,值域为 0=idle1=live2=ending(正在断流中),用 Redis + MySQL 双写,不走事务
  • last_live_time 字段必须有,类型 DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00',用于排序“最近开播的频道”,避免每次查 live_log 表关联
  • 别给 channel 表加 cover_url —— 封面图属于媒体元数据,应独立成 media_asset 表,用 asset_type='cover' + ref_type='channel' + ref_id 关联

用户和频道的关系不能只靠外键硬连

直播系统里,“谁创建了频道”“谁正在播”“谁关注了频道”“谁被禁言”是四类完全不同的关系,强行塞进一张 user_channel_relation 表,加七八个 flag 字段,不出三个月就会出现“查某用户所有关注频道超时”的 case。

廊坊供求信息网
廊坊供求信息网

1:强大的用户管理面版2:分为无需注册的免费发布和VIP注册发布/管理两个系统功能3:注册简便,发布信息管理信息等都相当简单4:用户积分制度5:4 个非常实用的道具(在后台设置道具参数)标题变色道具 (改变标题颜色)信息置顶道具 (能使发布信息置顶,使用个数越多,位置越高)内容贴图道具 (可以发和信息相关的图片)通过验证道具 (可不通过管理员审核,直接发布)6:采用虚拟货币制度,可以在线购买虚拟货

下载
  • 创建关系走 channel.owner_id(NOT NULL,直接外键到 user.id),这是强一致性要求
  • 主播关系用独立表 channel_streamer:含 channel_iduser_idrole(1=主讲,2=助播)、joined_at,支持一个频道多个主播
  • 关注关系必须异步化:follow 表只存 follower_idfollowee_idcreated_at,查“我关注的频道”时走 SELECT c.* FROM follow f JOIN channel c ON f.followee_id = c.id WHERE f.follower_id = ? AND c.status = 1,别预聚合
  • 禁言等临时状态别进 MySQL —— 存 Redis Hash,key 为 channel:<channel_id>:ban_list</channel_id>,field 是 user_id,value 是 expire_ts,应用层判断是否过期

时间字段统一用 DATETIME(3),别信“用 INT 存秒级时间戳更省空间”

有些老架构师坚持用 INT UNSIGNED 存 Unix 时间戳,理由是“节省 4 字节”。但在直播场景下,你得频繁做 BETWEEN 查询、按小时统计、与 NOW() 对比,MySQL 对 INT 时间戳无法使用索引范围扫描(除非加函数索引),反而更慢。

  • 所有时间字段:created_at、updated_at、started_at、ended_at,全用 DATETIME(3)(毫秒精度,适配 WebRTC 日志对齐)
  • 建表时显式声明 DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),避免应用层拼 SQL 时漏传
  • 如果真要跨时区显示(比如主播在东京开播,观众在纽约看),不要在 DB 层转时区 —— 存 UTC,应用层按 timezone 字段(存在 user 表里)做格式化
  • 别给时间字段加索引就完事:对 channel 表,高频查询是 “status=1 AND live_status=1 ORDER BY last_live_time DESC LIMIT 20”,所以复合索引要建 INDEX idx_status_live_last (status, live_status, last_live_time)
CREATE TABLE `user` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `account_type` varchar(20) NOT NULL,
  `account_id` varchar(64) NOT NULL,
  `password_hash` varchar(255) DEFAULT NULL,
  `status` tinyint NOT NULL DEFAULT '1',
  `created_at` datetime(3) NOT NULL,
  `updated_at` datetime(3) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_account` (`account_type`,`account_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<p>CREATE TABLE <code>channel</code> (
<code>id</code> bigint unsigned NOT NULL AUTO_INCREMENT,
<code>owner_id</code> bigint unsigned NOT NULL,
<code>title</code> varchar(100) NOT NULL,
<code>status</code> tinyint NOT NULL DEFAULT '1',
<code>live_status</code> tinyint NOT NULL DEFAULT '0',
<code>last_live_time</code> datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
<code>created_at</code> datetime(3) NOT NULL,
<code>updated_at</code> datetime(3) NOT NULL,
PRIMARY KEY (<code>id</code>),
KEY <code>idx_status_live_last</code> (<code>status</code>,<code>live_status</code>,<code>last_live_time</code>),
CONSTRAINT <code>fk_channel_owner</code> FOREIGN KEY (<code>owner_id</code>) REFERENCES <code>user</code> (<code>id</code>) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;</p>

实际跑起来最常被忽略的,是 channel 表的 last_live_time 更新时机——它不能只在主播点击“结束直播”时才写,而要在流媒体服务器检测到推流中断(如 SRS 的 on_publish_done 回调)后,由消息队列触发异步更新。否则观众看到的“最近直播”列表会滞后几分钟。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1047

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

339

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

379

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1884

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

378

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1437

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

437

2024.04.29

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.4万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 837人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号