--------关系

--------范式

一、三种关系

1、一对一关系

关系数据库中,第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。

2、一对多关系

关系数据库中,第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。

一对多并不是一对多列,列不能一对多,只能一对多行。

一对多关系,一般是一个表的主键对应另一个表的非主键,主键的值是不能重复的,而非主键值是可以重复的,
一个主键值对应另一个表的非主键的值,那么就只有一个值对一个值或一个值对多个值两种可能,故称一对多。

3、多对多关系

关系数据库中,第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。

举个栗子:

科目表与学生表,这俩个表存在这种现象:一个科目存在多个对应的学生,一个学生也可以学习多个科目.

这种现象为多对多关系,要表示多对多的关系,必须创建第三张表"链接表",然后将前两张表中的主键存入链接表,通过链接表记录匹配关系.

二、范式

1、1NF(第一范式)

1NF的定义为:符合1NF的关系中的每个属性都不可再分。

第一范式是指数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。

如下表所示,不符合1NF:

简而言之,第一范式就是无重复的列。

  例如,

由“职工号”“姓名”“电话号码组成的表(一个人可能有一部办公电话和一部移动电话),

这时将其规范化为1NF可以将电话号码分为“办公电话”和“移动电话”两个属性,即职工(职工号,姓名,办公电话,移动电话)。

再如下图所示

          虽然符合1NF,但是存在冗余过大/插入异常/删除异常/修改异常

          

①每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应的系主任的数据也重复多次——数据冗余过大

②假如新增系,无法单独添加系名与系主任——插入异常

③假设与某个系相关的学生全部删除,那么该系都会被删除——删除异常

④假设一名同学转系,为了保证数据库数据的统一性,需要修改三条记录中系与系主任的数据。——修改异常。

正因为仅符合1NF的数据库设计存在着这样那样的问题,我们需要提高设计标准,去掉导致上述四种问题的因素,使其符合更高一级的范式(2NF),这就是所谓的“规范化”。

2、第二范式

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。

2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。

例如,

在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),

但由于非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,

因此此种方式会导致数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:

            学生表(学号,课程号,分数)和课程表(课程号,学分),

新关系通过学生表中的外关键字课程号联系,在需要时进行连接。

3、第三范式

NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

以学生表(学号,姓名,课程号,成绩)为例,其中学生姓名无重名,

所以该表有两个候选码(学号,课程号)(姓名,课程号),故存在函数依赖:

                学号——>姓名,(学号,课程号)——>成绩,

唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,所以属性属于第三范式。

4、BC范式

构建在第三范式的基础上,如果关系模型R是第一范式,且每个属性都不传递依赖于R的候选键,那么称R为BCNF的模式。

假设仓库管理关系表(仓库号,存储物品号,管理员号,数量),满足一个管理员只在一个仓库工作;一个仓库可以存储多种物品,则存在如下关系:

(仓库号,存储物品号)——>(管理员号,数量)

(管理员号,存储物品号)——>(仓库号,数量)

所以,(仓库号,存储物品号)和(管理员号,存储物品号)都是仓库管理关系表的候选码,表中唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

(仓库号)——>(管理员号)

(管理员号)——>(仓库号)

即存在关键字段决定关键字段的情况,因此其不符合BCNF。

把仓库管理关系表分解为两个关系表仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),

这样这个数据库表是符合BCNF的,并消除了删除异常、插入异常和更新异常。

