如何高效实现多用户通知系统而不造成数据库冗余

本文介绍一种基于关系型数据库的轻量级通知系统设计,通过分离"通知模板"与"用户状态"两张表,避免消息重复存储,支持全局广播、已读标记及高并发写入。 本文介绍一种基于关系型数据库的轻量级通知系统设计,通过分离"通知模板"与"用户状态"两张表,避免消息重复存储,支持全局广播、已读标记及高并发写入。在构建面向多用户的 Web 通知系统时,一个常见误区是为每位用户单独插入一条完整通知记录(如标题、内容、时间等),这不仅浪费存储空间,更会随用户量增长导致数据急剧膨胀、查询变慢、维护困难。正确的做法是采用"一对多"范式解耦:将通知内容本身抽象为独立实体,再通过关联表记录每个用户对该通知的交互状态。? 推荐数据库结构设计-- 1. notifications 表:仅存通知元数据(不重复)CREATE TABLE notifications ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_active TINYINT(1) DEFAULT 1 -- 支持后台下架旧通知);-- 2. user_notifications 表:记录用户-通知关系与状态CREATE TABLE user_notifications ( id BIGINT PRIMARY KEY AUTO_INCREMENT, notification_id INT NOT NULL, user_id INT NOT NULL, is_read TINYINT(1) DEFAULT 0, read_at DATETIME NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_user_notif (user_id, notification_id), -- 防止重复关联 FOREIGN KEY (notification_id) REFERENCES notifications(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE);? 关键设计说明: notifications 表每条记录代表一条逻辑通知(例如:"系统将于明日维护"),无论有多少用户接收,只存一次; user_notifications 表则为每个用户对每条通知生成一条状态记录,仅含外键、读取标记和时间戳,体积极小; UNIQUE KEY uk_user_notif 是核心约束,防止同一用户被重复关联同一条通知,保障数据一致性。? 后台发送通知的正确流程(PHP 示例)当管理员在后台发布一条新通知时,应执行 原子化两步操作: Mokker AI AI产品图添加背景

相关推荐
Java后端的Ai之路17 分钟前
Python进阶探索17 - Python中的深拷贝与浅拷贝
人工智能·python·ai·浅拷贝·深拷贝
oradh24 分钟前
Oracle Undo问题总结(ORA-600 [4xxx] 系列错误)
数据库·oracle
达梦数据27 分钟前
DMDRS辅助表生成规则与作用
数据库·oracle
‎ദ്ദിᵔ.˛.ᵔ₎37 分钟前
MySQL 表约束
数据库·mysql
Doris__HE38 分钟前
【元脑服务器NF5476G7-NF5476M7技术规格分享】
运维·服务器·网络·数据库·性能优化
西柚研究生1234561 小时前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
沧海一笑-dj2 小时前
【Python】Python学习笔记-初识 Python
python·python安装·python解释器
打工仔折腾 AI2 小时前
FastAPI 从本机到生产服务器:Nginx+Gunicorn+Uvicorn 完整部署实录
人工智能·后端·python·nginx·fastapi·gunicorn
hanchenxing2 小时前
AI 数据管道重构:从函数堆到链式管道的可读性实践
python
hhzz2 小时前
【OpenCV 入门到精通 10】视频分析与光流跟踪:背景减除与运动检测
人工智能·python·opencv·性能优化