设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
数据冗余是指数据之间的重复,也可以说是同一数据存储在不同数据文件中的现象
根据数据库冗余的大小,目前关系型数据库有六种范式,各种范式呈递次规范,越高的范式数据库冗余越小。
六种范式:
一般遵循 前三种范式即可
第一范式(1NF): 强调的是字段的原子性,即一个字段不能够再分成其他几个字段。
这种表结构设计就没有达到 1NF,要符合 1NF 我们只需把字段拆分,即:把 contact 字段拆分成 name 、tel、addr 等字段。
第二范式(2NF): 满足 1NF的基础上,另外包含两部分内容
OrderDetail表的主键是什么?
主键的定义:能够确定唯一一行记录的特殊字段
create table test (
name varchar(19),
id int,
primary key (name,id)
)
这里有主键由OrderID和ProductID共同组成
同时 UnitPrice 和 ProductName 这里两个字段 与ProductID的从属关系强于他们同OrderID的从属关系
第三范式(3NF): 满足 2NF
另外非主键字段必须直接依赖于主键,不能存在传递依赖。
即不能存在:非主键字段 A 依赖于非主键字段 B,非主键字段 B 依赖于主键的情况。
因为 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键字段都完全依赖于主键(OrderID),所以符合 2NF。
不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
把【Order】表拆分为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。
概念:
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
三范式: