| 优点 | 缺点 |
范式 | 1、范式化的更新操作通常比反范式化要快,只需要修改较少数据。 2、范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快。 | 复杂的查询语句在符合范式的schema上都可能需要至少一次关联,关联表的代价昂贵,也可能使得索引失效 |
反范式 | 1、数据都在一张表中,可以避免表关联,最差情况全表扫描。 2、可以设计有效的索引 | 表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失;更新操作时需要考虑冗余字段的同步,涉及多表更新操作 |
|
- 实际开发:事实上,完全的范式化和完全的反范式化schema都是实验室里才有的东西。实际场景中,最常见的反范式化数据的方法是复制或者缓存,在不同的表中存储相同的特定列。
-
实时计算统计值是非常昂贵的操作,因为要么需要扫描表中的大部分数据,要么查询语句只能在某些特定的索引上才能有效运行,提升性能常用方法:缓存表和汇总表,但前提是允许少量的脏数据或者一定的实时性偏差。
- 缓存表:对优化和搜索语句使用较多,在同一张表中保存衍生的冗余数据
- 汇总表:主要用在一些累计、统计、汇总场景
-
在使用缓存表和汇总表时,必须决定是实时维护还是定期重建。当重建汇总表的时候,需要保证数据在操作时依然可以使用,这就需要通过影子表来进行实现(重命名替换)。操作:
drop table if exists my_summary_new, my_summary_old;
create table my_summary_new like my_summary;
----- populate test_new as desired
rename table my_summary to my_summary_old,my_summary_new to my_summary;