引言
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
设计范式是不是很难懂呢?非也,大学教材上给我们一堆数学公式我们当然看不懂,也记不住。所以我们很多人就根本不按照范式来设计数据库。
实质上,设计范式用很形象、很简洁的话语就能说清楚,道明白。本文将对范式进行通俗地说明,并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。
范式说明
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
例如,如下的数据库表是符合第一范式的:

字段1 字段2 字段3 字段4
       

而这样的数据库表是不符合第一范式的:

字段1 字段2 字段3 字段4
    字段3.1 字段3.2  

很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称) → (学分)
(学号) → (姓名, 年龄)
即存在组合关键字中的字段决定非关键字的情况。
由于不符合2NF,这个选课关系表会存在如下问题:
(1) 数据冗余:
同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2) 更新异常:
若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:
假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
(4) 删除异常:
假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
把选课关系表SelectCourse改为如下三个表:
学生:Student(学号, 姓名, 年龄);
课程:Course(课程名称, 学分);
选课关系:SelectCourse(学号, 课程名称, 成绩)。
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

转载于:https://blog.51cto.com/liyuh/559689

数据库设计三大范式详解相关推荐

  1. mysql数据库设计三大范式_数据库设计三大范式详解

    引言数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的.结构明晰的,同时,不会发生插入(insert).删除(delete)和更新(update)操作异常.反之则是乱七八糟,不 ...

  2. 数据库的三大范式详解

    数据库的三大范式 第一范式(1NF) 原子性:保证每一列不可再分 举例: 在上面的表中,family_inf列中不满足原子性的要求,故不满足第一范式.需调整如下: 第二范式(2NF) 在第一范式的基础 ...

  3. 数据库三大范式详解,部分依赖、完全依赖、传递依赖

    数据库三大范式详解以及部分.完全.传递依赖 一.第一范式 二.第二范式 三.第三范式 四.部分依赖.完全依赖.传递依赖 完结撒花 一.第一范式 数据库每一列都是不可分的基本数据项(原子数据项) 就比如 ...

  4. 数据库三大范式详解实例图文教程

    title: 数据库三大范式详解实例图文教程 date: 2021-09-04 20:29:31 tags: 数据库 MySQL categories: 数据库 cover: https://cove ...

  5. (转载)简洁、明晰!数据库设计三大范式应用实例剖析

    (转载http://bbs.database.ccidnet.com/read.php?tid=325895) 简洁.明晰!数据库设计三大范式应用实例剖析 引言OL~eR{q   ;iC,$vZ 0} ...

  6. 数据库设计三大范式和ER模型

    1. 数据库设计之三范式的介绍 范式: 对设计数据库提出的一些规范,目前有迹可寻的共有8种范式,一般遵守3范式即可. 第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列.(1NF强调字 ...

  7. MySQL三大范式详解(小白也能懂哦)

    1.范式基础 1.1范式的概念 设计数据库的时候需要遵从的一些规范,目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).巴斯-科德范式(BCNF).第四范式(4NF) ...

  8. 数据库设计三大范式【转载】

    数据库设计范式 什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系.所以建立科学的,规范的的数据库是需要满足一些 规范的来优化数据数据存储方式.在关系型数据库中 ...

  9. mysql数据库设计三大范式_了解数据库设计三大范式

    数据库设计范式 什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系.所以建立科学的,规范的的数据库是需要满足一些 规范的来优化数据数据存储方式.在关系型数据库中 ...

最新文章

  1. linux 内核模块 警告 initialization from incompatible pointer type 解决方法
  2. 和中医学习到的养生方法和知识
  3. mysql端口被占用_MySQL重启端口被占用处理
  4. .netcore下的微服务、容器、运维、自动化发布
  5. 银行营业网点管理系统——dao包(BaseDao)
  6. python中参数的顺序和sys.argv顺序要一样么_Python中 sys.argv[]的用法简明解释
  7. 树莓派 4G模块 PPP 拨号 NDIS 拨号
  8. junit return null该怎么测试_3 分钟生成一个单元测试报告,这个样式爱了
  9. LeetCode 45 跳跃游戏||
  10. 最小方法ZOJ 1579 Bridge
  11. mysql的number范围_数据库number类型精度实用分析
  12. Android Fingerprint完全解析(一) :Fingerprint整体框架
  13. 猜词游戏之JavaScript实现
  14. Buzzsumo大型教程(内容营销+外链outreach必备)营销神器
  15. 你觉得自己牛逼在哪儿?
  16. 关于学习Qt编程的好书精品推荐
  17. Verilog HDL 硬件描述语言基础
  18. 我终于知道了M键和右Shift之间的逗号、句号、斜杠是C#的Keys的哪个了。
  19. 移动端h5唤起键盘_移动端H5监听键盘弹出和收起
  20. Windows Server 2012 R2单域及域森林环境搭建

热门文章

  1. linux查看文件写进程,Linux下如何知道文件被那个进程写
  2. Merge Sorted Array 合并两个有序数组
  3. android中的Filter接口简介
  4. linux ls -l 命令 详解
  5. [python] raw string,反斜杠\,re Lib
  6. 苹果原生文字转语音播报
  7. 4.Vue跨域session问题解决
  8. stata导入数据问题
  9. Linux配置手册(八)基于MySQL构建PHP环境
  10. vscode+sftp 开发模式环境的同步