包含TOPIC、COURSE、SECTION、VIDEO_CONTENT的数据库ER图设计及查询可行性咨询
问题1解答:是否支持目标统计查询
如果你的ER图中各实体的外键关联符合你描述的层级关系,且VIDEO_CONTENT表存储了视频时长字段,完全可以正常查询你需要的三个统计值,参考查询逻辑如下:
- 查询指定COURSE的SECTION数量:按COURSE ID过滤SECTION表后统计行数即可
- 查询每个SECTION下的视频数量:按SECTION ID分组统计
VIDEO_CONTENT的行数 - 查询每个SECTION总视频时长:按SECTION ID分组,对
VIDEO_CONTENT的时长字段做求和运算
参考SQL示例:
-- 统计指定course_id=123的课程下各章节的视频数、总时长 SELECT s.section_id, s.section_name, COUNT(v.video_id) AS video_count, SUM(v.duration) AS total_duration_sec FROM SECTION s LEFT JOIN VIDEO_CONTENT v ON s.section_id = v.section_id WHERE s.course_id = 123 GROUP BY s.section_id, s.section_name; -- 单独查询该课程的总章节数 SELECT COUNT(*) AS section_count FROM SECTION WHERE course_id = 123;
问题2解答:ER图潜在缺陷与优化方案
仅基于你描述的业务场景,常见的设计缺陷和对应优化方案如下:
- 缺陷1:缺少排序规则字段,课程下的SECTION、章节下的VIDEO_CONTENT都有固定的展示顺序,现有设计如果没有排序字段,无法按讲师指定的顺序展示内容
解决方案:在SECTION表新增sort_order整数字段,在VIDEO_CONTENT表新增sort_order整数字段,讲师调整顺序时更新对应字段值,查询时按该字段升序排列 - 缺陷2:无冗余统计字段,每次查询都要关联统计视频数量和时长,高并发场景下查询性能差
解决方案:可以在SECTION表新增冗余字段video_count、total_duration,在COURSE表新增section_count、total_video_count、total_course_duration,新增/删除/修改视频时同步更新对应冗余字段,查询时直接读冗余字段无需关联统计 - 缺陷3:缺少业务状态字段,比如课程的上下线状态、视频的转码状态、审核状态,如果没有对应字段无法支持常规的课程发布流程
解决方案:根据业务需要在对应表增加状态字段,比如COURSE表加publish_status(0:草稿 1:已发布 2:已下线),VIDEO_CONTENT表加transcode_status(0:转码中 1:转码成功 2:转码失败)、audit_status(0:待审核 1:审核通过 2:审核驳回) - 缺陷4:如果后续需要支持一个课程归属多个主题的场景,现有1对多的TOPIC-COURSE关系无法支持
解决方案:如果有跨主题的需求,可以新增中间表TOPIC_COURSE_REL存储多对多关联,替换原有TOPIC到COURSE的外键关联
内容的提问来源于stack exchange,提问作者Partho
相关产品推荐
相关产品推荐

