【转载】关系型数据库设计范式

为了建立冗余较小、结构合理的关系数据库,设计关系数据库时必须遵循一定的规则, 即关系数据库的设计范式。

第一范式(First Normal Form, 1NF)

关系型数据库的第一范式要求:

  • 所有字段都是不可分割的

举例来说,客户数据表中包含客户名和地址,地址由城市和街道组成。应用经常需要分别访问城市或街道字段。

数据表customers(name,city, street)是符合第一范式的,而数据表customers(name,address)则不满足第一范式的要求。

定义一个满足第一范式的数据表:

courses(student_id, course_id, school_name, president, credit)
primary key(student_id, course_id)

上表仍然存在四个问题:

  • 数据冗余: school_name, president属性重复出现
  • 插入异常: 若一个新建school没有开始招生则不能加入数据表中
  • 删除异常: 若一学院所有学生均毕业,则该学院信息消失
  • 修改异常: 若一学院院长更换,则需修改该学院所有学生的数据;

若一学生转院则需修改其所选所有课程的数据。

第二范式(Second Normal Form, 2NF)

第二范式是在第一范式的基础上定义的,它要求:

  • 表的设计满足第一范式
  • 除主键外所有属性完全函数依赖于主键

候选码是函数决定所有非主属性的最小集合,但不排除候选码的真子集决定某些而非全部非主属性的情况.

而2NF禁止候选码的真子集函数决定任何非主属性.

如上文数据表:

courses(student_id, course_id, school_name, president, credit)
primary key(student_id, course_id)

school_name和president属性依赖于student_id属性,不依赖于course_id属性。

也就是说school,president属性部分函数依赖于主键,不满足第二范式的要求。

若将上表拆分为两个数据表:

courses(student_id, course_id, credit)
primary key(student_id, course_id)

students(student_id, school_name, president)
primary key(student_id)

拆分后的数据表满足了第二范式的要求。

现在分析一下,第一范式没有解决的四个问题:

  • 数据冗余: 减少了school_name和president重复出现的次数
  • 插入异常: 未解决
  • 删除异常: 未解决
  • 修改异常: 解决了学生转院的问题,未解决院长更换的问题

第三范式(Third Normal Form, 3NF)

第三范式定义在第二范式的基础上:

  • 表的设计满足第二范式的要求
  • 除非主属性直接依赖于主键

看上文数据表的定义

students(student_id, school_name, president)
primary key(student_id)

存在传递函数依赖student_id->school_name->president,不满足第三范式。

进行进一步拆分:

courses(student_id, course_id, credit)
primary key(student_id, course_id)

students(student_id, school_name)
primary key(student_id)

schools(school_name, president)
primary key

拆分后消除了传递函数依赖。

分析第三范式对上述四个问题处理。

  • 数据冗余: 除了主键外所有属性只出现一次
  • 删除异常: 允许删除所有学生而保留学院信息
  • 插入异常: 允许建立没有学生的学院
  • 更新异常: 更换院长,学生转院均只需修改一条记录

第三范式基本上可以解决上述问题。

BCNF

BC(Boyce-Codd)范式在3NF的基础上进一步消除了传递依赖.

BCNF要求:

  • 关系模式符合3NF
  • 函数依赖集F中所有函数依赖X->F, 左部X必须包含R的所有候选码.

即所有候选码都直接决定所有非主属性.

BCNF分解算法

给定关系模式R和其上的函数依赖集F, 将R进行满足BCNF的无损连接分解:

  1. 置初值p = {R}
  2. 检查p中的关系模式若均满足BCNF则停止分解, 否则重复执行3.
  3. 在p中选出不满足BCNF的关系模式S, 其中必有非平凡依赖B->C, 且B不是S的候选码.将S分解为S1= {B,C}和S2 = R - {C}, 用S1,S2代替p中S的位置.

示例:

R = {A, B, C} F = {A->B, B->C}

候选码A, 函数依赖B->C, 因为B不是Candidate Key所以要进行分解:

{B, C} {A, B}

第四范式(Forth Normal Form, 4NF)

4NF要求:

  • 必须满足BCNF
  • 非主属性不能存在多值

