blob: b7962247ef6727a16a0b899157718b94a351e8ad [file] [log] [blame]
223010690939f5f2025-06-09 14:00:43 +08001/*
2数据库设计说明:
31. 核心表结构:
4 users:存储用户信息,包含角色管理和账号状态
5 posts:核心内容表,支持多模态内容(图文/视频/文档)
6 behaviors:记录用户互动行为(点赞/收藏/浏览等)
7 comments:评论系统,支持多级回复
8 follows:用户社交关系
92. 推荐系统支持:
10 posts.heat 字段存储动态计算的热度值
11 behaviors 表记录用户行为用于协同过滤
12 user_tags 表构建用户兴趣画像
13 通过 post_tags 实现内容标签分类
143. 多模态内容处理:
15 posts.media_urls 使用 JSON 类型存储多个资源 URL
16 posts.type 区分不同类型的内容(图文/视频/文档)
174. 审核与安全:
18 audits 表记录内容审核历史
19 posts.status 管理内容生命周期状态
20 logs 表记录系统操作和访问日志
215. 性能优化:
22 为查询频繁字段添加索引(热度/行为类型/时间)
23 使用 JSON 类型存储灵活数据(通知内容/媒体资源)
24 通过 heat 字段预计算支持热门排序
256. 扩展性设计:
26 用户画像系统通过 user_tags 表实现
27 通知系统支持多种互动类型
28 行为表设计支持未来扩展新行为类型
29*/
30
31
32-- 创建数据库
33CREATE DATABASE IF NOT EXISTS redbook DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
34USE redbook;
35
36-- 用户表
37CREATE TABLE users (
38 id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
39 username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
40 password VARCHAR(255) NOT NULL COMMENT '加密密码',
41 email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
42 avatar VARCHAR(255) COMMENT '头像URL',
22301069a457d802025-06-14 21:10:54 +080043 role ENUM('superadmin', 'user', 'admin') DEFAULT 'user' COMMENT '角色',
223010690939f5f2025-06-09 14:00:43 +080044 bio VARCHAR(255) COMMENT '个人简介',
45 status ENUM('active', 'banned', 'muted') DEFAULT 'active' COMMENT '账号状态',
46 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
47 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
48) ENGINE=InnoDB COMMENT='用户表';
49
Raverafc93da2025-06-15 18:12:49 +080050-- 邮箱验证表
51CREATE TABLE email_verifications (
52 id INT AUTO_INCREMENT PRIMARY KEY COMMENT '验证ID',
53 email VARCHAR(100) NOT NULL COMMENT '邮箱地址',
54 code VARCHAR(255) NOT NULL COMMENT '验证码',
55 type ENUM('register', 'reset_password', 'email_change') NOT NULL COMMENT '验证类型',
56 user_id INT DEFAULT NULL COMMENT '用户ID(找回密码时使用)',
57 is_verified BOOLEAN DEFAULT FALSE COMMENT '是否已验证',
58 expires_at TIMESTAMP NOT NULL COMMENT '过期时间',
59 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
60 verified_at TIMESTAMP NULL DEFAULT NULL COMMENT '验证时间',
61 INDEX idx_email_code (email, code),
62 INDEX idx_email_type (email, type),
63 INDEX idx_expires_at (expires_at),
64 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
65) ENGINE=InnoDB COMMENT='邮箱验证表';
66
223010690939f5f2025-06-09 14:00:43 +080067-- 标签表
68CREATE TABLE tags (
69 id INT AUTO_INCREMENT PRIMARY KEY COMMENT '标签ID',
70 name VARCHAR(50) NOT NULL UNIQUE COMMENT '标签名称',
71 description VARCHAR(255) COMMENT '标签描述',
72 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
73) ENGINE=InnoDB COMMENT='内容标签表';
74
75-- 话题/超话表
76CREATE TABLE topics (
77 id INT AUTO_INCREMENT PRIMARY KEY COMMENT '话题ID',
78 name VARCHAR(100) NOT NULL UNIQUE COMMENT '话题名称',
79 description TEXT COMMENT '话题描述',
80 status ENUM('active', 'archived') DEFAULT 'active' COMMENT '状态',
81 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
82) ENGINE=InnoDB COMMENT='话题/超话表';
83
84-- 内容帖子表
85CREATE TABLE posts (
86 id INT AUTO_INCREMENT PRIMARY KEY COMMENT '帖子ID',
87 user_id INT NOT NULL COMMENT '作者ID',
88 topic_id INT COMMENT '所属话题ID',
89 type ENUM('text', 'image', 'video', 'document') DEFAULT 'text' COMMENT '内容类型',
90 title VARCHAR(255) NOT NULL COMMENT '标题',
91 content TEXT NOT NULL COMMENT '正文内容',
92 media_urls JSON COMMENT '媒体资源URL数组',
93 status ENUM('draft', 'pending', 'published', 'deleted', 'rejected') DEFAULT 'draft' COMMENT '状态',
94 heat INT DEFAULT 0 COMMENT '热度值',
95 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
96 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
97 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
98 FOREIGN KEY (topic_id) REFERENCES topics(id) ON DELETE SET NULL
99) ENGINE=InnoDB COMMENT='内容帖子表';
100
101-- 帖子标签关联表
102CREATE TABLE post_tags (
103 post_id INT NOT NULL COMMENT '帖子ID',
104 tag_id INT NOT NULL COMMENT '标签ID',
105 PRIMARY KEY (post_id, tag_id),
106 FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
107 FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
108) ENGINE=InnoDB COMMENT='帖子标签关联表';
109
110-- 用户行为表
111CREATE TABLE behaviors (
112 id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '行为ID',
113 user_id INT NOT NULL COMMENT '用户ID',
114 post_id INT NOT NULL COMMENT '帖子ID',
115 type ENUM('like', 'comment', 'favorite', 'view', 'share') NOT NULL COMMENT '行为类型',
116 value INT DEFAULT 1 COMMENT '行为值',
117 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '行为时间',
118 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
119 FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE
120) ENGINE=InnoDB COMMENT='用户行为记录表';
121
122-- 评论表
123CREATE TABLE comments (
124 id INT AUTO_INCREMENT PRIMARY KEY COMMENT '评论ID',
125 post_id INT NOT NULL COMMENT '帖子ID',
126 user_id INT NOT NULL COMMENT '用户ID',
127 parent_id INT DEFAULT NULL COMMENT '父评论ID',
128 content TEXT NOT NULL COMMENT '评论内容',
129 status ENUM('active', 'deleted') DEFAULT 'active' COMMENT '状态',
130 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
131 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
132 FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
133 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
134 FOREIGN KEY (parent_id) REFERENCES comments(id) ON DELETE CASCADE
135) ENGINE=InnoDB COMMENT='评论表';
136
137-- 用户关注关系表
138CREATE TABLE follows (
139 follower_id INT NOT NULL COMMENT '关注者ID',
140 followee_id INT NOT NULL COMMENT '被关注者ID',
141 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '关注时间',
142 PRIMARY KEY (follower_id, followee_id),
143 FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE,
144 FOREIGN KEY (followee_id) REFERENCES users(id) ON DELETE CASCADE
145) ENGINE=InnoDB COMMENT='用户关注关系表';
146
147-- 通知表
148CREATE TABLE notifications (
149 id INT AUTO_INCREMENT PRIMARY KEY COMMENT '通知ID',
150 user_id INT NOT NULL COMMENT '接收用户ID',
151 type ENUM('like', 'comment', 'follow', 'system', 'audit') NOT NULL COMMENT '通知类型',
152 content JSON NOT NULL COMMENT '通知内容',
153 is_read BOOLEAN DEFAULT FALSE COMMENT '是否已读',
154 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
155 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
156) ENGINE=InnoDB COMMENT='用户通知表';
157
158-- 审核记录表
159CREATE TABLE audits (
160 id INT AUTO_INCREMENT PRIMARY KEY COMMENT '审核ID',
161 post_id INT NOT NULL COMMENT '帖子ID',
162 admin_id INT NOT NULL COMMENT '管理员ID',
163 result ENUM('approved', 'rejected') NOT NULL COMMENT '审核结果',
164 reason VARCHAR(255) COMMENT '审核原因',
165 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '审核时间',
166 FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
167 FOREIGN KEY (admin_id) REFERENCES users(id) ON DELETE CASCADE
168) ENGINE=InnoDB COMMENT='内容审核记录表';
169
170-- 日志表
171CREATE TABLE logs (
172 id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID',
173 user_id INT DEFAULT NULL COMMENT '用户ID',
174 type ENUM('access', 'error', 'behavior', 'system') NOT NULL COMMENT '日志类型',
175 content TEXT NOT NULL COMMENT '日志内容',
176 ip VARCHAR(45) COMMENT 'IP地址',
177 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
178 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
179) ENGINE=InnoDB COMMENT='系统日志表';
180
181-- 用户兴趣标签表(用户画像)
182CREATE TABLE user_tags (
183 user_id INT NOT NULL COMMENT '用户ID',
184 tag_id INT NOT NULL COMMENT '标签ID',
185 weight FLOAT DEFAULT 1.0 COMMENT '兴趣权重',
186 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
187 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
188 PRIMARY KEY (user_id, tag_id),
189 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
190 FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
191) ENGINE=InnoDB COMMENT='用户兴趣标签表';
192
193-- 索引优化
194CREATE INDEX idx_posts_heat ON posts(heat);
195CREATE INDEX idx_behaviors_type ON behaviors(type);
196CREATE INDEX idx_notifications_read ON notifications(is_read);
197CREATE INDEX idx_logs_created ON logs(created_at);
198CREATE INDEX idx_comments_post ON comments(post_id);