Sql入门学习——关系范式的更多相关文章

  1. SQL入门学习5-函数、为此、CASE表达式

    6-1. 各种各样的函数 函数的种类 算数函数 字符串函数 日期函数 转换函数 聚合函数 1.1算术函数 数据类型:NUMERIC 是大多数DBMS都支持的一种数据类型. 通过NUMBERIC(全体位 ...

  2. SQL入门学习3-数据更新

    4-1 数据的插入(INSERT语句的使用方法) 使用INSERT语句可以向表中插入数据(行).原则上,INSERT语句背刺执行一行数据插入. CREATE TABLE 和INSERT 语句,都可以设 ...

  3. SQL入门学习2-聚合与排序

    3-1 对表进行聚合查询 聚合函数 所谓聚合,就是将多行汇总为一行. 函数名 功能 COUNT 计算表中的记录数(行数) SUM 计算表中数值列的数据合计值 AVG 计算表中数值列的数据平均值 MAX ...

  4. SQL入门学习1-查询基础

    2-1 SELECT语句基础 SELECT语句作用 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). 重点 使用SELECT语句从表中选取数据. 为列设定显示用的别名 ...

  5. SQL入门学习0-数据库与SQL

    1.1 DBMS DatabaseManagermentSystem 数据库管理系统 DBMS种类 层次型数据库(HDB) 最古老的数据库之一,把数据通过层次结构的方式表现. 关系型数据库(RDB) ...

  6. SQList3 and SQL入门学习笔记

    SQL 这是一个标准的计算机语言进行访问和操作数据库. 什么是 SQL? ·       SQL 指结构化查询语言 ·       SQL 使我们有能力訪问数据库 ·       SQL 是一种 AN ...

  7. SQL入门学习6-集合运算

    7-1 表的加减法 集合运算 集合运算就是对满足同一规则的记录,进行的加减等四则运算. 1.1 表的加法--UNION 表之间进行并集运算. 语法: SELECT 对应列1,对应列2-- FROM 表 ...

  8. SQL入门学习4-复杂查询

    5-1 视图 视图和表 视图和表的区别只有一个是否保存了实际的数据 使用INSERT和SELECT实际上就是从存储设备中读取数据,各种计算后,将数据呈现给用户. 视图不会将数据保存在存储设备中.实际上 ...

  9. Sql入门学习——基本语法函数

    --------使用工具navicat 快捷键操作 --------基本操作DML &DDL --------运算比较 --------数据类型 --------常用函数 --------常用 ...

随机推荐

  1. webdriver +浏览器驱动

    webdriver 经常使用的驱动有ChromeDriver , Firefox 驱动和IE驱动. 在使用的时候需要将对应的驱动下载到本地放到Python的安装路径下,然后添加路径到系统环境变量. 有 ...

  2. OpenCV学习(一)基础篇

    OpenCV 2 计算机视觉编程手册读书笔记1 矩阵创建 Mat类是OpenCV中非常有用类,用来创建和操作多维矩阵.可以有很多方法构造它. // 构造函数 //! constructs 2D mat ...

  3. linq的基本使用

    1.查询所有的偶数 , , , , , , , , , , , , }; var elist = from s in str == select s; foreach (int i in elist) ...

  4. MacOs 安装cordova报无权访问题解决方案

    在MacOS安装cordova后,执行cordova -v报错: Error: EACCES: permission denied, open '/Users/jianuonuo/.config/co ...

  5. Java面试通关秘籍汇总集

    一.基础篇 1.1.Java基础 面向对象的特征:继承.封装和多态 final, finally, finalize 的区别 Exception.Error.运行时异常与一般异常有何异同 请写出5种常 ...

  6. linux vi命令详解

    刚开始学着用linux,对vi命令不是很熟,在网上转接了一篇. vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 ...

  7. go延时队列

    package main import ( "errors" "flag" "fmt" log "github.com/cihub ...

  8. 使用try和catch捕获异常

    Java程序在执行过程中如果出现异常,会自动生成一个异常对象,该异常对象将被自动提交给JVM,当JVM接收到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获(cat ...

  9. python学习之路08——元组、集合

    一. 元组 1.概念 列表:是一种有序的集合 元组和列表的区别: ​ a.列表:[] 元组:() ​ b.列表中的元素可以进行增加和删除操作,但是,元组中的元素不能进行修改 ​ c.相同点:都是一种容 ...

  10. 20155208 徐子涵 Exp3 免杀原理与实践

    20155208 徐子涵 Exp3 免杀原理与实践 基础问题回答 (1)杀软是如何检测出恶意代码的? 一种是基于特征码的检测,另一种是基于恶意行为的检测. (2)免杀是做什么? 在我看来,免杀就是要达 ...