Files
ai-showcase-platform/DATABASE_GUIDE.md

379 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🗄️ 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. 環境設定
```bash
# 複製環境變數範例
cp env.example .env.local
# 編輯環境變數
nano .env.local
```
### 2. 安裝依賴
```bash
# 安裝新依賴
pnpm install
```
### 3. 建立資料庫
```bash
# 建立資料庫和資料表
pnpm run db:setup
```
### 4. 測試連接
```bash
# 測試資料庫連接
pnpm run db:test
```
## 📊 資料表詳細說明
### users 表
```sql
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 表
```sql
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 表
```sql
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格式):
```json
{
"innovation": 8, // 創新性 (1-10)
"technical": 7, // 技術性 (1-10)
"usability": 9, // 實用性 (1-10)
"presentation": 8, // 展示效果 (1-10)
"impact": 7 // 影響力 (1-10)
}
```
## 🔍 查詢範例
### 1. 獲取用戶統計
```sql
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. 獲取競賽統計
```sql
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. 獲取應用排行榜
```sql
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
```sql
CALL GetUserPermissions('user@example.com');
```
**用途**: 獲取用戶權限和基本資料
### GetCompetitionStats
```sql
CALL GetCompetitionStats('comp-2025-01');
```
**用途**: 獲取競賽統計資料
### CalculateAwardRankings
```sql
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
### 外鍵約束
所有關聯表都設定了適當的外鍵約束,確保資料完整性
### 唯一約束
- 用戶郵箱唯一
- 用戶每日按讚限制
- 評審對同一作品只能評分一次
## 📊 性能監控
### 查詢統計
```sql
-- 查看慢查詢
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
-- 查看連接數
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
```
### 資料表大小
```sql
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. 連接失敗
```bash
# 檢查網路連接
ping mysql.theaken.com
# 檢查埠號
telnet mysql.theaken.com 33306
```
#### 2. 權限錯誤
```sql
-- 檢查用戶權限
SHOW GRANTS FOR 'AI_Platform'@'%';
```
#### 3. 資料表不存在
```bash
# 重新執行建立腳本
pnpm run db:setup
```
#### 4. 密碼錯誤
```bash
# 檢查環境變數
echo $DB_PASSWORD
```
## 📝 維護指南
### 定期備份
```bash
# 建立備份
mysqldump -h mysql.theaken.com -P 33306 -u AI_Platform -p db_AI_Platform > backup_$(date +%Y%m%d).sql
```
### 資料清理
```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);
```
### 性能優化
```sql
-- 分析資料表
ANALYZE TABLE users, competitions, apps;
-- 優化資料表
OPTIMIZE TABLE users, competitions, apps;
```
## 🔄 版本更新
### 新增欄位
```sql
-- 範例:為 users 表新增欄位
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
```
### 修改欄位
```sql
-- 範例:修改欄位類型
ALTER TABLE users MODIFY COLUMN department VARCHAR(150);
```
### 新增索引
```sql
-- 範例:新增複合索引
CREATE INDEX idx_user_department_role ON users(department, role);
```
---
**最後更新**: 2025年1月
**維護者**: AI展示平台開發團隊