USE zhiyuantong; SET NAMES utf8mb4; -- 当前版本指针与快照记录分离:切换指针即可发布或回滚,历史快照保持不可变。 CREATE TABLE IF NOT EXISTS current_dataset_publications ( province_name VARCHAR(64) NOT NULL DEFAULT '' COMMENT '数据适用省份,空字符串表示全国数据', admission_year SMALLINT UNSIGNED NOT NULL COMMENT '数据所属招生年度', dataset_name VARCHAR(128) NOT NULL COMMENT '公开数据集业务名称', publication_id BIGINT UNSIGNED NOT NULL COMMENT '当前对外生效的发布版本ID', activated_by VARCHAR(128) NOT NULL COMMENT '切换当前版本的人员姓名或账号标识', activated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '当前版本生效时间', PRIMARY KEY (province_name, admission_year, dataset_name), UNIQUE KEY uk_current_dataset_publication_id (publication_id), CONSTRAINT fk_current_dataset_publication FOREIGN KEY (publication_id) REFERENCES dataset_publications(publication_id) ) ENGINE=InnoDB COMMENT='各省年度数据集当前公开版本指针'; CREATE TABLE IF NOT EXISTS public_province_exam_configs ( publication_id BIGINT UNSIGNED NOT NULL COMMENT '所属不可变发布版本', exam_config_id BIGINT UNSIGNED NOT NULL COMMENT '来源考试模式配置ID', province_name VARCHAR(64) NOT NULL COMMENT '省级行政区名称', exam_year SMALLINT UNSIGNED NOT NULL COMMENT '高考年份', exam_mode VARCHAR(32) NOT NULL COMMENT '考试模式稳定代码', total_score DECIMAL(7,2) NULL COMMENT '普通类高考总分,未逐省核验时为空', rank_basis VARCHAR(128) NULL COMMENT '一分一段或位次的主要分组口径', source_id BIGINT UNSIGNED NOT NULL COMMENT '核验考试模式所依据的来源ID', source_publisher VARCHAR(128) NOT NULL COMMENT '来源发布机构快照', source_title VARCHAR(255) NOT NULL COMMENT '来源标题快照', source_url VARCHAR(1024) NULL COMMENT '来源发布页地址快照', quality_grade VARCHAR(16) NOT NULL DEFAULT 'A' COMMENT '公开记录质量等级', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照生成时间', PRIMARY KEY (publication_id, exam_config_id), UNIQUE KEY uk_public_exam_config_scope (publication_id, province_name, exam_year), KEY idx_public_exam_config_lookup (province_name, exam_year, exam_mode), CONSTRAINT fk_public_exam_config_publication FOREIGN KEY (publication_id) REFERENCES dataset_publications(publication_id), CONSTRAINT fk_public_exam_config_source FOREIGN KEY (source_id) REFERENCES data_sources(source_id) ) ENGINE=InnoDB COMMENT='带发布版本的省级考试模式公共查询快照'; CREATE TABLE IF NOT EXISTS public_school_profiles ( publication_id BIGINT UNSIGNED NOT NULL COMMENT '所属不可变发布版本', school_id CHAR(36) NOT NULL COMMENT '全国院校稳定UUID', moe_school_code CHAR(10) NULL COMMENT '教育部学校标识码快照', official_name VARCHAR(255) NOT NULL COMMENT '学校正式名称快照', province_name VARCHAR(64) NOT NULL COMMENT '学校所属省份快照', city_name VARCHAR(128) NOT NULL COMMENT '学校所在城市快照', authority_name VARCHAR(255) NOT NULL COMMENT '学校主管部门快照', education_level VARCHAR(32) NOT NULL COMMENT '办学层次快照', ownership_type VARCHAR(32) NOT NULL COMMENT '办学性质快照', school_status VARCHAR(32) NOT NULL COMMENT '学校状态快照', official_website VARCHAR(1024) NULL COMMENT '学校官网快照', admission_website VARCHAR(1024) NULL COMMENT '招生官网快照', source_id BIGINT UNSIGNED NOT NULL COMMENT '院校信息来源ID', source_title VARCHAR(255) NOT NULL COMMENT '来源标题快照', source_url VARCHAR(1024) NULL COMMENT '来源发布页地址快照', quality_grade VARCHAR(16) NOT NULL COMMENT '公开记录质量等级', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照生成时间', PRIMARY KEY (publication_id, school_id), KEY idx_public_school_lookup (publication_id, province_name, education_level, official_name), CONSTRAINT fk_public_school_publication FOREIGN KEY (publication_id) REFERENCES dataset_publications(publication_id), CONSTRAINT fk_public_school_source FOREIGN KEY (source_id) REFERENCES data_sources(source_id) ) ENGINE=InnoDB COMMENT='带发布版本的院校公共档案快照'; CREATE TABLE IF NOT EXISTS public_school_admission_stats ( publication_id BIGINT UNSIGNED NOT NULL COMMENT '所属不可变发布版本', cutoff_line_id BIGINT UNSIGNED NOT NULL COMMENT '来源投档线记录ID', province_name VARCHAR(64) NOT NULL COMMENT '招生省份', admission_year SMALLINT UNSIGNED NOT NULL COMMENT '招生年度', admission_category VARCHAR(32) NOT NULL COMMENT '招生类别', subject_category VARCHAR(64) NOT NULL COMMENT '科类或首选科目来源值', education_level VARCHAR(32) NOT NULL COMMENT '培养层次', batch_name VARCHAR(255) NOT NULL COMMENT '录取批次', segment_code VARCHAR(128) NOT NULL COMMENT '批次或段次代码', school_id CHAR(36) NOT NULL COMMENT '全国院校稳定UUID', school_name VARCHAR(255) NOT NULL COMMENT '院校名称快照', group_code VARCHAR(64) NOT NULL COMMENT '院校专业组代码', group_name VARCHAR(255) NOT NULL COMMENT '院校专业组名称', cutoff_score DECIMAL(7,2) NULL COMMENT '最低投档分', cutoff_rank INT UNSIGNED NULL COMMENT '最低投档位次', control_score DECIMAL(7,2) NULL COMMENT '省级控制分', score_diff DECIMAL(7,2) NULL COMMENT '线差', admit_count INT UNSIGNED NULL COMMENT '实际录取或投档人数', source_id BIGINT UNSIGNED NOT NULL COMMENT '来源ID', source_title VARCHAR(255) NOT NULL COMMENT '来源标题快照', source_url VARCHAR(1024) NULL COMMENT '来源发布页地址快照', quality_grade VARCHAR(16) NOT NULL COMMENT '公开记录质量等级', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照生成时间', PRIMARY KEY (publication_id, cutoff_line_id), KEY idx_public_school_admission_lookup ( publication_id, subject_category, education_level, cutoff_rank, cutoff_score ), KEY idx_public_school_admission_school (publication_id, school_id), CONSTRAINT fk_public_school_admission_publication FOREIGN KEY (publication_id) REFERENCES dataset_publications(publication_id), CONSTRAINT fk_public_school_admission_source FOREIGN KEY (source_id) REFERENCES data_sources(source_id) ) ENGINE=InnoDB COMMENT='带发布版本的院校或专业组投档统计快照'; CREATE TABLE IF NOT EXISTS public_major_admission_stats ( publication_id BIGINT UNSIGNED NOT NULL COMMENT '所属不可变发布版本', major_line_id BIGINT UNSIGNED NOT NULL COMMENT '来源专业录取记录ID', province_name VARCHAR(64) NOT NULL COMMENT '招生省份', admission_year SMALLINT UNSIGNED NOT NULL COMMENT '招生年度', admission_category VARCHAR(32) NOT NULL COMMENT '招生类别', subject_category VARCHAR(64) NOT NULL COMMENT '科类或首选科目来源值', education_level VARCHAR(32) NOT NULL COMMENT '培养层次', batch_name VARCHAR(255) NOT NULL COMMENT '录取批次', school_id CHAR(36) NOT NULL COMMENT '全国院校稳定UUID', school_name VARCHAR(255) NOT NULL COMMENT '院校名称快照', group_code VARCHAR(64) NOT NULL COMMENT '院校专业组代码', major_code VARCHAR(64) NOT NULL COMMENT '来源专业代码', major_name VARCHAR(255) NOT NULL COMMENT '来源专业或专业类名称', subject_requirements VARCHAR(255) NULL COMMENT '选科要求原文', min_score DECIMAL(7,2) NULL COMMENT '专业录取最低分', min_rank INT UNSIGNED NULL COMMENT '专业录取最低位次', max_score DECIMAL(7,2) NULL COMMENT '专业录取最高分', avg_score DECIMAL(7,2) NULL COMMENT '专业录取平均分', admit_count INT UNSIGNED NULL COMMENT '实际录取人数', source_id BIGINT UNSIGNED NOT NULL COMMENT '来源ID', source_title VARCHAR(255) NOT NULL COMMENT '来源标题快照', source_url VARCHAR(1024) NULL COMMENT '来源发布页地址快照', quality_grade VARCHAR(16) NOT NULL COMMENT '公开记录质量等级', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照生成时间', PRIMARY KEY (publication_id, major_line_id), KEY idx_public_major_admission_lookup ( publication_id, subject_category, education_level, min_rank, min_score ), KEY idx_public_major_admission_school (publication_id, school_id, major_name), CONSTRAINT fk_public_major_admission_publication FOREIGN KEY (publication_id) REFERENCES dataset_publications(publication_id), CONSTRAINT fk_public_major_admission_source FOREIGN KEY (source_id) REFERENCES data_sources(source_id) ) ENGINE=InnoDB COMMENT='带发布版本的专业录取统计快照'; CREATE TABLE IF NOT EXISTS public_score_rank_points ( publication_id BIGINT UNSIGNED NOT NULL COMMENT '所属不可变发布版本', score_rank_id BIGINT UNSIGNED NOT NULL COMMENT '来源一分一段记录ID', province_name VARCHAR(64) NOT NULL COMMENT '考试省份', admission_year SMALLINT UNSIGNED NOT NULL COMMENT '高考年度', admission_category VARCHAR(32) NOT NULL COMMENT '招生类别', subject_category VARCHAR(32) NOT NULL COMMENT '科类或首选科目来源值', score DECIMAL(7,2) NOT NULL COMMENT '高考分数或综合排序分', same_score_count INT UNSIGNED NOT NULL COMMENT '同分人数', cumulative_count INT UNSIGNED NOT NULL COMMENT '累计人数', rank_from INT UNSIGNED NOT NULL COMMENT '最佳位次', rank_to INT UNSIGNED NOT NULL COMMENT '最末位次', source_id BIGINT UNSIGNED NOT NULL COMMENT '来源ID', source_title VARCHAR(255) NOT NULL COMMENT '来源标题快照', source_url VARCHAR(1024) NULL COMMENT '来源发布页地址快照', quality_grade VARCHAR(16) NOT NULL COMMENT '公开记录质量等级', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照生成时间', PRIMARY KEY (publication_id, score_rank_id), UNIQUE KEY uk_public_score_rank_scope ( publication_id, admission_category, subject_category, score ), KEY idx_public_score_rank_lookup ( publication_id, admission_category, subject_category, score, rank_from, rank_to ), CONSTRAINT fk_public_score_rank_publication FOREIGN KEY (publication_id) REFERENCES dataset_publications(publication_id), CONSTRAINT fk_public_score_rank_source FOREIGN KEY (source_id) REFERENCES data_sources(source_id) ) ENGINE=InnoDB COMMENT='带发布版本的一分一段公共查询快照'; -- 下列来源用于核验“2025 年各省考试模式”。网页未在本库保存副本,sha256 -- 是本次人工核验记录(标题、规范网址和发布日期)的稳定指纹,而非网页文件摘要。 INSERT INTO data_sources ( source_type, publisher, title, landing_page_url, published_on, sha256, notes ) VALUES ('人工核验', '中华人民共和国教育部', '对十三届全国人大二次会议第5836号建议的答复', 'https://www.moe.gov.cn/jyb_xxgk/xxgk_jyta/jyta_xueshengsi/201911/t20191126_409732.html', '2019-11-26', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256), '教育部原文明确6个3+3省市及第三批8个3+1+2省市;网页原文由发布机构保管。'), ('人工核验', '中华人民共和国教育部', '教育部:全国29个省份已启动高考综合改革', 'https://www.moe.gov.cn/fbh/live/2022/54835/mtbd/202209/t20220915_661428.html', '2022-09-15', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256), '教育部发布会信息明确第四批7省区于2024年、第五批8省区于2025年落地新高考。'), ('人工核验', '新疆维吾尔自治区教育考试院', '新疆维吾尔自治区2025年普通高校招生工作规定', 'https://www.xjzk.gov.cn/c/2025-05-16/494130.shtml', '2025-05-16', SHA2('exam-mode-evidence:xinjiang:2025-admission-rules', 256), '2025年普通类仍按文史类、理工类组织排序与录取。'), ('人工核验', '西藏自治区人民政府', '西藏自治区2025年普通高考分数线出炉', 'https://www.xizang.gov.cn/xwzx_406/bmkx/202506/t20250626_486252.html', '2025-06-26', SHA2('exam-mode-evidence:xizang:2025-control-lines', 256), '自治区2025年普通生源控制线仍分别按文史类、理工类公布。') AS incoming ON DUPLICATE KEY UPDATE publisher=incoming.publisher, title=incoming.title, landing_page_url=incoming.landing_page_url, published_on=incoming.published_on, notes=incoming.notes; INSERT INTO province_exam_configs ( province_name, exam_year, exam_mode, total_score, rank_basis, verification_status, source_id ) SELECT seed.province_name, 2025, seed.exam_mode, NULL, seed.rank_basis, 'verified', source.source_id FROM ( SELECT '北京市' province_name, 'three_plus_three' exam_mode, '普通类不分文理,按选考组合统一排序' rank_basis, SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) source_sha UNION ALL SELECT '天津市', 'three_plus_three', '普通类不分文理,按选考组合统一排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '上海市', 'three_plus_three', '普通类不分文理,按选考组合统一排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '浙江省', 'three_plus_three', '普通类不分文理,按选考组合统一排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '山东省', 'three_plus_three', '普通类不分文理,按选考组合统一排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '海南省', 'three_plus_three', '普通类不分文理,按选考组合统一排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '河北省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '辽宁省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '江苏省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '福建省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '湖北省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '湖南省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '广东省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '重庆市', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2019-11-26:5836', 256) UNION ALL SELECT '吉林省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '黑龙江省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '安徽省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '江西省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '广西壮族自治区', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '贵州省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '甘肃省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '山西省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '内蒙古自治区', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '河南省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '四川省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '云南省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '陕西省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '青海省', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '宁夏回族自治区', 'three_plus_one_plus_two', '普通类按物理科目组合、历史科目组合分别排序', SHA2('exam-mode-evidence:moe:2022-09-15:29-provinces', 256) UNION ALL SELECT '新疆维吾尔自治区', 'traditional', '普通类按文史类、理工类分别排序', SHA2('exam-mode-evidence:xinjiang:2025-admission-rules', 256) UNION ALL SELECT '西藏自治区', 'traditional', '普通类按文史类、理工类分别排序', SHA2('exam-mode-evidence:xizang:2025-control-lines', 256) ) seed JOIN data_sources source ON source.sha256=seed.source_sha ON DUPLICATE KEY UPDATE exam_mode=VALUES(exam_mode), rank_basis=VALUES(rank_basis), verification_status='verified', source_id=VALUES(source_id); -- 考试模式是本迁移中逐省核验的数据,可直接生成首个公开版本;其他招录事实数据 -- 必须经审核和发布服务生成快照,迁移不会把待审核记录复制到公共表。 INSERT INTO dataset_publications ( province_name, admission_year, dataset_name, version_no, publication_status, source_record_count, published_record_count, quality_grade, validation_summary, published_by, published_at ) SELECT config.province_name, config.exam_year, 'province-exam-configs', '2025.exam-mode.v1', 'published', 1, 1, 'A', JSON_OBJECT('verifiedRecordCount', 1, 'sourceAttached', TRUE), 'system:migration-011', NOW() FROM province_exam_configs config WHERE config.exam_year=2025 AND config.verification_status='verified' ON DUPLICATE KEY UPDATE source_record_count=VALUES(source_record_count), published_record_count=VALUES(published_record_count), quality_grade=VALUES(quality_grade), validation_summary=VALUES(validation_summary); INSERT INTO public_province_exam_configs ( publication_id, exam_config_id, province_name, exam_year, exam_mode, total_score, rank_basis, source_id, source_publisher, source_title, source_url, quality_grade ) SELECT publication.publication_id, config.exam_config_id, config.province_name, config.exam_year, config.exam_mode, config.total_score, config.rank_basis, source.source_id, source.publisher, source.title, source.landing_page_url, 'A' FROM province_exam_configs config JOIN dataset_publications publication ON publication.province_name=config.province_name AND publication.admission_year=config.exam_year AND publication.dataset_name='province-exam-configs' AND publication.version_no='2025.exam-mode.v1' JOIN data_sources source ON source.source_id=config.source_id WHERE config.exam_year=2025 AND config.verification_status='verified' ON DUPLICATE KEY UPDATE publication_id=VALUES(publication_id); INSERT INTO current_dataset_publications ( province_name, admission_year, dataset_name, publication_id, activated_by, activated_at ) SELECT publication.province_name, publication.admission_year, publication.dataset_name, publication.publication_id, 'system:migration-011', NOW() FROM dataset_publications publication WHERE publication.admission_year=2025 AND publication.dataset_name='province-exam-configs' AND publication.version_no='2025.exam-mode.v1' AND publication.publication_status='published' ON DUPLICATE KEY UPDATE publication_id=VALUES(publication_id), activated_by=VALUES(activated_by), activated_at=VALUES(activated_at);