8.1 KiB
8.1 KiB
🗄️ AI展示平台資料庫指南
📋 資料庫概述
AI展示平台使用 MySQL 作為主要資料庫,支援完整的競賽管理、用戶認證、評審系統和AI助手功能。
🔗 連接資訊
- 主機: mysql.theaken.com
- 埠號: 33306
- 資料庫: db_AI_Platform
- 用戶: AI_Platform
- 密碼: Aa123456
🏗️ 資料庫結構
📊 核心資料表 (18個)
1. 用戶管理
- users - 用戶基本資料
- user_favorites - 用戶收藏
- user_likes - 用戶按讚記錄
2. 競賽系統
- competitions - 競賽基本資料
- competition_participants - 競賽參與者
- competition_judges - 競賽評審分配
3. 團隊管理
- teams - 團隊基本資料
- team_members - 團隊成員
4. 作品管理
- apps - AI應用程式
- proposals - 提案作品
5. 評審系統
- judges - 評審基本資料
- judge_scores - 評審評分
6. 獎項系統
- awards - 獎項記錄
7. AI助手
- chat_sessions - 聊天會話
- chat_messages - 聊天訊息
- ai_assistant_configs - AI配置
8. 系統管理
- system_settings - 系統設定
- activity_logs - 活動日誌
🚀 快速開始
1. 環境設定
# 複製環境變數範例
cp env.example .env.local
# 編輯環境變數
nano .env.local
2. 安裝依賴
# 安裝新依賴
pnpm install
3. 建立資料庫
# 建立資料庫和資料表
pnpm run db:setup
4. 測試連接
# 測試資料庫連接
pnpm run db:test
📊 資料表詳細說明
users 表
CREATE TABLE users (
id VARCHAR(36) PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
avatar VARCHAR(500),
department VARCHAR(100) NOT NULL,
role ENUM('user', 'developer', 'admin') DEFAULT 'user',
join_date DATE NOT NULL,
total_likes INT DEFAULT 0,
total_views INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
用途: 儲存所有用戶資料 角色:
user
: 一般用戶 (瀏覽、投票)developer
: 開發者 (提交作品、參賽)admin
: 管理員 (系統管理、數據分析)
competitions 表
CREATE TABLE competitions (
id VARCHAR(36) PRIMARY KEY,
name VARCHAR(200) NOT NULL,
year INT NOT NULL,
month INT NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
status ENUM('upcoming', 'active', 'judging', 'completed') DEFAULT 'upcoming',
description TEXT,
type ENUM('individual', 'team', 'mixed', 'proposal') NOT NULL,
evaluation_focus TEXT,
max_team_size INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
競賽狀態流程: upcoming
→ active
→ judging
→ completed
競賽類型:
individual
: 個人賽team
: 團隊賽mixed
: 混合賽proposal
: 提案賽
judge_scores 表
CREATE TABLE judge_scores (
id VARCHAR(36) PRIMARY KEY,
judge_id VARCHAR(36) NOT NULL,
app_id VARCHAR(36),
proposal_id VARCHAR(36),
scores JSON NOT NULL,
comments TEXT,
submitted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
評分維度 (JSON格式):
{
"innovation": 8, // 創新性 (1-10)
"technical": 7, // 技術性 (1-10)
"usability": 9, // 實用性 (1-10)
"presentation": 8, // 展示效果 (1-10)
"impact": 7 // 影響力 (1-10)
}
🔍 查詢範例
1. 獲取用戶統計
SELECT
u.name,
u.department,
u.role,
COUNT(DISTINCT a.id) as total_apps,
COUNT(DISTINCT f.app_id) as total_favorites,
u.total_likes,
u.total_views
FROM users u
LEFT JOIN apps a ON u.id = a.creator_id
LEFT JOIN user_favorites f ON u.id = f.user_id
GROUP BY u.id;
2. 獲取競賽統計
SELECT
c.name,
c.status,
c.type,
COUNT(DISTINCT cp.user_id) as participant_count,
COUNT(DISTINCT cp.team_id) as team_count,
COUNT(DISTINCT cp.app_id) as app_count
FROM competitions c
LEFT JOIN competition_participants cp ON c.id = cp.competition_id
GROUP BY c.id;
3. 獲取應用排行榜
SELECT
a.name,
u.name as creator_name,
t.name as team_name,
a.likes_count,
a.views_count,
a.rating,
ROW_NUMBER() OVER (ORDER BY a.likes_count DESC) as popularity_rank
FROM apps a
LEFT JOIN users u ON a.creator_id = u.id
LEFT JOIN teams t ON a.team_id = t.id;
🛠️ 存儲過程
GetUserPermissions
CALL GetUserPermissions('user@example.com');
用途: 獲取用戶權限和基本資料
GetCompetitionStats
CALL GetCompetitionStats('comp-2025-01');
用途: 獲取競賽統計資料
CalculateAwardRankings
CALL CalculateAwardRankings('comp-2025-01');
用途: 計算獎項排名
👁️ 視圖 (Views)
user_statistics
顯示用戶統計資料,包含作品數、收藏數、按讚數等
competition_statistics
顯示競賽統計資料,包含參與者數、團隊數、作品數等
app_rankings
顯示應用排行榜,包含人氣排名和評分排名
🔧 觸發器 (Triggers)
update_user_total_likes
當用戶按讚時,自動更新用戶總按讚數
update_app_likes_count
當應用被按讚時,自動更新應用按讚數
update_user_total_views
當應用瀏覽數更新時,自動更新用戶總瀏覽數
📈 索引優化
主要索引
users.email
- 用戶郵箱查詢users.role
- 角色權限查詢competitions.status
- 競賽狀態查詢apps.likes_count
- 人氣排序apps.rating
- 評分排序
複合索引
competitions.year, competitions.month
- 時間範圍查詢competitions.start_date, competitions.end_date
- 日期範圍查詢
🔒 安全性
密碼加密
使用 bcrypt 進行密碼雜湊,鹽值輪數為 10
外鍵約束
所有關聯表都設定了適當的外鍵約束,確保資料完整性
唯一約束
- 用戶郵箱唯一
- 用戶每日按讚限制
- 評審對同一作品只能評分一次
📊 性能監控
查詢統計
-- 查看慢查詢
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
-- 查看連接數
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
資料表大小
SELECT
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'db_AI_Platform'
ORDER BY (data_length + index_length) DESC;
🚨 故障排除
常見問題
1. 連接失敗
# 檢查網路連接
ping mysql.theaken.com
# 檢查埠號
telnet mysql.theaken.com 33306
2. 權限錯誤
-- 檢查用戶權限
SHOW GRANTS FOR 'AI_Platform'@'%';
3. 資料表不存在
# 重新執行建立腳本
pnpm run db:setup
4. 密碼錯誤
# 檢查環境變數
echo $DB_PASSWORD
📝 維護指南
定期備份
# 建立備份
mysqldump -h mysql.theaken.com -P 33306 -u AI_Platform -p db_AI_Platform > backup_$(date +%Y%m%d).sql
資料清理
-- 清理過期的活動日誌 (保留30天)
DELETE FROM activity_logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 清理過期的聊天會話 (保留7天)
DELETE FROM chat_sessions WHERE updated_at < DATE_SUB(NOW(), INTERVAL 7 DAY);
性能優化
-- 分析資料表
ANALYZE TABLE users, competitions, apps;
-- 優化資料表
OPTIMIZE TABLE users, competitions, apps;
🔄 版本更新
新增欄位
-- 範例:為 users 表新增欄位
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
修改欄位
-- 範例:修改欄位類型
ALTER TABLE users MODIFY COLUMN department VARCHAR(150);
新增索引
-- 範例:新增複合索引
CREATE INDEX idx_user_department_role ON users(department, role);
最後更新: 2025年1月
維護者: AI展示平台開發團隊