数据库三范式

数据库范式理论是数据库设计的重要基础,通过范式的应用,可以减少数据冗余,提高数据一致性,简化数据插入、更新和删除操作的复杂性。本文将详细介绍码(主键码和候选码)以及数据库的三大范式(1NF、2NF、3NF),并通过举例说明如何应用这些概念来优化数据库设计。

在关系数据库中,码是指能够唯一标识一行数据的列或列的组合。码主要分为候选码和主键码。

候选码

候选码是能够唯一标识一行数据的列或列的组合,具有以下两个特性:

  1. 唯一性:候选码的值在表中必须是唯一的,即不允许重复值。
  2. 最小性:不能从候选码中移除任何列而仍然保持唯一性。

例如,在一个学生信息表中,可以有学号、身份证号、手机号、邮箱作为候选码。这些列单独或组合在一起都能够唯一标识一行数据。

主键码

主键码是候选码中的一个,一个表可能有多个候选码,可以从中选择一个作为主键码。主键码在数据库表中必须唯一且不为空,用于唯一标识表中的每一行数据。

例如,在学生信息表中,学号、身份证号、手机号、邮箱都是候选码,可以选择其中的一个作为主键码。假设选择学号作为主键码,那么学号就成了该表的主键,用于唯一标识每个学生的信息。

数据库范式

数据库范式是用于规范数据库设计的规则,通过将数据库设计成符合不同范式的形式,可以减少数据冗余,提高数据一致性,简化数据操作。常见的范式有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

第一范式(1NF)

第一范式(1NF)的要求是列的原子性,即表中的每一列都是不可再分的基本数据项,不能包含重复的组或数组。

举例

假设有一个学生信息表,包含以下列:

学号姓名地址课程
1张三北京市朝阳区数学,英语
2李四上海市浦东新区物理,化学

这里的地址包含省市区详细信息,课程列包含了多个课程,这样的设计不符合1NF,因为地址和课程都不是原子性的。

为了符合1NF,需要将地址和课程拆分成独立的列:

学号姓名课程
1张三北京北京朝阳数学
1张三北京北京朝阳英语
2李四上海上海浦东物理
2李四上海上海浦东化学

第二范式(2NF)

第二范式(2NF)是在1NF的基础上,要求非码属性必须完全依赖于候选码,消除了非主属性对主码的部分依赖关系。

举例

假设有一个学生课程信息表,包含以下列:

学号课程编号课程分数代课老师
1C10185张老师
1C10290李老师
2C10178张老师
2C10388王老师

这里的码是学号和课程编号的组合(学号+课程编号)。主属性是学号和课程编号,非码属性是课程分数和代课老师。

(学号,课程编号) -> 课程分数,非码属性课程分数完全依赖于候选码学号+课程编号

但是,(课程编号) -> 代课老师,非码属性代课老师部分依赖于候选码学号+课程编号

因此,这个表不符合2NF,因为代课老师部分依赖于候选码。

为了符合2NF,需要将代课老师拆分到另一个表中:

学生课程信息表:

学号课程编号课程分数
1C10185
1C10290
2C10178
2C10388

课程信息表:

课程编号代课老师
C101张老师
C102李老师
C103王老师

第三范式(3NF)

第三范式(3NF)是在2NF的基础上,要求任何非主属性不依赖于其他非主属性,消除了传递依赖。

举例

假设有一个学生信息表,包含以下列:

学号(主键)姓名所在系(系主键)系地址
1张三CS北京
2李四EE上海

候选码是学号,主属性(主键码)是学号,非主属性是姓名、所在系和系地址。

满足1NF:列都具有原子性。

满足2NF:主属性只有一个,因此不存在部分依赖关系。

不满足3NF:非主属性系地址依赖于非主属性所在系,存在传递依赖。

为了符合3NF,需要将系地址拆分到另一个表中:

学生信息表:

学号姓名所在系
1张三CS
2李四EE

系信息表:

系主键系地址
CS北京
EE上海

通过拆分表,消除了非主属性之间的依赖关系,确保了每个非主属性都只依赖于主属性。

范式优化的综合实例

为了更好地理解范式的应用,下面通过一个综合实例来展示如何从1NF优化到3NF。

初始设计(不符合范式)

假设有一个学生选课系统,包含以下信息:

学号姓名电话课程编号课程名称分数老师姓名老师电话
1张三123456C101数学85王老师654321
1张三123456C102英语90李老师987654
2李四234567C101数学78王老师654321
2李四234567C103物理88张老师321654

这张表包含了学生信息、课程信息和老师信息,存在大量的冗余数据,不符合任何范式。

符合1NF

首先,确保每一列都是原子性的,将表设计成以下形式:

学号姓名电话课程编号课程名称分数老师姓名老师电话
1张三123456C101数学85王老师654321
1张三123456C102英语90李老师987654
2李四234567C101数学78王老师654321
2李四234567C103物理88张老师321654

这里已经满足了1NF,所有列都是原子性的。

符合2NF

其次,消除非主属性对主码的部分依赖,确保所有非码属性完全依赖于候选码。将表分成学生信息表、课程信息表和学生课程关系表:

学生信息表:

学号姓名电话
1张三123456
2李四234567

课程信息表:

课程编号课程名称老师姓名老师电话
C101数学王老师654321
C102英语李老师987654
C103物理张老师321654

学生课程关系表:

学号课程编号分数
1C10185
1C10290
2C10178
2C10388

符合3NF

最后,消除非主属性对其他非主属性的依赖,确保非主属性只依赖于主属性。这里,老师的电话依赖于老师姓名,而老师姓名又依赖于课程编号,这里存在传递依赖。

课程信息表:

课程编号课程名称老师编号
C101数学T1
C102英语T2
C103物理T3

老师信息表:

老师编号老师姓名老师电话
T1王老师654321
T2李老师987654
T3张老师321654

学生课程关系表:

学号课程编号分数
1C10185
1C10290
2C10178
2C10388

通过这种拆分,消除了非主属性之间的依赖,确保所有非主属性都只依赖于主属性,达到了3NF的要求。

结论

通过本文的详细介绍,可以看出数据库范式是规范数据库设计的重要工具。通过理解和应用候选码、主键码以及三大范式,可以有效减少数据冗余,提高数据一致性,简化数据操作。在实际的数据库设计过程中,合理应用这些理论,能够大大提高数据库系统的性能和可维护性。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值