baoxiang/mysql/init
2025-12-16 18:06:50 +08:00
..
README.md 第一次提交哦啊 2025-12-16 18:06:50 +08:00

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 会自动按顺序执行所有脚本:

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 或需要手动初始化:

# 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 命令行:

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: 仅插入测试数据

如果表已存在,只想添加测试数据:

mysql -u root -p treasure_box_game < 03-sample-data.sql

测试账户

执行 02-create-tables.sql03-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 - 获取用户交易历史
    CALL sp_get_user_transactions(1, 10, 0);
    -- 获取用户ID为1的交易记录limit 10offset 0
    

触发器

  1. tr_users_balance_update - 自动记录余额变化
    • 当用户余额更新时,自动记录到交易流水

常用查询

查看所有表

SHOW TABLES;

查看表结构

DESCRIBE users;

查看活跃宝箱

SELECT * FROM v_active_chests;

查看富豪榜

SELECT * FROM v_user_ranking LIMIT 10;

查看用户交易历史

SELECT * FROM transactions WHERE user_id = 1 ORDER BY created_at DESC LIMIT 20;

查看宝箱下注详情

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 中配置:

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: 外键约束错误

解决方案: 确保按正确顺序执行脚本,或暂时禁用外键检查:

SET FOREIGN_KEY_CHECKS = 0;
-- 执行脚本
SET FOREIGN_KEY_CHECKS = 1;

问题 2: 字符集错误

解决方案: 确保数据库创建时指定了正确的字符集:

CREATE DATABASE treasure_box_game
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

问题 3: 权限错误

解决方案: 确保使用 root 用户或有足够权限的用户执行脚本

备份和恢复

备份

mysqldump -u root -p treasure_box_game > backup.sql

恢复

mysql -u root -p treasure_box_game < backup.sql

联系信息

如有问题,请参考:

  • MYSQL_迁移指南.md - 完整迁移文档
  • QUICKSTART.md - 快速启动指南
  • 项目完成报告.md - 项目文档