318 lines
7.3 KiB
Markdown
318 lines
7.3 KiB
Markdown
# MySQL 数据库初始化脚本
|
||
|
||
## 概述
|
||
|
||
本目录包含完整的 MySQL 数据库初始化脚本,用于初始化互动竞猜开宝箱系统的数据库。
|
||
|
||
## 文件说明
|
||
|
||
### 执行顺序
|
||
|
||
初始化脚本需要按以下顺序执行:
|
||
|
||
```
|
||
1. 00-quick-init.sql # 快速初始化(仅表结构)
|
||
2. 01-init-database.sql # 数据库配置
|
||
3. 02-create-tables.sql # 完整表结构(推荐)
|
||
4. 03-sample-data.sql # 示例测试数据
|
||
```
|
||
|
||
### 文件详情
|
||
|
||
#### 1. `00-quick-init.sql` - 快速初始化
|
||
- **用途**: 快速创建基本表结构,用于开发和测试
|
||
- **内容**: 4个核心表(users, transactions, chests, bets)
|
||
- **特点**: 无外键约束,无索引,初始化速度快
|
||
- **适用场景**: 快速原型开发、功能测试
|
||
|
||
#### 2. `01-init-database.sql` - 数据库配置
|
||
- **用途**: 数据库基础配置和用户授权
|
||
- **内容**:
|
||
- 设置时区为 UTC
|
||
- 创建应用用户 `treasure_box`
|
||
- 授权所有权限
|
||
- 设置字符集为 UTF8MB4
|
||
- **注意**: 此文件在 Docker 容器启动时自动执行
|
||
|
||
#### 3. `02-create-tables.sql` - 完整初始化(推荐)
|
||
- **用途**: 生产级完整数据库初始化
|
||
- **内容**:
|
||
- 4个核心表的完整结构
|
||
- 所有索引和外键约束
|
||
- 2个视图(活跃宝箱、用户排行)
|
||
- 1个存储过程(获取交易历史)
|
||
- 1个触发器(自动记录余额变化)
|
||
- 初始数据(1个管理员、1个主播、3个用户)
|
||
- **特点**: 包含完整的业务逻辑和优化
|
||
- **适用场景**: 生产环境、完整功能测试
|
||
|
||
#### 4. `03-sample-data.sql` - 示例数据
|
||
- **用途**: 插入丰富的测试数据
|
||
- **内容**:
|
||
- 1个管理员用户
|
||
- 3个主播用户
|
||
- 7个普通用户
|
||
- 多个已完成的宝箱
|
||
- 活跃宝箱
|
||
- 下注记录
|
||
- 交易流水
|
||
- **特点**: 覆盖各种业务场景
|
||
- **适用场景**: 功能演示、UI测试、数据分析
|
||
|
||
## 使用方法
|
||
|
||
### 方法 1: Docker 自动初始化(推荐)
|
||
|
||
Docker Compose 会自动按顺序执行所有脚本:
|
||
|
||
```bash
|
||
docker-compose up -d
|
||
```
|
||
|
||
脚本执行顺序:
|
||
1. MySQL 容器启动
|
||
2. 执行 `01-init-database.sql`
|
||
3. 后端服务启动
|
||
4. 执行 `02-create-tables.sql`
|
||
5. (可选)手动执行 `03-sample-data.sql`
|
||
|
||
### 方法 2: 手动执行 SQL
|
||
|
||
如果你使用本地 MySQL 或需要手动初始化:
|
||
|
||
```bash
|
||
# 1. 登录 MySQL
|
||
mysql -u root -p
|
||
|
||
# 2. 创建数据库
|
||
CREATE DATABASE treasure_box_game CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
USE treasure_box_game;
|
||
|
||
# 3. 执行初始化脚本
|
||
source /path/to/00-quick-init.sql;
|
||
source /path/to/02-create-tables.sql;
|
||
source /path/to/03-sample-data.sql;
|
||
```
|
||
|
||
或者直接使用 MySQL 命令行:
|
||
|
||
```bash
|
||
mysql -u root -p treasure_box_game < 00-quick-init.sql
|
||
mysql -u root -p treasure_box_game < 02-create-tables.sql
|
||
mysql -u root -p treasure_box_game < 03-sample-data.sql
|
||
```
|
||
|
||
### 方法 3: 仅插入测试数据
|
||
|
||
如果表已存在,只想添加测试数据:
|
||
|
||
```bash
|
||
mysql -u root -p treasure_box_game < 03-sample-data.sql
|
||
```
|
||
|
||
## 测试账户
|
||
|
||
执行 `02-create-tables.sql` 或 `03-sample-data.sql` 后创建的测试账户:
|
||
|
||
### 管理员账户
|
||
```
|
||
用户名: admin
|
||
邮箱: admin@treasurebox.com
|
||
密码: password123
|
||
角色: admin
|
||
余额: 1,000,000 喵币
|
||
```
|
||
|
||
### 主播账户
|
||
```
|
||
用户名: streamer_lisa
|
||
邮箱: lisa@treasurebox.com
|
||
密码: password123
|
||
角色: streamer
|
||
余额: 500,000 喵币
|
||
|
||
用户名: streamer_john
|
||
邮箱: john@treasurebox.com
|
||
密码: password123
|
||
角色: streamer
|
||
余额: 300,000 喵币
|
||
```
|
||
|
||
### 普通用户账户
|
||
```
|
||
用户名: user001
|
||
邮箱: user001@example.com
|
||
密码: password123
|
||
角色: user
|
||
余额: 100,000 喵币
|
||
|
||
用户名: rich_user
|
||
邮箱: rich@example.com
|
||
密码: password123
|
||
角色: user
|
||
余额: 1,000,000 喵币(富豪榜第一)
|
||
|
||
用户名: poor_user
|
||
邮箱: poor@example.com
|
||
密码: password123
|
||
角色: user
|
||
余额: 500 喵币(可领取低保)
|
||
```
|
||
|
||
## 数据库结构
|
||
|
||
### 表列表
|
||
|
||
1. **users** - 用户表
|
||
- 用户基本信息
|
||
- 角色(user/streamer/admin)
|
||
- 余额和版本号(乐观锁)
|
||
|
||
2. **transactions** - 交易流水表
|
||
- 所有资金变动记录
|
||
- 类型(下注、获胜、低保等)
|
||
- 关联ID和描述
|
||
|
||
3. **chests** - 宝箱表
|
||
- 宝箱信息(标题、选项)
|
||
- 状态(下注中、已封盘、已完成等)
|
||
- 奖池金额和下注次数
|
||
|
||
4. **bets** - 下注表
|
||
- 用户下注记录
|
||
- 选项和金额
|
||
- 状态和奖金
|
||
|
||
### 视图
|
||
|
||
1. **v_active_chests** - 活跃宝箱视图
|
||
- 显示所有可下注或已封盘的宝箱
|
||
- 包含主播信息
|
||
|
||
2. **v_user_ranking** - 用户排行视图
|
||
- 按余额排序
|
||
- 包含排名信息
|
||
|
||
### 存储过程
|
||
|
||
1. **sp_get_user_transactions** - 获取用户交易历史
|
||
```sql
|
||
CALL sp_get_user_transactions(1, 10, 0);
|
||
-- 获取用户ID为1的交易记录,limit 10,offset 0
|
||
```
|
||
|
||
### 触发器
|
||
|
||
1. **tr_users_balance_update** - 自动记录余额变化
|
||
- 当用户余额更新时,自动记录到交易流水
|
||
|
||
## 常用查询
|
||
|
||
### 查看所有表
|
||
```sql
|
||
SHOW TABLES;
|
||
```
|
||
|
||
### 查看表结构
|
||
```sql
|
||
DESCRIBE users;
|
||
```
|
||
|
||
### 查看活跃宝箱
|
||
```sql
|
||
SELECT * FROM v_active_chests;
|
||
```
|
||
|
||
### 查看富豪榜
|
||
```sql
|
||
SELECT * FROM v_user_ranking LIMIT 10;
|
||
```
|
||
|
||
### 查看用户交易历史
|
||
```sql
|
||
SELECT * FROM transactions WHERE user_id = 1 ORDER BY created_at DESC LIMIT 20;
|
||
```
|
||
|
||
### 查看宝箱下注详情
|
||
```sql
|
||
SELECT b.*, u.username
|
||
FROM bets b
|
||
JOIN users u ON b.user_id = u.id
|
||
WHERE b.chest_id = 1;
|
||
```
|
||
|
||
## 性能优化
|
||
|
||
### 索引
|
||
|
||
已创建的索引:
|
||
- 主键索引(自动)
|
||
- 用户名、邮箱唯一索引
|
||
- 外键索引(user_id, chest_id, streamer_id)
|
||
- 状态索引(status, role)
|
||
- 时间索引(created_at)
|
||
|
||
### 连接池配置
|
||
|
||
在 `backend/app/core/config.py` 中配置:
|
||
```python
|
||
DB_POOL_SIZE = 20 # 连接池大小
|
||
DB_MAX_OVERFLOW = 30 # 最大溢出连接
|
||
DB_POOL_TIMEOUT = 30 # 超时时间(秒)
|
||
DB_POOL_RECYCLE = 3600 # 连接回收时间(秒)
|
||
```
|
||
|
||
## 字符集和排序规则
|
||
|
||
- **字符集**: UTF8MB4(完整 Unicode 支持,包括 emoji)
|
||
- **排序规则**: utf8mb4_unicode_ci
|
||
- **时区**: UTC (+00:00)
|
||
|
||
## 注意事项
|
||
|
||
1. **执行顺序**: 必须按顺序执行脚本,否则可能出现依赖错误
|
||
2. **数据清理**: 如需重新初始化,先执行 `DROP TABLE IF EXISTS`
|
||
3. **外键约束**: 完整版脚本启用了外键约束,确保数据一致性
|
||
4. **密码哈希**: 所有示例密码已使用 bcrypt 加密
|
||
5. **字符集**: 必须使用 UTF8MB4,否则可能出现编码问题
|
||
|
||
## 故障排除
|
||
|
||
### 问题 1: 外键约束错误
|
||
**解决方案**: 确保按正确顺序执行脚本,或暂时禁用外键检查:
|
||
```sql
|
||
SET FOREIGN_KEY_CHECKS = 0;
|
||
-- 执行脚本
|
||
SET FOREIGN_KEY_CHECKS = 1;
|
||
```
|
||
|
||
### 问题 2: 字符集错误
|
||
**解决方案**: 确保数据库创建时指定了正确的字符集:
|
||
```sql
|
||
CREATE DATABASE treasure_box_game
|
||
CHARACTER SET utf8mb4
|
||
COLLATE utf8mb4_unicode_ci;
|
||
```
|
||
|
||
### 问题 3: 权限错误
|
||
**解决方案**: 确保使用 root 用户或有足够权限的用户执行脚本
|
||
|
||
## 备份和恢复
|
||
|
||
### 备份
|
||
```bash
|
||
mysqldump -u root -p treasure_box_game > backup.sql
|
||
```
|
||
|
||
### 恢复
|
||
```bash
|
||
mysql -u root -p treasure_box_game < backup.sql
|
||
```
|
||
|
||
## 联系信息
|
||
|
||
如有问题,请参考:
|
||
- `MYSQL_迁移指南.md` - 完整迁移文档
|
||
- `QUICKSTART.md` - 快速启动指南
|
||
- `项目完成报告.md` - 项目文档
|