关联多表的优质数据库设计咨询:Classes表与独立分类子表的关联优化
针对你现在遇到的不同类型课程对应异构表的关联需求,有以下几种成熟的实现思路可以选择:
单表继承方案
把所有课程类型的公共字段+差异化字段全部整合到Classes主表中,新增一个class_type字段标记课程所属类型,无需额外构建独立子表。
该方案的优势是无需关联查询,读写性能最高,适合不同课程类型差异化字段少于10个的场景;劣势是会产生大量空值冗余字段,课程类型多了之后表结构会非常臃肿。类表继承方案
Classes主表仅存储所有课程的公共属性,例如课程ID、课程名称、上架状态、创建时间等,每类课程单独创建子表存储专属字段,子表主键直接和Classes表的课程ID做一对一外键关联。
该方案没有冗余字段,表结构清晰,是生产环境最常用的设计,适合不同课程类型差异化字段多、后续新增课程类型频率低的场景,查询时仅需要关联对应类型的子表即可。JSON扩展字段方案
Classes主表存储公共字段,额外新增一个extraJSON类型的字段,所有不同类型课程的专属属性都序列化存入该JSON字段。
该方案开发效率最高,结构最灵活,新增课程类型不需要修改表结构,目前MySQL、PostgreSQL等主流数据库都支持JSON字段的局部查询和索引,适合不需要对差异化字段做复杂聚合查询的绝大多数业务场景。EAV(实体-属性-值)模型
保留Classes主表存储公共字段,额外新建class_attributes表,表结构为course_id、attribute_key、attribute_value,所有课程的差异化属性都按行存储在该表中。
该方案灵活度最高,后续新增任何课程类型都不需要修改表结构,适合课程类型极多、属性动态变化的场景;劣势是查询需要做行转列操作,性能相对更低,复杂查询的开发成本高。
内容的提问来源于stack exchange,提问作者Ayomikun Samuel

