数据库的设计规范(范式)

本文介绍了数据库设计中的范式理论,包括第一范式(原子性)、第二范式(唯一性)和第三范式(冗余性)。通过实例说明了如何遵循这些范式以消除数据冗余,优化数据库结构。同时,讨论了范式的优缺点以及在特定情况下反范式化的设计策略,以平衡数据完整性和查询效率。
摘要由CSDN通过智能技术生成

1、范式简介

  • 在关系型数据库中,关于设计表设计的基本原则、规则被称为范式(Normal Form,简称NF)。
  • 目前关系型数据库有6种范式,等级从低到高分别为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,也称完美范式)。
  • 数据库的范式设计越高,冗余度就越低,同时高阶范式一定符合低阶范式,一般来说,关系型数据库设计中,最高也就满足到BCNF,普遍为3NF。

2、键和相关属性的概念

范式定义会涉及到主键和候选键,数据库中的键由一个或多个属性组成。

  • 超键:能够唯一标识元组的属性集;
  • 候选键:如果超键不包括多余的属性,那么这个超键就是候选键;
  • 主键:用户可以从候选键中选择一个作为主键;
  • 外键:例如属性x不是表a的主键但是表b的主键,那么属性x就为表a的外键;
  • 主属性:包含任一候选集中的属性成为主属性;
  • 非主属性:不包含任一个候选键中的属性;
表a:name,number,sfz(身份证号),sex,age
表b:number,subject,score,class

超键:对于表a来说,包含number或sfz的任意组合
候选键:最小的超键,仅包含number或sfz
主键:number或sfz 选其一
外键:表b中的number
主属性:number或sfz
非主属性:number和sfz之外的属性

3、第一范式:原子性

  • 保证数据表中的每个字段的值必须有原子性。即每个值不可再分的最小数据元。
  • 例1:小白有两个手机号写在同一个字段值中,不符合原子性,需将其拆分为两行或者拆分为连个新字段显示即可满足1NF。
namephone
小白12345678902
76543218908
namephone
小白12345678902
小白76543218908
  • 例2:某同学的地址为xx市xx区xx镇,其中包含了三段:市区镇,明显可以进一步拆分为三个字段。

4、第二范式:唯一性

  • 满足1NF基础上,满足数据表里的每一条数据记录都是唯一标识的。而且所有非主键字段完全依赖主键,不能只依赖主键的一部分。

  • 例1:成绩表(学号,课程,成绩),(学号,课程)可以决定成绩,但学号或者课程都不能决定成绩,所以”(学号,课程)→成绩“就是完全依赖关系。

  • 例2:表a(学号,姓名,性别,年龄,课程,课程老师,成绩),可以得到非完全依赖关系:(学号,课程)→(姓名,性别,年龄,课程老师,成绩),其中(姓名,性别,年龄)依赖于学号,课程老师依赖于课程,成绩依赖于(学号,课程);因此可以将一张表格拆分为三张表格:学生信息表(学号,姓名,性别,年龄)、课程表(课程,课程老师)、成绩表(学号,课程,成绩);

  • 对于非主属性来说,并非完全依赖候选键,可能存在以下问题:

    • 数据冗余:每条数据都有重复字段,例如一个学生报了n门课程,那么学生信息就会重复了n-1次;
    • 插入异常:要求新增一门课程,但未确定学生报课名单,无法插入课程信息;
    • 删除异常:要求删除所有学生信息,如果不讲课程信息保存,就会将其全部误删;
    • 更新异常:调整某课程老师,所有行都要调整,否则会出现同课程不同老师的情况。

5、第三范式:冗余性

  • 要求任何字段不能由其余字段派生出来,字段间不能存在冗余,即不能存在传递依赖。
  • 表a(学号,姓名,性别,年龄,学院,学院电话),可以得到传递依赖关系:学院电话→学院→学号,而非主属性学院电话依赖于非主属性学院,这是不允许存在的。因此需将表拆分为2张表:学生信息表(学号,姓名,性别,年龄)、学院表(学院,学院电话);

6、范式优缺点

  • 优点:消除数据冗余
  • 缺点:降低查询效率,因为产生的数据表过多,查询时需关联查询,代价大,也有可能使索引无效。
  • 范式只是提出设计原则,实际上并不一定必须满足它。有时候为了性能上的提升,通过增加少量的冗余或重复数据提高数据库的读性能,减少表的产生和关联查询,实现以空间换取时间的目的。

7、反范式化

  • 增加冗余数据提高数据库的读性能。性能比规范化更重要。
  • 可以插入计算列提高查询时间
  • 例如:在三范式中例子,如果经常需要学生信息和学院电话,可以在学生信息表中加入一列电话,这样会减少大量时间,虽然违反了3NF,但查询效率提高了。
  • 缺点:
    • 存储空间增大
    • 更新、修改、删除数据需要消耗系统资源
    • 数据量小的情况下,范式不能体现出性能优势,反而使得数据库设计更复杂
  • 使用场景:冗余信息有价值或能够大量的减少查询时间提高效率,采取反范式化
  • 增加冗余字段条件:不需要经常修改,查询时候不可或缺。

小结

第一范式规定表中的每个列应该是不可分割的最小单元;
第二范式是在满足第一范式的基础上,规定表中的非主键列不存在对主键的部份依赖;
第三范式是在满足第一范式和第二范式的基础上,规定表中的列不存在对非主键列的传递依赖。
使用三大范式的优点:结构简单、表逻辑和条理性更强,并且第三范式很大程度上减少了表的冗余数据,节省了数据库的存储空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值