你别看我平时对你,一副漠不关心的样子,其实背地里说了你很多坏话。

 

mysql 数据库设计规范一般遵循三大范式 NF(Normal Form),数据库的范式设计得越高阶,冗余度就越低,同时高阶的范式一定满足低阶的范式的要求。

第一范式

1NF,强调的是列的原子性,也就是列不能再被分割。

例如:如电话列可进行拆分---家庭电话、公司电话

 

第二范式

2NF,首先是 1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列。

 

第三范式

3NF,首先是 2NF,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖)。

例如:为了理解第三范式,需要根据Armstrong公里之一定义传递依赖。假设A、B和C是关系R的三个属性,如果A-〉B且B-〉C,则从这些函数依赖中,可以得出A-〉C,如上所述,

依赖A-〉C是传递依赖。
例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客
编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。

 

总结:

第一范式:确保每列的原子性
第二范式:非主键列完全依赖着主键列
第三范式:非主键列之间不存在依赖关系