SQL注入 三范式

学习目标

  • 了解三范式的要求

1. 什么是范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

SQL注入 三范式_第1张图片

实际上家用电器都有节能标识,同时也会根据耗能不同进行等级的划分, 同样的数据库实际上也有这么个 ”节能标识 ” ,那就是范式.

2. 范式的划分

根据数据库冗余的大小,目前关系型数据库有六种范式,各种范式呈递次规范,越高的范式数据库冗余越小。

  • 第一范式(1NF)

  • 第二范式(2NF)

  • 第三范式(3NF)

  • 巴斯-科德范式(BCNF)

  • 第四范式 ( 4NF)

  • 第五范式(5NF,又称完美范式)

一般遵循前三种范式即可

3. 一范式

第一范式(1NF): 强调的是字段的原子性,即一个字段不能够再分成其他几个字段。

SQL注入 三范式_第2张图片

上图这种表结构设计就没有达到 1NF,要符合 1NF 我们只需把字段拆分,即:把 contact 字段拆分成 name 、tel、addr 等字段。

SQL注入 三范式_第3张图片

4. 二范式

第二范式(2NF): 满足 1NF的基础上,另外包含两部分内容

  • 一是表必须有一个主键

  • 二是非主键字段必须完全依赖于主键,而不能只依赖于主键的一部分

图片

思考:

OrderDetail表的主键是什么?

主键的定义:能够确定唯一一行记录的特殊字段 主键可以是多个字段共同组成

SQL注入 三范式_第4张图片

在这里这里主键是由OrderID和ProductID共同组成, 只有通过OrderID和ProductID两个字段才可以确定唯一一行记录, 所以他们共同组成主键.

注意:

同时 UnitPrice 和 ProductName 这里两个字段 与ProductID的从属关系强于他们同OrderID的从属关系, 也就是说非主键字段 UnitPrice 和 ProductName 没有完全依赖于主键,而只依赖于主键的一部分, 这是不符合二范式要求的

SQL注入 三范式_第5张图片

上图的表才是符合二范式要求的表格

5. 三范式

第三范式(3NF): 满足 2NF, 另外非主键字段必须直接依赖于主键,不能存在传递依赖, 即不能存在:非主键字段 A 依赖于非主键字段 B,非主键字段 B 依赖于主键的情况

图片

观察上图, 因为 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键字段都完全依赖于主键(OrderID),所以符合 2NF。

不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。

SQL注入 三范式_第6张图片

把【Order】表拆分为【Order】(OrderID,OrderDate,CustomerID)和

【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。

总结:

范式:

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,

各种范式呈递次规范,越高的范式数据库冗余越小。

三范式:

  • 第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列。

  • 第二范式(2NF): 满足 1NF,另外包含两部分内容,

  • 一是表必须有一个主键;

  • 二是非主键字段 必须完全依赖于主键,而不能只依赖于主键的一部分。

  • 第三范式(3NF): 满足 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。


你可能感兴趣的:(oracle,数据库,sql)