数据库设计范式1——三范式

一讲到数据库设计,大家很容易想到的就是三范式,但是第四、第五范式又是什么,不是很清楚,三范式到底怎么区分,也不清楚,作为数据库设计的基础概念,我再讲解下数据库范式。

Normal form Brief definition
1NF First normal form Table faithfully represents a relation, primarily meaning it has at least one candidate key
2NF Second normal form No non-prime attribute in the table is functionally dependent on a proper subset of any candidate key
3NF Third normal form Every non-prime attribute is non-transitively dependent on every candidate key in the table. The attributes that do not contribute to the description of the primary key are removed from the table. In other words, no transitive dependency is allowed.
EKNF Elementary Key Normal Form Every non-trivial functional dependency in the table is either the dependency of an elementary key attribute or a dependency on a superkey
BCNF Boyce–Codd normal form Every non-trivial functional dependency in the table is a dependency on a superkey
4NF Fourth normal form Every non-trivial multivalued dependency in the table is a dependency on a superkey
5NF Fifth normal form Every non-trivial join dependency in the table is implied by the superkeys of the table
DKNF Domain/key normal form Every constraint on the table is a logical consequence of the table's domain constraints and key constraints
6NF Sixth normal form Table features no non-trivial join dependencies at all (with reference to generalized join operator)

第一范式 1NF First normal form

简单说来就是每个表都应该有主键(唯一标识每一行),每个字段应该是原子的不可再分的。

比如以下表不符合第一范式,因为没有主键,我们无法区分第一行和第三行数据。

Name Gender Contact Interest
Neil M Email:neil@ee.net,phone:1222456 Reading;Guitar
Devin M Email:studyzy@163.net,phone:13934563456 Swimming
Neil M Email:neil@ee.net,phone:1222456 Reading;Guitar

为了区分每一行数据,所以需要添加主键UserId,这样就能区分出每一行数据来。

UserId Name Gender Contact Interest
1 Neil M Email:neil@ee.net,phone:1222456 Reading;Guitar
2 Devin M Email:studyzy@163.net,phone:13934563456 Swimming

但是这个表仍然不符合第一范式,应该Contact字段不是不可再分的,该字段可以分为Email和Phone两个字段,所以我们表变为:

UserId Name Gender Email Phone Interest
1 Neil M neil@ee.net 1222456 Reading;Guitar
2 Devin M studyzy@163.net 13934563456 Swimming

这样做以后我们的表仍然是不符合第一范式的,应该Interest字段不是原子的,里面包含了一组数据,对于这个字段,就不能像Contact一样拆分成两个字段,应该Interest字段里面包含的对象是一样的,而且一个用户可以有无数多个兴趣爱好。所以我们需要将该字段单独出来,形成新的表:

UserId Name Gender Email Phone
1 Neil M neil@ee.net 1222456
2 Devin M studyzy@163.net 13934563456
UserId Interest
1 Reading
1 Guitar
2 Swimming

现在这两个表才满足第一范式。

第二范式 2NF Second normal form

简单说来就是在满足第一范式的情况下,非主键属性应该完全依赖于候选键(候选关键字、唯一标识每一行数据的键,一个表存在多个候选键),而不应该依赖于候选键的部分。

比如以下的学生选课表,主键是学号和课程号,非主键属性是选课的时间,系统确认的时间,所选课程的名字。

StudentId CourseId ChooseTime ConfirmTime CourseName
1 10 2013/8/26 2013/8/27 微积分
1 11 2013/8/27 2013/8/27 线性代数
2 10 2013/8/26 2013/8/27 微积分

这个表满足第一范式,因为StudentId+CourseId能够唯一的标识每一行数据,而且每个属性都是原子的,不可再分的。选课时间和系统确认时间完全依赖于主键,没有问题。课程名称只依赖于CourseId,不依赖于StudentId,所以不满足第二范式,需要将课程名称独立出来:

StudentId CourseId ChooseTime ConfirmTime
1 10 2013/8/26 2013/8/27
1 11 2013/8/27 2013/8/27
2 10 2013/8/26 2013/8/27
CourseId CourseName
10 微积分
11 线性代数

第三范式 3NF Third normal form

简单来说就是满足第二范式的情况下,非主键属性应该完全依赖于候选键,不应该依赖于其他非候选键。

比如以下的学生表,主键是学号,非主键属性为学生姓名、所在院系Id,所在院系名。

StudentId Name DepartmentId DepartmentName
1 Neil 21 Math
2 Devin 22 Computer

首先这个表满足第二范式,因为主键就一个字段,所有非主键属性都依赖于StudentId。但是该表不满足第三范式,因为院系名称是依赖于院系ID的,院系ID在这个表中是非主键,依赖于学生ID,也就是传递依赖。

