Files
ai-showcase-platform/database-tables-only.sql

442 lines
17 KiB
SQL

-- AI 展示平台資料庫表結構
-- 資料庫: MySQL
-- 主機: mysql.theaken.com
-- 端口: 33306
-- 資料庫名: db_AI_Platform
-- 用戶: AI_Platform
-- 密碼: Aa123456
-- 創建資料庫
CREATE DATABASE IF NOT EXISTS `db_AI_Platform`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE `db_AI_Platform`;
-- 1. 用戶表
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) NULL,
`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,
`is_active` BOOLEAN DEFAULT TRUE,
`last_login` TIMESTAMP NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_email` (`email`),
INDEX `idx_department` (`department`),
INDEX `idx_role` (`role`),
INDEX `idx_join_date` (`join_date`)
);
-- 2. 評審表
CREATE TABLE `judges` (
`id` VARCHAR(36) PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
`title` VARCHAR(100) NOT NULL,
`department` VARCHAR(100) NOT NULL,
`expertise` JSON NOT NULL,
`avatar` VARCHAR(500) NULL,
`is_active` BOOLEAN DEFAULT TRUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_department` (`department`),
INDEX `idx_is_active` (`is_active`)
);
-- 3. 團隊表
CREATE TABLE `teams` (
`id` VARCHAR(36) PRIMARY KEY,
`name` VARCHAR(200) NOT NULL,
`leader_id` VARCHAR(36) NOT NULL,
`department` VARCHAR(100) NOT NULL,
`contact_email` VARCHAR(255) NOT NULL,
`total_likes` INT DEFAULT 0,
`is_active` BOOLEAN DEFAULT TRUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (`leader_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
INDEX `idx_leader` (`leader_id`),
INDEX `idx_department` (`department`),
INDEX `idx_is_active` (`is_active`)
);
-- 4. 團隊成員表
CREATE TABLE `team_members` (
`id` VARCHAR(36) PRIMARY KEY,
`team_id` VARCHAR(36) NOT NULL,
`user_id` VARCHAR(36) NOT NULL,
`role` VARCHAR(50) NOT NULL DEFAULT 'member',
`joined_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_team_user` (`team_id`, `user_id`),
INDEX `idx_team` (`team_id`),
INDEX `idx_user` (`user_id`)
);
-- 5. 競賽表
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 NULL,
`is_active` BOOLEAN DEFAULT TRUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_year_month` (`year`, `month`),
INDEX `idx_status` (`status`),
INDEX `idx_type` (`type`),
INDEX `idx_dates` (`start_date`, `end_date`)
);
-- 6. 競賽評審關聯表
CREATE TABLE `competition_judges` (
`id` VARCHAR(36) PRIMARY KEY,
`competition_id` VARCHAR(36) NOT NULL,
`judge_id` VARCHAR(36) NOT NULL,
`assigned_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`competition_id`) REFERENCES `competitions`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`judge_id`) REFERENCES `judges`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_competition_judge` (`competition_id`, `judge_id`),
INDEX `idx_competition` (`competition_id`),
INDEX `idx_judge` (`judge_id`)
);
-- 7. 競賽規則表
CREATE TABLE `competition_rules` (
`id` VARCHAR(36) PRIMARY KEY,
`competition_id` VARCHAR(36) NOT NULL,
`name` VARCHAR(200) NOT NULL,
`description` TEXT,
`weight` DECIMAL(5,2) NOT NULL DEFAULT 0.00,
`order_index` INT DEFAULT 0,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`competition_id`) REFERENCES `competitions`(`id`) ON DELETE CASCADE,
INDEX `idx_competition` (`competition_id`),
INDEX `idx_order` (`order_index`)
);
-- 8. 競賽獎項類型表
CREATE TABLE `competition_award_types` (
`id` VARCHAR(36) PRIMARY KEY,
`competition_id` VARCHAR(36) NOT NULL,
`name` VARCHAR(200) NOT NULL,
`description` TEXT,
`icon` VARCHAR(50) NOT NULL,
`color` VARCHAR(20) NOT NULL,
`is_active` BOOLEAN DEFAULT TRUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`competition_id`) REFERENCES `competitions`(`id`) ON DELETE CASCADE,
INDEX `idx_competition` (`competition_id`),
INDEX `idx_is_active` (`is_active`)
);
-- 9. 應用表
CREATE TABLE `apps` (
`id` VARCHAR(36) PRIMARY KEY,
`name` VARCHAR(200) NOT NULL,
`description` TEXT,
`creator_id` VARCHAR(36) NOT NULL,
`team_id` VARCHAR(36) NULL,
`category` VARCHAR(100) NOT NULL,
`type` VARCHAR(100) NOT NULL,
`likes_count` INT DEFAULT 0,
`views_count` INT DEFAULT 0,
`rating` DECIMAL(3,2) DEFAULT 0.00,
`is_active` BOOLEAN DEFAULT TRUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (`creator_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON DELETE SET NULL,
INDEX `idx_creator` (`creator_id`),
INDEX `idx_team` (`team_id`),
INDEX `idx_category` (`category`),
INDEX `idx_type` (`type`),
INDEX `idx_likes` (`likes_count`),
INDEX `idx_views` (`views_count`)
);
-- 10. 提案表
CREATE TABLE `proposals` (
`id` VARCHAR(36) PRIMARY KEY,
`title` VARCHAR(300) NOT NULL,
`description` TEXT,
`problem_statement` TEXT NOT NULL,
`solution` TEXT NOT NULL,
`expected_impact` TEXT NOT NULL,
`team_id` VARCHAR(36) NOT NULL,
`attachments` JSON NULL,
`status` ENUM('draft', 'submitted', 'under_review', 'approved', 'rejected') DEFAULT 'draft',
`submitted_at` TIMESTAMP NULL,
`is_active` BOOLEAN DEFAULT TRUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON DELETE CASCADE,
INDEX `idx_team` (`team_id`),
INDEX `idx_status` (`status`),
INDEX `idx_submitted` (`submitted_at`)
);
-- 11. 競賽參與應用表
CREATE TABLE `competition_apps` (
`id` VARCHAR(36) PRIMARY KEY,
`competition_id` VARCHAR(36) NOT NULL,
`app_id` VARCHAR(36) NOT NULL,
`submitted_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`competition_id`) REFERENCES `competitions`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`app_id`) REFERENCES `apps`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_competition_app` (`competition_id`, `app_id`),
INDEX `idx_competition` (`competition_id`),
INDEX `idx_app` (`app_id`)
);
-- 12. 競賽參與團隊表
CREATE TABLE `competition_teams` (
`id` VARCHAR(36) PRIMARY KEY,
`competition_id` VARCHAR(36) NOT NULL,
`team_id` VARCHAR(36) NOT NULL,
`submitted_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`competition_id`) REFERENCES `competitions`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_competition_team` (`competition_id`, `team_id`),
INDEX `idx_competition` (`competition_id`),
INDEX `idx_team` (`team_id`)
);
-- 13. 競賽參與提案表
CREATE TABLE `competition_proposals` (
`id` VARCHAR(36) PRIMARY KEY,
`competition_id` VARCHAR(36) NOT NULL,
`proposal_id` VARCHAR(36) NOT NULL,
`submitted_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`competition_id`) REFERENCES `competitions`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`proposal_id`) REFERENCES `proposals`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_competition_proposal` (`competition_id`, `proposal_id`),
INDEX `idx_competition` (`competition_id`),
INDEX `idx_proposal` (`proposal_id`)
);
-- 14. 應用評分表
CREATE TABLE `app_judge_scores` (
`id` VARCHAR(36) PRIMARY KEY,
`judge_id` VARCHAR(36) NOT NULL,
`app_id` VARCHAR(36) NOT NULL,
`innovation_score` INT NOT NULL CHECK (`innovation_score` >= 1 AND `innovation_score` <= 10),
`technical_score` INT NOT NULL CHECK (`technical_score` >= 1 AND `technical_score` <= 10),
`usability_score` INT NOT NULL CHECK (`usability_score` >= 1 AND `usability_score` <= 10),
`presentation_score` INT NOT NULL CHECK (`presentation_score` >= 1 AND `presentation_score` <= 10),
`impact_score` INT NOT NULL CHECK (`impact_score` >= 1 AND `impact_score` <= 10),
`total_score` DECIMAL(5,2) NOT NULL,
`comments` TEXT,
`submitted_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`judge_id`) REFERENCES `judges`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`app_id`) REFERENCES `apps`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_judge_app` (`judge_id`, `app_id`),
INDEX `idx_judge` (`judge_id`),
INDEX `idx_app` (`app_id`),
INDEX `idx_total_score` (`total_score`)
);
-- 15. 提案評分表
CREATE TABLE `proposal_judge_scores` (
`id` VARCHAR(36) PRIMARY KEY,
`judge_id` VARCHAR(36) NOT NULL,
`proposal_id` VARCHAR(36) NOT NULL,
`problem_identification_score` INT NOT NULL CHECK (`problem_identification_score` >= 1 AND `problem_identification_score` <= 10),
`solution_feasibility_score` INT NOT NULL CHECK (`solution_feasibility_score` >= 1 AND `solution_feasibility_score` <= 10),
`innovation_score` INT NOT NULL CHECK (`innovation_score` >= 1 AND `innovation_score` <= 10),
`impact_score` INT NOT NULL CHECK (`impact_score` >= 1 AND `impact_score` <= 10),
`presentation_score` INT NOT NULL CHECK (`presentation_score` >= 1 AND `presentation_score` <= 10),
`total_score` DECIMAL(5,2) NOT NULL,
`comments` TEXT,
`submitted_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`judge_id`) REFERENCES `judges`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`proposal_id`) REFERENCES `proposals`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_judge_proposal` (`judge_id`, `proposal_id`),
INDEX `idx_judge` (`judge_id`),
INDEX `idx_proposal` (`proposal_id`),
INDEX `idx_total_score` (`total_score`)
);
-- 16. 獎項表
CREATE TABLE `awards` (
`id` VARCHAR(36) PRIMARY KEY,
`competition_id` VARCHAR(36) NOT NULL,
`app_id` VARCHAR(36) NULL,
`team_id` VARCHAR(36) NULL,
`proposal_id` VARCHAR(36) NULL,
`app_name` VARCHAR(200) NULL,
`team_name` VARCHAR(200) NULL,
`proposal_title` VARCHAR(300) NULL,
`creator` VARCHAR(100) NOT NULL,
`award_type` ENUM('gold', 'silver', 'bronze', 'popular', 'innovation', 'technical', 'custom') NOT NULL,
`award_name` VARCHAR(200) NOT NULL,
`score` DECIMAL(5,2) NOT NULL,
`year` INT NOT NULL,
`month` INT NOT NULL,
`icon` VARCHAR(50) NOT NULL,
`custom_award_type_id` VARCHAR(36) NULL,
`competition_type` ENUM('individual', 'team', 'proposal') NOT NULL,
`rank` INT DEFAULT 0,
`category` ENUM('innovation', 'technical', 'practical', 'popular', 'teamwork', 'solution', 'creativity') NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`competition_id`) REFERENCES `competitions`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`app_id`) REFERENCES `apps`(`id`) ON DELETE SET NULL,
FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON DELETE SET NULL,
FOREIGN KEY (`proposal_id`) REFERENCES `proposals`(`id`) ON DELETE SET NULL,
INDEX `idx_competition` (`competition_id`),
INDEX `idx_year_month` (`year`, `month`),
INDEX `idx_award_type` (`award_type`),
INDEX `idx_rank` (`rank`),
INDEX `idx_category` (`category`)
);
-- 17. 用戶收藏表
CREATE TABLE `user_favorites` (
`id` VARCHAR(36) PRIMARY KEY,
`user_id` VARCHAR(36) NOT NULL,
`app_id` VARCHAR(36) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`app_id`) REFERENCES `apps`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_user_app` (`user_id`, `app_id`),
INDEX `idx_user` (`user_id`),
INDEX `idx_app` (`app_id`)
);
-- 18. 用戶按讚表
CREATE TABLE `user_likes` (
`id` VARCHAR(36) PRIMARY KEY,
`user_id` VARCHAR(36) NOT NULL,
`app_id` VARCHAR(36) NOT NULL,
`liked_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`app_id`) REFERENCES `apps`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_user_app_date` (`user_id`, `app_id`, `liked_at`),
INDEX `idx_user` (`user_id`),
INDEX `idx_app` (`app_id`),
INDEX `idx_liked_at` (`liked_at`)
);
-- 19. 用戶瀏覽記錄表
CREATE TABLE `user_views` (
`id` VARCHAR(36) PRIMARY KEY,
`user_id` VARCHAR(36) NOT NULL,
`app_id` VARCHAR(36) NOT NULL,
`viewed_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`ip_address` VARCHAR(45) NULL,
`user_agent` TEXT NULL,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`app_id`) REFERENCES `apps`(`id`) ON DELETE CASCADE,
INDEX `idx_user` (`user_id`),
INDEX `idx_app` (`app_id`),
INDEX `idx_viewed_at` (`viewed_at`)
);
-- 20. 用戶評分表
CREATE TABLE `user_ratings` (
`id` VARCHAR(36) PRIMARY KEY,
`user_id` VARCHAR(36) NOT NULL,
`app_id` VARCHAR(36) NOT NULL,
`rating` DECIMAL(3,2) NOT NULL CHECK (`rating` >= 1.0 AND `rating` <= 5.0),
`comment` TEXT NULL,
`rated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`app_id`) REFERENCES `apps`(`id`) ON DELETE CASCADE,
UNIQUE KEY `unique_user_app_rating` (`user_id`, `app_id`),
INDEX `idx_user` (`user_id`),
INDEX `idx_app` (`app_id`),
INDEX `idx_rating` (`rating`)
);
-- 21. AI助手聊天會話表
CREATE TABLE `chat_sessions` (
`id` VARCHAR(36) PRIMARY KEY,
`user_id` VARCHAR(36) NOT NULL,
`session_name` VARCHAR(200) NULL,
`is_active` BOOLEAN DEFAULT TRUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
INDEX `idx_user` (`user_id`),
INDEX `idx_is_active` (`is_active`)
);
-- 22. AI助手聊天訊息表
CREATE TABLE `chat_messages` (
`id` VARCHAR(36) PRIMARY KEY,
`session_id` VARCHAR(36) NOT NULL,
`text` TEXT NOT NULL,
`sender` ENUM('user', 'bot') NOT NULL,
`quick_questions` JSON NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`session_id`) REFERENCES `chat_sessions`(`id`) ON DELETE CASCADE,
INDEX `idx_session` (`session_id`),
INDEX `idx_sender` (`sender`),
INDEX `idx_created_at` (`created_at`)
);
-- 23. AI助手配置表
CREATE TABLE `ai_assistant_configs` (
`id` VARCHAR(36) PRIMARY KEY,
`api_key` VARCHAR(255) NOT NULL,
`api_url` VARCHAR(500) NOT NULL,
`model` VARCHAR(100) NOT NULL,
`max_tokens` INT DEFAULT 200,
`temperature` DECIMAL(3,2) DEFAULT 0.70,
`system_prompt` TEXT NOT NULL,
`is_active` BOOLEAN DEFAULT TRUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_is_active` (`is_active`)
);
-- 24. 系統設定表
CREATE TABLE `system_settings` (
`id` VARCHAR(36) PRIMARY KEY,
`key` VARCHAR(100) UNIQUE NOT NULL,
`value` TEXT NOT NULL,
`description` TEXT,
`category` VARCHAR(50) DEFAULT 'general',
`is_public` BOOLEAN DEFAULT FALSE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_key` (`key`),
INDEX `idx_category` (`category`),
INDEX `idx_is_public` (`is_public`)
);
-- 25. 活動日誌表
CREATE TABLE `activity_logs` (
`id` VARCHAR(36) PRIMARY KEY,
`user_id` VARCHAR(36) NULL,
`action` VARCHAR(100) NOT NULL,
`resource_type` VARCHAR(50) NOT NULL,
`resource_id` VARCHAR(36) NULL,
`details` JSON NULL,
`ip_address` VARCHAR(45) NULL,
`user_agent` TEXT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE SET NULL,
INDEX `idx_user` (`user_id`),
INDEX `idx_action` (`action`),
INDEX `idx_resource` (`resource_type`, `resource_id`),
INDEX `idx_created_at` (`created_at`)
);
SELECT '資料庫表結構創建完成!' as message;