当前位置: 首页 > 科技观察

关系数据库设计的三大范式

时间:2023-03-13 21:05:39 科技观察

作者:郑龙飞范式定义百度百科:在设计关系数据库时,遵循不同的规范要求,才能设计出合理的关系数据库。这些不同的规范要求称为不同的范式,每一种范式越高,数据库冗余越小。人类语言:Paradigm可以理解为设计一个数据表的表结构,满足标准级别、规范和要求。通常,我们使用第一范式(1NF)、第二范式(2NF)、第三范式(3NF),也就是本文要讨论的“三范式”。范式的优点使用范式可以减少数据的冗余。为什么要减少数据冗余?十多年前,为了减少磁盘存储,磁盘非常昂贵。以前没有分布式系统,都是单机系统。只能加盘,而且盘数也有限制。一次修改需要修改多张表,数据一致性难以保证。Paradigm的缺点Paradigm的缺点是在获取数据的时候,需要通过Join将最终的数据拼接在一起。目前范式的分类目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BassCodd范式(BCNF)、第四范式(4NF)、第五范式(5NF)。什么是函数依赖?百度百科:函数依赖简单来说就是:当一组属性决定了另一组属性时,就说另一组属性依赖于这组属性。人类语言:以下表为例,通俗易懂的解释什么是函数依赖。学号、姓名、系名、系主任、学科名称分数001张三,计算机系,李雷,高等数学87001,张三,计算机系,李雷,大学英语88001,张三,数学系计算机系李磊数据库设计89002李思计算机系李磊高等数学86002李思计算机系李磊Java编程90002李思计算机系李磊大学英语98003王武金融系韩梅梅高等数学96003王五金融系韩梅梅金融基础95完全泛函依赖官方定义:设X和Y为关系R的两个属性集,X'是X的真子集,存在X→Y,但对每个X'有X'!→Y,则称Y在功能上完全依赖于X。人类语言:比如通过(学号,课程)推导出分数,但是不能用单独学号,那么可以说分数完全依赖于(学号,课程)。总结:即:C可以通过AB得到,但是C不能单独通过AB得到,那么C就完全依赖于AB了。偏函数依赖官方定义:如果Y函数依赖X,但同时Y不完全依赖X函数,那么我们说Y部分函数依赖X。人类语言:例如,through,(studentnumber,course)来发起名字,因为其实可以直接传,学号来发起名字,所以:name部分取决于(学号,course)。总结:C可以通过AB得到,C可以通过A得到,或者C可以通过B得到,那么C部分依赖于AB。传递函数依赖的官方定义:传递函数依赖:设X,Y,Z为关系R中互不相同的属性集合,存在X→Y(Y!→X),Y→Z,则称Z的传递函数依赖于X。人类语言:例如:用学号生成系名,用系名生成系主任。但是系主任不能推送学号,系主任主要靠系名。这种情况可以说:Dean传递依赖于student_id。总结:即:通过A得到B,通过B得到C,但是C得不到A,则C传递依赖于A。三种范式的区别第一范式第一范式1NF核心原则:属性是不可分割的。例如:学号、姓名、系名、系名、系主任、学科名称、分数、数学记录信息、001张三、李雷、计算机系、87本科高等数学、二年级002、李四,计算机系,李雷,大学英语88级研究生,严三,很明显上面这个表的设计是不正确的如果符合第一范式的话,学籍信息栏的数据是不对的一个原子数据项,可以被分割。因此修改表格,使表格满足第一范式的要求。修改后的结果如下图:学号、姓名、系名DepartmentofDepartmentSubjectNameScoreDegreeLevel001张三计算机系李雷高数87本科二年级002李思计算机系李雷大学英语88研究生科研三事实上,1NF是所有关系型数据库最基本的要求,你在SQLServer、Oracle、MySQL等关系型数据库管理系统(RDBMS)中创建数据表时,如果数据表的设计没有达不到这个最基本的要求,那么手术肯定是不能成功的。也就是说,只要数据表已经存在于RDBMS中,就必须符合1NF。SecondNormalFormSecondNormalForm2NF核心原则:不能存在“部分函数依赖”。例如:学号、姓名、系名、系主任、学科名分数001张三计算机系李雷高等数学87001张三计算机系李雷大学英语88001张三计算机系李磊数据库设计89002李思计算机系李磊高等数学86002李思计算机系李磊java编程90002李思计算机系李磊大学英语98003王武金融系韩美美高等数学96003王武金融系韩美融基础95以上表格显然存在,部分依赖。比如这张表的主键是(学号,班级名),分数确实完全依赖于(学号,班级名),但是名字并不完全依赖于(学号,班级名),所以该表符合第二范式根据要求,修改后的结果如下图所示:学号学科名称分数001高等数学87001大学英语88001数据库设计89002高等数学86002java编程90002大学英语98003高等数学96003财务基础95学号name系名系主任001张三计算机系李雷002李四计算机系李雷003王五财务部韩梅梅以上符合第二范式,去掉了部分函数依赖。第三范式ThirdNormalForm3NF核心原则:不能有传递函数依赖。例如:学号,姓名,系名,系主任001张三,计算机系,李磊002,李四,计算机系,李磊003,王五,财务部,韩梅梅在上表中,有一个传递函数依赖:学号->系名->系主任,但系主任推不出来学号。上表需要再次拆解:学号姓名系名001张三计算机系002李四计算机系003王五财务系姓名系主任计算机系李磊计算机系李磊财务系韩梅梅反三范式无冗余数据库可能不是最好的数据库,有时为了提高运行效率,需要降低范式标准,适当保留冗余数据。具体做法是:在设计概念数据模型时遵循第三范式,在设计物理数据模型时考虑降低范式标准的工作。减少范式就是增加字段,减少查询时的关联,提高查询效率,因为查询在数据库操作中的比例远大于DML。但去规范化一定要适度,在满足三个范式的基础上进行调整。总结引用了知乎对范式的理解:数据库设计也应该分为三个境界:第一个境界,刚开始做数据库设计,还没有深入理解范式的重要性。这个时候出现的反范式设计一般都会出问题。第二个境界,随着你遇到问题和解决问题,你逐渐明白范式的真正好处,从而可以快速设计出低冗余、高效率的数据库。第三境界,经过N年修炼,范式的局限性肯定会被发现。这时候就去打破范式,设计一个更合理的反范式部分。