示例:

phone(user_id,  phone, cell)

若某用户有多个phone同时又有多个cell时此表设计显然不合理.

可以采用如下的拆分方案:

phone(user_id, phone, type)

拆分后的数据表满足了4NF.

原文地址:https://www.cnblogs.com/ralap7/p/9029359.html

时间: 2024-08-26 19:13:09

【转载】关系型数据库设计范式的相关文章

关系型数据库设计范式

范式: 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小. 首先要明白”范式(NF)”是什么意思.按照教材中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”.很晦涩吧?实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别. 就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等.数据库范式也分为1NF,2NF,3NF,BCN

关系型数据库三大范式

基础概念:关键字.主关键字.候选关键字,非关键字 如果某个字段或多个字段的值可以唯一地标识一条记录,则该字段或字段组就称为关键字.如果一个关键字是用以标识每条记录的唯一性,并作为该表与其他表实现关联之用,则称其为主关键字(主键,primary key)或主码.除主关键字以外的其他关键字称为候选关键字. 除关键字意外的字称为非关键字 例如,有一个表字段为:id  firstname lastname address phone IDcard那么id或IDcard或firstname+lastnam

数据库设计范式实例解析

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

Oracle笔记(十六) 数据库设计范式

Oracle笔记(十六) 数据库设计范式 数据库设计范式是一个很重要的概念,但是这个重要程度只适合于参考.使用数据库设计范式,可以让数据表更好的进行数据的保存,因为再合理的设计,如果数据量一大也肯定会存在性能上的问题.所以在开发之中,唯一可以称为设计的宝典 -- 设计的时候尽量避免日后的程序出现多表关联查询. 一.第一范式 所谓的第一范式指的就是数据表中的数据列不可再分. 例如,现在有如下一张数据表: CREATE TABLE member ( mid NUMBER PRIMARY KEY, n

数据库设计--范式的理解

原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11706874.html 关系型数据库的设计范式. 1?? 第一范式 : (基础NF)每一个列都不能再拆分. 例子:“身高体重”列, 还能拆分为“身高”和“体重”两列! 2?? 第二范式: (在1NF的基础上)非主键列对主键完全依赖.(在1NF的基础上消除非主键列对主键(联合主键)的部分依赖) 例子:“订单号”列和“商品号”列为联合主键,该行应该显示的是对应订单号中的商品号对应的具体商品的信息

形象了解关系型数据库三大范式

接下来就对每一级范式进行一下解释,首先是第一范式(1NF).符合1NF的关系(你可以理解为数据表."关系"和"关系模式"的区别,类似于面向对象程序设计中"类"与"对象"的区别."关系"是"关系模式"的一个实例,你可以把"关系"理解为一张带数据的表,而"关系模式"是这张数据表的表结构.1NF的定义为:符合1NF的关系中的每个属性都不可再分.表1所示的

写给开发者看的关系型数据库设计

目录 一 Codd的RDBMS12法则——RDBMS的起源 二 关系型数据库设计阶段 三 设计原则 四 命名规则 数据库设计,一个软件项目成功的基石.很多从业人员都认为,数据库设计其实不那么重要.现实中的情景也相当雷同,开发人员的数量是数据库设计人员的数倍.多数人使用数据库中的一部分,所以也会把数据库设计想的如此简单.其实不然,数据库设计也是门学问. 从笔者的经历看来,笔者更赞成在项目早期由开发者进行数据库设计(后期调优需要DBA).根据笔者的项目经验,一个精通OOP和ORM的开发者,设计的数据

关系型数据库设计

转自:http://www.cnblogs.com/MeteorSeed/archive/2013/03/27/2880054.html ------------------------------------------------------------------------------------- 目录 一 Codd的RDBMS12法则——RDBMS的起源 二 关系型数据库设计阶段 三 设计原则 四 命名规则 数据库设计,一个软件项目成功的基石.很多从业人员都认为,数据库设计其实不那么

数据库设计范式

数据库设计三大范式 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个: 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式. 第一范式的合理遵循需要根据系统的实际需求来定.比如某些数据库系统中需要用到“地址”这个属性,本来直接将“