# art_school 数据结构适配调整清单 ## 1. 调整概览 本次根据 `docs/51dx_school.json` 的结构补齐学校详情字段,主要涉及 `art_school_detail` 表新增若干 JSONB/文本/数值字段,用于保存特色专业、就业报告、图片、学科评估、科研信息、满意度明细等。 ## 2. 需要新增/修改的表结构 ### 2.0 `art_school_detail` 已覆盖字段(无需新增) 以下字段在你当前的 `art_school_detail` 表中已经存在,可直接复用: `back_ground`、`is_public`、`master_proportion_rate`、`abroad_proportion_rate`、`has_regular`、`has_junior`、`has_master`、`is_double_high_plan`、`is_strong_plan`、`twsdl_rank`、`xyh_rank`、`wsl_rank`、`usdalu_rank`、`qsdalu_rank`、`employment_rate`、`satisfaction_rate`、`master_point`、`doctor_point`、`key_major_count`、`tags`、`univ_id` 等。 ### 2.1 `art_school_detail` 需要新增字段 用途:承载 51dx 学校详情中的结构化字段与长文本字段。 | 字段名 | 类型(建议) | 含义 | 来源字段 | 调整原因 | | --- | --- | --- | --- | --- | | `combined_score` | DECIMAL(10,2) | 综合评分 | `combinedScore` | 评分指标缺失 | | `overall_rank` | INT | 综合排名 | `rank` | 排名指标缺失 | | `env_satisfaction` | DECIMAL(10,2) | 环境满意度 | `envSatisfaction` | 满意度细分缺失 | | `env_vote` | INT | 环境满意度投票数 | `envVote` | 满意度细分缺失 | | `live_satisfaction` | DECIMAL(10,2) | 生活满意度 | `liveSatisfaction` | 满意度细分缺失 | | `live_vote` | INT | 生活满意度投票数 | `liveVote` | 满意度细分缺失 | | `combined_satisfaction` | DECIMAL(10,2) | 综合满意度(原始分) | `combinedSatisfaction` | 保留原始评分 | | `combined_vote` | INT | 综合满意度投票数 | `combinedVote` | 满意度细分缺失 | | `satisfaction_json` | JSONB | 满意度明细 JSON | `satisfactionJson` | 结构化明细未存储 | | `teachers` | LONGTEXT | 师资力量说明 | `teachers` | 文字说明缺失 | | `scholarship` | LONGTEXT | 奖学金说明 | `scholarship` | 文字说明缺失 | | `scholarship_json` | JSONB | 奖学金数组 JSON | `scholarshipArray` | 结构化说明缺失 | | `grant_desc` | LONGTEXT | 助学金说明 | `grant` | 文字说明缺失 | | `canteen` | LONGTEXT | 食堂说明 | `canteen` | 文字说明缺失 | | `dormitory` | LONGTEXT | 宿舍说明 | `dormitory` | 文字说明缺失 | | `master_explain` | TEXT | 硕士点说明 | `masterExplain` | 说明字段缺失 | | `doctor_explain` | TEXT | 博士点说明 | `doctorExplain` | 说明字段缺失 | | `special_major_json` | JSONB | 特色专业 JSON | `specialMajor` | 结构化内容缺失 | | `employment_report_json` | JSONB | 就业报告 JSON | `employmentReport` | 结构化内容缺失 | | `photo_json` | JSONB | 图片 JSON | `photoJson` | 结构化内容缺失 | | `accommodation_json` | JSONB | 建筑/配套 JSON | `accommodationArray` | 结构化内容缺失 | | `subject_reviews_json` | JSONB | 学科评估 JSON | `subjectReviews` | 结构化内容缺失 | | `research_json` | JSONB | 科研信息 JSON | `researchJson` | 结构化内容缺失 | | `univ_majors_json` | JSONB | 专业标签 JSON | `univMajors` | 结构化内容缺失 | | `univ_postgraduate_json` | JSONB | 保研信息 JSON | `univPostgraduateList` | 结构化内容缺失 | ### 2.2 关联关系调整 本次未新增关系。新增字段均挂在 `art_school_detail`,与 `art_school.school_id` 关系保持不变。 ## 3. 是否需要新增实体/表的评估 短期不必新增独立表,理由: 1. 51dx 的结构性字段(如 `specialMajor`、`employmentReport`、`subjectReviews`)主要用于展示,不涉及复杂查询与统计,存 JSON 字段可以满足当前需求。 2. 当前已有 `art_school_media`、`art_school_major_tag` 等表,但与 51dx 数据结构不完全匹配,新增映射成本高且收益有限。 若后续有以下需求,建议拆表: 1. 需要对特色专业/学科评估进行检索与排序。 2. 就业报告需要独立管理、下载或审核。 3. 图片需要按类型、排序进行管理(可复用 `art_school_media`,增加 `biz_type=school` 的批量导入逻辑)。 ## 4. SQL 参考(PostgreSQL + JSONB + COMMENT) ```sql -- 如果已经创建了 rank/grant 列,先重命名避免关键字冲突 ALTER TABLE art_school_detail RENAME COLUMN "rank" TO overall_rank; ALTER TABLE art_school_detail RENAME COLUMN "grant" TO grant_desc; ALTER TABLE art_school_detail ADD COLUMN combined_score NUMERIC(10,2), ADD COLUMN overall_rank INTEGER, ADD COLUMN env_satisfaction NUMERIC(10,2), ADD COLUMN env_vote INTEGER, ADD COLUMN live_satisfaction NUMERIC(10,2), ADD COLUMN live_vote INTEGER, ADD COLUMN combined_satisfaction NUMERIC(10,2), ADD COLUMN combined_vote INTEGER, ADD COLUMN satisfaction_json JSONB, ADD COLUMN teachers TEXT, ADD COLUMN scholarship TEXT, ADD COLUMN scholarship_json JSONB, ADD COLUMN grant_desc TEXT, ADD COLUMN canteen TEXT, ADD COLUMN dormitory TEXT, ADD COLUMN master_explain TEXT, ADD COLUMN doctor_explain TEXT, ADD COLUMN special_major_json JSONB, ADD COLUMN employment_report_json JSONB, ADD COLUMN photo_json JSONB, ADD COLUMN accommodation_json JSONB, ADD COLUMN subject_reviews_json JSONB, ADD COLUMN research_json JSONB, ADD COLUMN univ_majors_json JSONB, ADD COLUMN univ_postgraduate_json JSONB; COMMENT ON COLUMN art_school_detail.combined_score IS '综合评分'; COMMENT ON COLUMN art_school_detail.overall_rank IS '综合排名'; COMMENT ON COLUMN art_school_detail.env_satisfaction IS '环境满意度'; COMMENT ON COLUMN art_school_detail.env_vote IS '环境满意度投票数'; COMMENT ON COLUMN art_school_detail.live_satisfaction IS '生活满意度'; COMMENT ON COLUMN art_school_detail.live_vote IS '生活满意度投票数'; COMMENT ON COLUMN art_school_detail.combined_satisfaction IS '综合满意度(原始分)'; COMMENT ON COLUMN art_school_detail.combined_vote IS '综合满意度投票数'; COMMENT ON COLUMN art_school_detail.satisfaction_json IS '满意度明细JSON'; COMMENT ON COLUMN art_school_detail.teachers IS '师资力量描述'; COMMENT ON COLUMN art_school_detail.scholarship IS '奖学金说明'; COMMENT ON COLUMN art_school_detail.scholarship_json IS '奖学金数组JSON'; COMMENT ON COLUMN art_school_detail.grant_desc IS '助学金说明'; COMMENT ON COLUMN art_school_detail.canteen IS '食堂说明'; COMMENT ON COLUMN art_school_detail.dormitory IS '宿舍说明'; COMMENT ON COLUMN art_school_detail.master_explain IS '硕士点说明'; COMMENT ON COLUMN art_school_detail.doctor_explain IS '博士点说明'; COMMENT ON COLUMN art_school_detail.special_major_json IS '特色专业JSON'; COMMENT ON COLUMN art_school_detail.employment_report_json IS '就业报告JSON'; COMMENT ON COLUMN art_school_detail.photo_json IS '图片JSON'; COMMENT ON COLUMN art_school_detail.accommodation_json IS '建筑/配套JSON'; COMMENT ON COLUMN art_school_detail.subject_reviews_json IS '学科评估JSON'; COMMENT ON COLUMN art_school_detail.research_json IS '科研信息JSON'; COMMENT ON COLUMN art_school_detail.univ_majors_json IS '专业标签JSON'; COMMENT ON COLUMN art_school_detail.univ_postgraduate_json IS '保研信息JSON'; ``` ## 5. JSONB 性能简要说明 一般情况下,PostgreSQL 的 JSONB 比 TEXT 存 JSON 更适合查询与索引,读写成本略高但查询性能更好;若仅做原样展示且几乎不查询,可用 TEXT 降低写入开销。当前场景包含后续检索可能性,建议使用 JSONB。 ## 6. 前端表单与接口调整建议 ### 6.1 前端需要新增的字段(按展示/编辑分组) 以下字段建议直接在学校详情页(或学校详情编辑页)增加表单项;展示为主、无需复杂查询: - 文本/富文本:`teachers`、`scholarship`、`grant_desc`、`canteen`、`dormitory`、`master_explain`、`doctor_explain` - 数值:`combined_score`、`overall_rank`、`env_satisfaction`、`env_vote`、`live_satisfaction`、`live_vote`、`combined_satisfaction`、`combined_vote` - JSONB 原样展示(可选做 JSON 编辑器/分块表单):`satisfaction_json`、`research_json`、`univ_majors_json`、`univ_postgraduate_json` ### 6.2 建议拆表并提供独立编辑的模块(可增删列表) 如果需要列表化编辑、排序、筛选,则建议拆表并提供独立接口: - 特色专业(`special_major_json`) - 建议拆表字段:`school_id`、`type`、`major_id`、`major_name`、`sort_no`、`remark` - 学科评估(`subject_reviews_json`) - 建议拆表字段:`school_id`、`review_type`、`subject_name`、`assess_level`、`assess_grade`、`sort_no`、`remark` - 就业报告(`employment_report_json`) - 建议拆表字段:`school_id`、`report_name`、`online_preview`、`report_url`、`year`、`sort_no`、`remark` - 图片(`photo_json`) - 建议直接使用现有 `art_school_media`(`biz_type=school`)做多图管理 ### 6.3 接口调整建议(最小改动) 如果先不拆表,推荐在现有学校详情保存接口中直接读写 JSONB 字段: - 新增/更新:`ArtSchoolService.insertWithDetailByBo` / `updateWithDetailByBo` - 查询:`ArtSchoolDetailController` 的 `getInfo` / `list` 保持返回 JSONB 字段 如拆表,则建议新增独立模块接口(示例): 1. 特色专业 - `GET /art/school/specialMajor/list?schoolId=` - `POST /art/school/specialMajor` - `PUT /art/school/specialMajor` - `DELETE /art/school/specialMajor/{id}` 2. 学科评估 - `GET /art/school/subjectReview/list?schoolId=` - `POST /art/school/subjectReview` - `PUT /art/school/subjectReview` - `DELETE /art/school/subjectReview/{id}` 3. 就业报告 - `GET /art/school/employmentReport/list?schoolId=` - `POST /art/school/employmentReport` - `PUT /art/school/employmentReport` - `DELETE /art/school/employmentReport/{id}` 4. 学校图片(复用) - `GET /art/school/media/list?bizType=school&bizId=` - `POST /art/school/media` - `DELETE /art/school/media/{id}` ### 6.4 前端表单交互建议 - JSONB 字段:可用「分组表单 + 预览 JSON」或直接 JSON 编辑器组件,提交时序列化为字符串。 - 列表型字段:使用可增删行的表单组件,对应独立接口,避免整条详情表单过大。