什么是范式
构造数据所需要遵循的规则,从第一范式到第五范式,依次加强规则,到第五范式被称为完美范式
范式规则
第一范式
第一范式规定的是字段的不可分割
比如 在 产品表里 有个product字段,往里面塞了 name+price ,就不符合第一范式,第一范式要求 应该把name 和price分成两个字段
第二范式
第二范式要求的是主键的不可分割
比如 一条订单的唯一主键是只有订单号,如果选择订单号和产品ID作为主键就不符合要求了
第三范式
在第二范式的基础上,第三范式要求字段定义的唯一性
即产品表里存在了 产品名,由于产品名依赖的 是产品表
那么其余里就不能出现产品名
范式化的思考
范式化的数据库,存在着某种美感,但数据库却不应该无脑范式化
比如,虽然在采用第三范式后,由于主键单一,数据的更新速度会很快
与之相反的,如果严格蹲守范式化,当要查询复合信息,要关联的表就会成倍的增长,这对于目前的大数据时代,在性能方面无疑是一场灾难。
由此可见 完全范式化虽然带来了更新上的优势(主键唯一,字段完全依赖单一主键)但是在查询上看,多张表的关联反而成为制约着高性能的瓶颈
反范式化
反范式化其实就是不去刻意的遵守范式化,允许在表中存在一些冗余的字段,减少表与表之间的耦合程度,起到以空间换取时间的作用。
反范式化与范式化并不是相互对立的存在,而是相辅相成的,在设计数据库时,既不要完全遵守范式化,也不要可以去回避。
热点分散
场景:当某个计数字段被大量修改时,由于一次只能更新一条,频繁的更新会造成性能的下降
解决方式,将计数字段分成多条数据,每次随机抽取一条作为更新对象,要获取实际的统计信息时,把多条数据 sum起来,通过分散更新,提升性能
热点分散其实是个应用很广泛的思想,比如最常见的削峰填谷,就是把热点分散在不同时间上,缓解服务器的压力
又比如,多线程中的currentHashMap,其实也是用了分段思想,将热点分散在不同的数据段当中,以及addrlong这个原子类的自增,也同样时用了这样的思想
在我们平时设计项目时如果遇到类似的问性能问题,也可以多考虑考虑热点分散