0

0

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

php中文网

php中文网

发布时间:2016-06-07 15:24:07

|

1925人浏览过

|

来源于php中文网

原创

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

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

  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

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

SuperCms在线订餐系统
SuperCms在线订餐系统

模板采用响应式设计,自动适应手机,电脑及平板显示;满足单一店铺外卖需求。功能:1.菜单分类管理2.菜品管理:菜品增加,删除,修改3.订单管理4.友情链接管理5.数据库备份6.文章模块:如:促销活动,帮助中心7.单页模块:如:企业信息,关于我们更强大的功能在开发中……安装方法:上传到网站根目录,运行http://www.***.com/install 自动

下载

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

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,也就是传递依赖。

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

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

129

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

77

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

81

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

60

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

444

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

15

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

12

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

5

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.4万人学习

Django 教程
Django 教程

共28课时 | 2.7万人学习

Excel 教程
Excel 教程

共162课时 | 10.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号