以上说的是数据库设计中最基本的三范式,大部分数据库设计时,只需要满足这三个范式即可。接下来我还会写一篇博客讲解下更高级的范式。

时间: 2024-10-29 18:40:13

数据库设计范式1——三范式的相关文章

数据库-谁能把三范式简单的描述下,特别是第三范式

问题描述 谁能把三范式简单的描述下,特别是第三范式 拜托了.................................................................................................................. 解决方案 第三范式数据库:关于第三范式 解决方案二: 第一范式(1NF) 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不

数据库的范式和反范式设计

范式与反范式 1.1  范式 当设计关系型数据库时,需要遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式(Normal Form),越高的范式数据库冗余越小.应用数据库范式可以带来许多好处,但是最主要的目的是为了消除重复数据,减少数据冗余,让数据库内的数据更好的组织,让磁盘空间得到更有效的利用.范式的缺点:范式使查询变的相当复杂,在查询时需要更多的连接,一些复合索引的列由于范式化的需要被分割到不同的表中,导致索引策略不佳. 1.1.1  什么是第一.二.三.BC范

软考详解---三范式

       关系型数据库是现在广泛应用的数据库类型,对关系型数据库的设计就是对数据进行组织化和结构化的过程.对于小规模的数据库我们处理起来还是比较轻松,但是随着数据库规模的扩大我们将发现用户操控数据库的SQL语句将变得笨拙.复杂.更糟糕的是很有可能导致数据不完整,不准确.所以我们有必要将数据设计的更加符合规范.怎样使我们的数据库更加规范呢,在数据库的世界里一共总结了五个范式,常用的有三个,今天小编就简单的总结一下三范式,三范式的内容也是软考中必考内容,希望对小伙伴们有帮助,小编会首先简单的介绍

浅谈数据库设计技巧(下).txt

技巧|设计|数据|数据库|数据库设计 三.多用户及其权限管理的设计 开发数据库管理类的软件,不可能不考虑多用户和用户权限设置的问题.尽管目前市面上的大.中型的后台数据库系统软件都提供了多用户,以及细至某个数据库内某张表的权限设置的功能,我个人建议:一套成熟的数据库管理软件,还是应该自行设计用户管理这块功能,原因有二: 1.那些大.中型后台数据库系统软件所提供的多用户及其权限设置都是针对数据库的共有属性,并不一定能完全满足某些特例的需求: 2.不要过多的依赖后台数据库系统软件的某些特殊功能,多种大

设计原则范式 之 数据库设计三范式

 设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合.构造数据库必须遵循一定的规则.在关系数据库中,这种规则就是范式.关系数据库中的关系必须满足一定的要求,即满足不同的范式.目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).第四范式(4NF).第五范式(5NF)和第六范式(6NF).满足最低要求的范式是第一范式(1NF).在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推.一般说来,数据库只需满足第三

数据库设计——三范式概念+实战

      在利用三范式设计数据库的时候,以前总以为是先画完ER图,然后导出关系模式,最后用三范式去检验数据库设计的是否合理,but not!我们在一开始画ER图的时候,就应当和三范式联系起来,将错误消灭在源头.为了能最早的检验出错误,我们就要对ER图转换成关系模式的算法和三范式是如何消除冗余,避免冲突有深刻的了解,才能知道如何最早发现错误.      本文主要以机房收费系统数据库设计中的一些东西为例,结合三范式概念,简述下三范式.         一,1NF 定义: 如果关系模式R的每个关系r

【转】数据库设计三范式理解

数据库设计当中三范式是经常遇到的,如果实际项目数据库设计中能达到第三范式基本也就满足要求了,那么如何快速有效的理解三个范式,同时应用于实际项目中去呢? 首先看看标准定义的三个范式: 第一范式(1NF) 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性.如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系.在第一范式(1NF)中表的每一行只包含一个实例的信

数据库表设计的三范式

数据库范式1NF 2NF 3NF BCNF(实例)     设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合.构造数据库必须遵循一定的规则.在关系数据库中,这种规则就是范 式.关系数据库中的关系必须满足一定的要求,即满足不同的范式.目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式 (3NF).第四范式(4NF).第五范式(5NF)和第六范式(6NF).满足最低要求的范式是第一范式(1NF).在第一范式的基础上进一步满足更多 要求的称为第

数据库设计范式深入浅出

关系数据库设计之时是要遵守一定的规则的.尤其是数据库设计范式 现简单介绍1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF,另有第四范式和第五范式留到以后再介绍. 在你设计数据库之时,若能符合这几个范式,你就是数据库设计的高手. 第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系.例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码) 规范成为1NF有三种方法: 一是重复存