# 🗄️ 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展示平台開發團隊