数据库设计范式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 | 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 | 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,也就是传递依赖。
以上说的是数据库设计中最基本的三范式,大部分数据库设计时,只需要满足这三个范式即可。接下来我还会写一篇博客讲解下更高级的范式。
数据库设计范式1——三范式的更多相关文章
- mysql三范式
第一范式:有主键,具有原子性,字段不可分割. 第二范式:完全依赖,没有部分依赖. 第三范式:没有传递依赖. 总结:数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时候会拿冗余还速度,最总用的 ...
- 20170626_oracle_数据库设计
数据库设计的定义:规划数据库中数据对象以及之间关系的过程. 为什么进行数据库设计? 空间 完整性 程序开发 数据库设计前提知识: 范式: 1NF:第一范式 第一范式的目标是确保每列的原子性 如果每列都 ...
- Java高级项目实战03:CRM系统数据库设计
接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...
- SQL数据库设计三范式
关系型数据库将数据库设计需要遵循的一些规则叫做“范式”,最基本的三个范式(1NF.2NF.3NF)简称三范式.第一范式是满足第二范式的基础,而第一.二范式又是满足第三范式的基础. 第一范式 表中的字段 ...
- mysql数据库的三范式的设计与理解
一般的数据库设计都需要满足三范式,这是最基本的要求的,最高达到6NF,但是一般情况下3NF达到了就可以 一:1NF一范式的理解: 1NF是关系型数据库中的最基本要求,就是要求记录的属性是原子性,不可分 ...
- mysql数据库设计三范式
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...
- mysql 数据库的设计三范式
三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖; 解释: 1NF:原子性 字段不可再分,否则就不是关系数据库; 2NF:唯一性 一个表只说明一个事物 ...
- 数据库设计三范式(3NF)
问:当时你数据库是如何设计的? 答:当时是按照三范式规范设计的: 第一范式: 1:数据库的原子性,即保证数据库表的每一列都不可分割的 第二范式: 1:原子性,即保证数据库表的每一列都不可分割 2:表中 ...
- 数据库设计范式2——BC范式和第四范式
我在很久之前的一篇文章中介绍了数据库模型设计中的基本三范式,今天,我来说一说更高级的BC范式和第四范式. 回顾 我用大白话来回顾一下什么是三范式: 第一范式:每个表应该有唯一标识每一行的主键. 第二范 ...
随机推荐
- 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...
- jQuery-1.9.1源码分析系列(六) 延时对象
首先我们需要明白延时对象有什么用? 第一个作用,解决时序以及动态添加执行函数的问题. function a(){alert(1)}; function b(){alert(2)}; function ...
- iOS 商品倒计时 限时特价 限时优惠 功能的封装
最近项目中多个页面用到了 商品特价倒计时的功能 为了偷懒 于是自己封装了一个限时抢购 倒计时的view 代码实现如下: 定向价 限时特价 模型代码实现: #pragma mark 商品定向价模型 @ ...
- animation-fill-mode的一些思考
animation-fill-mode是css3动画的一个属性,它能够控制元素在动画执行前与动画完成后的样式.一个带有延迟,并且按正常方向执行的动画(正常方向是指从0%运行到100%),执行一次的过程 ...
- 【原创】Kafka topic常见命令解析
本文着重介绍几个常用的topic命令行命令,包括listTopic,createTopic,deleteTopic和describeTopic等.由于alterTopic并不是很常用,本文中就不涉及了 ...
- Nancy之基于Self Hosting的补充小Demo
前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...
- 关系数据库SQL之可编程性事务
前言 前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数.存储过程.事务.触发器及游标,前文已介绍了函数.存储过程,本文来介绍一下事务的使用.(还是以前面的银 ...
- VS2013设置护眼背景颜色
打开VS2013 —> 工具 —> 选项 —> 环境 —> 字体和颜色 —> 选择显示项中的纯文本 —> 项目背景 —> 自定义—> 色调位85.饱和度 ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...
- 【WCF】WCF中的InstanceContext与ConcurrencyMode【转】
一.前言 最近忙于公司的在线升级项目,一个人要负责公司四大产品的在线升级,这四个产品是在Revit中以插件形式存在的,目前基于WCF来实现.等客户总量突破5万了,再重新用socket实现. 由于有服务 ...