schema.sql 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. -- 创建数据库(如果不存在)
  2. CREATE DATABASE IF NOT EXISTS ai_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  3. -- 使用该数据库
  4. USE ai_system;
  5. -- 创建用户表(与后端模型 User 对应,包含基础登录信息 + 个人资料)
  6. CREATE TABLE IF NOT EXISTS users (
  7. id INT AUTO_INCREMENT PRIMARY KEY,
  8. username VARCHAR(80) NOT NULL UNIQUE,
  9. password_hash VARCHAR(255) NOT NULL,
  10. role VARCHAR(20) DEFAULT 'student',
  11. full_name VARCHAR(50) NULL,
  12. student_id VARCHAR(50) NULL,
  13. class_name VARCHAR(100) NULL,
  14. grade VARCHAR(20) NULL,
  15. email VARCHAR(120) NULL,
  16. phone VARCHAR(20) NULL,
  17. created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  19. -- 表:questions(与 Flask 模型 Question 对应,化学每日训练题库)
  20. CREATE TABLE IF NOT EXISTS questions (
  21. id INT AUTO_INCREMENT PRIMARY KEY,
  22. content TEXT NOT NULL,
  23. option_a VARCHAR(255) NOT NULL,
  24. option_b VARCHAR(255) NOT NULL,
  25. option_c VARCHAR(255) NOT NULL,
  26. option_d VARCHAR(255) NOT NULL,
  27. correct_option VARCHAR(1) NOT NULL,
  28. knowledge_point VARCHAR(100),
  29. difficulty INT DEFAULT 1,
  30. created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  31. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  32. -- 表:answer_records(与 Flask 模型 AnswerRecord 对应,答题记录)
  33. CREATE TABLE IF NOT EXISTS answer_records (
  34. id INT AUTO_INCREMENT PRIMARY KEY,
  35. user_id INT NOT NULL,
  36. question_id INT NOT NULL,
  37. selected_option VARCHAR(1) NOT NULL,
  38. is_correct TINYINT(1) DEFAULT 0,
  39. answered_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  40. CONSTRAINT fk_answer_records_user
  41. FOREIGN KEY (user_id) REFERENCES users(id)
  42. ON DELETE CASCADE,
  43. CONSTRAINT fk_answer_records_question
  44. FOREIGN KEY (question_id) REFERENCES questions(id)
  45. ON DELETE CASCADE
  46. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  47. -- 表:knowledge_points(与 Flask 模型 KnowledgePoint 对应,知识点实体)
  48. CREATE TABLE IF NOT EXISTS knowledge_points (
  49. id INT AUTO_INCREMENT PRIMARY KEY,
  50. name VARCHAR(100) NOT NULL UNIQUE,
  51. description TEXT,
  52. chapter VARCHAR(80),
  53. created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  54. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  55. -- 表:knowledge_relations(与 Flask 模型 KnowledgeRelation 对应,知识图谱三元组)
  56. CREATE TABLE IF NOT EXISTS knowledge_relations (
  57. id INT AUTO_INCREMENT PRIMARY KEY,
  58. subject VARCHAR(120) NOT NULL,
  59. predicate VARCHAR(80) NOT NULL,
  60. obj VARCHAR(120) NOT NULL,
  61. created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  62. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  63. -- 表:curriculum_topics(与 Flask 模型 CurriculumTopic 对应,课程主题)
  64. CREATE TABLE IF NOT EXISTS curriculum_topics (
  65. id INT AUTO_INCREMENT PRIMARY KEY,
  66. name VARCHAR(50) NOT NULL UNIQUE,
  67. phase VARCHAR(20) DEFAULT '初中',
  68. chapter VARCHAR(80),
  69. description TEXT
  70. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  71. -- 表:chemistry_question_bank(与 Flask 模型 ChemistryQuestionBank 对应,多题型题库)
  72. CREATE TABLE IF NOT EXISTS chemistry_question_bank (
  73. question_id INT AUTO_INCREMENT PRIMARY KEY,
  74. type ENUM('choice', 'equation', 'experiment', 'calculation', 'inference', 'diagram') NOT NULL,
  75. difficulty ENUM('easy', 'medium', 'hard') NOT NULL DEFAULT 'easy',
  76. topic VARCHAR(50),
  77. unit_no TINYINT NULL COMMENT '教材单元编号,如 1-12',
  78. knowledge_tags VARCHAR(255) NULL COMMENT '知识点标签,逗号分隔',
  79. content TEXT NOT NULL,
  80. answer_schema JSON NOT NULL COMMENT '题型结构化字段:choice 含 options{A..D} 与 correct;填空/实验等用 reference_answer 等,见 seed_data 与抽题脚本',
  81. analysis TEXT NULL COMMENT '题目解析(冗余列,便于直接检索/展示)',
  82. hint TEXT,
  83. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  84. CONSTRAINT fk_cqb_topic
  85. FOREIGN KEY (topic) REFERENCES curriculum_topics(name)
  86. ON DELETE SET NULL
  87. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  88. -- 表:chemistry_question_bank_test(测试题库,结构与 chemistry_question_bank 保持一致)
  89. CREATE TABLE IF NOT EXISTS chemistry_question_bank_test (
  90. question_id INT AUTO_INCREMENT PRIMARY KEY,
  91. type ENUM('choice', 'equation', 'experiment', 'calculation', 'inference', 'diagram') NOT NULL,
  92. difficulty ENUM('easy', 'medium', 'hard') NOT NULL DEFAULT 'easy',
  93. topic VARCHAR(50),
  94. unit_no TINYINT NULL COMMENT '教材单元编号,如 1-12',
  95. knowledge_tags VARCHAR(255) NULL COMMENT '知识点标签,逗号分隔',
  96. content TEXT NOT NULL,
  97. answer_schema JSON NOT NULL COMMENT '同 chemistry_question_bank.answer_schema',
  98. analysis TEXT NULL COMMENT '题目解析(冗余列,便于直接检索/展示)',
  99. hint TEXT,
  100. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  101. CONSTRAINT fk_cqb_test_topic
  102. FOREIGN KEY (topic) REFERENCES curriculum_topics(name)
  103. ON DELETE SET NULL
  104. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  105. -- 表:chemistry_question_knowledge_points(化学题库题目-知识点映射,结构参考 question_knowledge_points)
  106. CREATE TABLE IF NOT EXISTS chemistry_question_knowledge_points (
  107. id INT AUTO_INCREMENT PRIMARY KEY,
  108. question_id INT NOT NULL,
  109. knowledge_point_id INT NOT NULL,
  110. weight INT DEFAULT 1,
  111. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  112. CONSTRAINT fk_cqkp_question
  113. FOREIGN KEY (question_id) REFERENCES chemistry_question_bank(question_id)
  114. ON DELETE CASCADE,
  115. CONSTRAINT fk_cqkp_knowledge_point
  116. FOREIGN KEY (knowledge_point_id) REFERENCES knowledge_points(id)
  117. ON DELETE CASCADE
  118. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  119. -- 表:chemistry_question_knowledge_points_test(测试题库题目-知识点映射,结构与 chemistry_question_knowledge_points 一致)
  120. CREATE TABLE IF NOT EXISTS chemistry_question_knowledge_points_test (
  121. id INT AUTO_INCREMENT PRIMARY KEY,
  122. question_id INT NOT NULL,
  123. knowledge_point_id INT NOT NULL,
  124. weight INT DEFAULT 1,
  125. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  126. CONSTRAINT fk_cqkp_test_question
  127. FOREIGN KEY (question_id) REFERENCES chemistry_question_bank_test(question_id)
  128. ON DELETE CASCADE,
  129. CONSTRAINT fk_cqkp_test_knowledge_point
  130. FOREIGN KEY (knowledge_point_id) REFERENCES knowledge_points(id)
  131. ON DELETE CASCADE
  132. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  133. -- 表:qa_sessions(与 backend 模型 QASession 对应,答疑会话记录)
  134. CREATE TABLE IF NOT EXISTS qa_sessions (
  135. id INT AUTO_INCREMENT PRIMARY KEY,
  136. user_id INT NOT NULL,
  137. question TEXT NOT NULL,
  138. answer TEXT NULL,
  139. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  140. CONSTRAINT fk_qa_sessions_user
  141. FOREIGN KEY (user_id) REFERENCES users(id)
  142. ON DELETE CASCADE
  143. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  144. -- 表:student_profiles(与 backend 模型 StudentProfile 对应,学生学习档案)
  145. CREATE TABLE IF NOT EXISTS student_profiles (
  146. id INT AUTO_INCREMENT PRIMARY KEY,
  147. user_id INT NOT NULL,
  148. current_topic VARCHAR(80) NULL,
  149. learning_stage VARCHAR(50) NULL,
  150. total_study_time INT DEFAULT 0,
  151. total_questions_answered INT DEFAULT 0,
  152. last_active_at DATETIME NULL,
  153. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  154. CONSTRAINT fk_student_profiles_user
  155. FOREIGN KEY (user_id) REFERENCES users(id)
  156. ON DELETE CASCADE
  157. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  158. -- 表:student_knowledge_mastery(与 backend 模型 StudentKnowledgeMastery 对应,学生-知识点掌握度)
  159. CREATE TABLE IF NOT EXISTS student_knowledge_mastery (
  160. id INT AUTO_INCREMENT PRIMARY KEY,
  161. user_id INT NOT NULL,
  162. knowledge_point_id INT NOT NULL,
  163. mastery_score INT NOT NULL DEFAULT 0,
  164. correct_count INT DEFAULT 0,
  165. wrong_count INT DEFAULT 0,
  166. weakness_weight INT DEFAULT 0,
  167. last_practiced_at DATETIME NULL,
  168. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  169. UNIQUE KEY uk_user_kp (user_id, knowledge_point_id),
  170. CONSTRAINT fk_skm_user
  171. FOREIGN KEY (user_id) REFERENCES users(id)
  172. ON DELETE CASCADE,
  173. CONSTRAINT fk_skm_knowledge_point
  174. FOREIGN KEY (knowledge_point_id) REFERENCES knowledge_points(id)
  175. ON DELETE CASCADE
  176. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  177. -- 表:question_knowledge_points(与 backend 模型 QuestionKnowledgePoint 对应,题目-知识点映射)
  178. CREATE TABLE IF NOT EXISTS question_knowledge_points (
  179. id INT AUTO_INCREMENT PRIMARY KEY,
  180. question_id INT NOT NULL,
  181. knowledge_point_id INT NOT NULL,
  182. weight INT DEFAULT 1,
  183. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  184. CONSTRAINT fk_qkp_question
  185. FOREIGN KEY (question_id) REFERENCES questions(id)
  186. ON DELETE CASCADE,
  187. CONSTRAINT fk_qkp_knowledge_point
  188. FOREIGN KEY (knowledge_point_id) REFERENCES knowledge_points(id)
  189. ON DELETE CASCADE
  190. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  191. -- 表:daily_recommendations(与 backend 模型 DailyRecommendation 对应,每日一练推荐记录)
  192. CREATE TABLE IF NOT EXISTS daily_recommendations (
  193. id INT AUTO_INCREMENT PRIMARY KEY,
  194. user_id INT NOT NULL,
  195. question_id INT NOT NULL,
  196. recommend_date DATE NOT NULL,
  197. strategy VARCHAR(50) NULL,
  198. is_done INT DEFAULT 0,
  199. answer_record_id INT NULL,
  200. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  201. CONSTRAINT fk_dr_user
  202. FOREIGN KEY (user_id) REFERENCES users(id)
  203. ON DELETE CASCADE,
  204. CONSTRAINT fk_dr_question
  205. FOREIGN KEY (question_id) REFERENCES questions(id)
  206. ON DELETE CASCADE,
  207. CONSTRAINT fk_dr_answer_record
  208. FOREIGN KEY (answer_record_id) REFERENCES answer_records(id)
  209. ON DELETE SET NULL
  210. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  211. -- 表:wrong_questions(错题集:用户在某题答错的聚合记录)
  212. CREATE TABLE IF NOT EXISTS wrong_questions (
  213. id INT AUTO_INCREMENT PRIMARY KEY,
  214. user_id INT NOT NULL,
  215. question_id INT NOT NULL,
  216. wrong_count INT DEFAULT 0,
  217. last_wrong_at DATETIME NULL,
  218. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  219. UNIQUE KEY uk_user_wrong (user_id, question_id),
  220. CONSTRAINT fk_wq_user
  221. FOREIGN KEY (user_id) REFERENCES users(id)
  222. ON DELETE CASCADE,
  223. CONSTRAINT fk_wq_question
  224. FOREIGN KEY (question_id) REFERENCES questions(id)
  225. ON DELETE CASCADE
  226. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  227. -- 表:question_variants(错题变式题映射:base_question -> variant_question)
  228. CREATE TABLE IF NOT EXISTS question_variants (
  229. id INT AUTO_INCREMENT PRIMARY KEY,
  230. base_question_id INT NOT NULL,
  231. variant_question_id INT NOT NULL,
  232. knowledge_point_id INT NULL,
  233. weight INT DEFAULT 1,
  234. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  235. UNIQUE KEY uk_base_variant (base_question_id, variant_question_id),
  236. CONSTRAINT fk_qv_base_question
  237. FOREIGN KEY (base_question_id) REFERENCES questions(id)
  238. ON DELETE CASCADE,
  239. CONSTRAINT fk_qv_variant_question
  240. FOREIGN KEY (variant_question_id) REFERENCES questions(id)
  241. ON DELETE CASCADE,
  242. CONSTRAINT fk_qv_kp
  243. FOREIGN KEY (knowledge_point_id) REFERENCES knowledge_points(id)
  244. ON DELETE SET NULL
  245. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  246. -- ---------------------------------------------------------------------------
  247. -- 增量补丁:已有库若缺列则补齐(CREATE TABLE IF NOT EXISTS 不会改旧表结构)
  248. -- 可随 schema.sql 一并执行,重复执行安全
  249. -- ---------------------------------------------------------------------------
  250. DROP PROCEDURE IF EXISTS _patch_ai_system_schema;
  251. DELIMITER $$
  252. CREATE PROCEDURE _patch_ai_system_schema()
  253. BEGIN
  254. DECLARE n INT DEFAULT 0;
  255. SELECT COUNT(*) INTO n FROM information_schema.COLUMNS
  256. WHERE TABLE_SCHEMA = 'ai_system' AND TABLE_NAME = 'chemistry_question_bank' AND COLUMN_NAME = 'knowledge_tags';
  257. IF n = 0 THEN
  258. ALTER TABLE chemistry_question_bank
  259. ADD COLUMN knowledge_tags VARCHAR(255) NULL COMMENT '知识点标签,逗号分隔' AFTER unit_no;
  260. END IF;
  261. SELECT COUNT(*) INTO n FROM information_schema.COLUMNS
  262. WHERE TABLE_SCHEMA = 'ai_system' AND TABLE_NAME = 'chemistry_question_bank_test' AND COLUMN_NAME = 'knowledge_tags';
  263. IF n = 0 THEN
  264. ALTER TABLE chemistry_question_bank_test
  265. ADD COLUMN knowledge_tags VARCHAR(255) NULL COMMENT '知识点标签,逗号分隔' AFTER unit_no;
  266. END IF;
  267. SELECT COUNT(*) INTO n FROM information_schema.COLUMNS
  268. WHERE TABLE_SCHEMA = 'ai_system' AND TABLE_NAME = 'chemistry_question_bank' AND COLUMN_NAME = 'analysis';
  269. IF n = 0 THEN
  270. ALTER TABLE chemistry_question_bank
  271. ADD COLUMN analysis TEXT NULL COMMENT '题目解析(冗余列,便于直接检索/展示)' AFTER answer_schema;
  272. END IF;
  273. SELECT COUNT(*) INTO n FROM information_schema.COLUMNS
  274. WHERE TABLE_SCHEMA = 'ai_system' AND TABLE_NAME = 'chemistry_question_bank_test' AND COLUMN_NAME = 'analysis';
  275. IF n = 0 THEN
  276. ALTER TABLE chemistry_question_bank_test
  277. ADD COLUMN analysis TEXT NULL COMMENT '题目解析(冗余列,便于直接检索/展示)' AFTER answer_schema;
  278. END IF;
  279. END$$
  280. DELIMITER ;
  281. CALL _patch_ai_system_schema();
  282. DROP PROCEDURE IF EXISTS _patch_ai_system_schema;
  283. -- 初始化数据请运行(在项目根目录):
  284. -- python scripts/seed_data.py