PostgreSQL中新建关联表与直接在原表中新增字段的区别是什么?
PostgreSQL 关联表存储与直接新增字段的差异优势
我们以你提到的图书存储场景为例:直接在Book表存language:String字段属于反范式的冗余设计,单独创建Language表并通过Foreign Key和Book表关联属于遵循范式的关联设计,后者的优势主要有以下几点:
- 保障数据一致性
直接存储字符串时很容易出现输入不规范的脏数据,比如同一种中文会出现中文、zh-CN、简体中文等多种写法,后续统计、筛选时会出现匹配错误。使用关联表加外键约束后,Book表的语言只能从Language表的预置值中选择,完全避免这类不规范数据。 - 提升存储与查询效率
字符串类型占用的存储空间远大于数值类型的外键ID,当Book表的数据量达到数十万以上时,大量重复的语言字符串会浪费大量存储空间,关联查询数值型外键的速度也远快于匹配字符串字段。 - 降低后续扩展成本
如果后续需要给语言增加拓展属性,比如新增ISO标准编码、所属语系、是否支持全文检索标记等,直接存字符串的设计完全无法支撑,关联设计只需要在Language表新增对应字段即可,不需要改动Book表的表结构,对业务影响极小。 - 减少冗余更新成本
如果需要统一调整某类语言的名称,比如要把所有英文统一修改为英语(英国),直接存字符串的设计需要全表扫描更新所有匹配的Book记录,数据量大时会有严重的性能问题,还容易出现漏改、错改。关联设计只需要修改Language表对应的1条记录即可,所有关联的图书数据会自动同步,成本极低。
内容的提问来源于stack exchange,提问作者Michael Torres
相关产品推荐
相关产品推荐

