前言
读懂本文章的前提条件是需要明白什么是数据库第一二三、BCNF范式。在此不做赘述,下面的引用的链接是我觉得易于理解数据库第一二三、BCNF范式的文档。本篇文章主要讲为什么满足BCNF范式+“不干政”的冗余是最高效的数据库设计范式。
fd数据库三范式和BCNF范式的理解:生动举例-优快云博客https://blog.youkuaiyun.com/weixin_43954951/article/details/125494783
现状
毋庸置疑BCNF是最合理的数据库范式,所谓合理就是逻辑通畅,需求清晰,不惧需求变更的设计规范,是程序员高效开发,维持脑压正常的前提。
然而数据库表设计的形式不代表是人们喜欢看见的数据形式,人们更喜欢显而易见的展示,而满足BCNF范式更多代表的是业务关系的通畅。然而很多刚入行的同学常常是对着产品原型展示的字段一通设计,结果导致表关系穿插耦合,冗余繁复,最后导致的结果就是出现性能瓶颈、工作任务繁重、甚至BUG层出不穷、脑压蹭蹭蹦高。所以不用问为什么,乖乖的遵循前人踩坑得出的经验BCNF范式一定是你少走弯路的捷径。
拔高
很多同学冗余字段的初衷,往往是为了提高性能、或者分库分表、或者同步第三方系统数据、或者遵循云云原生设计,这些都是对连表查询不友好的设计,说到这忍不住吐槽一句:写一堆join是万恶的开始,2015从业的前三年还觉得能写出复杂的sql很牛逼,后来才发现不用写sql才是最牛逼的。事实上传统的软件开发体系中使用冗余并没有错,错的是不合理的使用冗余。只要遵循下面几点规则,冗余不再是问题。
1】冗余的字段“不干政”,仅用做查询的索引和回显。
切记不可图一时之快将冗余的字段用到关系处理上,违反上面规范就是真正违反了BCNF范式提出的初衷,造成混乱的开始。
2】统一处理冗余
其实冗余逻辑在不同的业务数据处理中高度一致,我们完全可以使用面向切面编程的方式统一处理,这样做的好处就是不侵入代码,避免了重复劳动。
总结
为了方便叙述,暂且将上面冗余的规范+BCNF范式叫做【BCNF冗余范式】简称BCNF-R,其实BCNF-R仍然没有背离BCNF的初衷。只是在保证数据库设计逻辑通畅的面上增加了一点实用性。