数据库的三大设计范式
1.第一范式(1NF)
-
数据表中的所有字段都是不可分割的原子值
#示例一 create table student2( id int primary key, name varchar(20), address varchar(30)); insert into student2 values(1,"张三","中国新疆昌吉玛纳斯"); insert into student2 values(2,"李四","中国新疆石河子玛纳斯"); insert into student2 values(3,"王五","中国新疆伊犁新源"); insert into student2 values(4,"赵六","中国新疆卡拉玛依乌尔禾"); #输出结果 +----+------+------------------------+ | id | name | address | +----+------+------------------------+ | 1 | 张三 | 中国新疆昌吉玛纳斯 | | 2 | 李四 | 中国新疆石河子玛纳斯 | | 3 | 王五 | 中国新疆伊犁新源 | | 4 | 赵六 | 中国新疆卡拉玛依乌尔禾 | +----+------+------------------------+ #如图所示address中还可以继续拆分所以不满足第一范式 #示例二 create table student3( id int primary key, name varchar(20), contry varchar(30), privence varchar(30), city varchar(30), distrct varchar(30) ); insert into student3 values(1,"张三","中国","新疆","昌吉","玛纳斯"); insert into student3 values(2,"李四","中国","新疆","石河子","玛纳斯"); insert into student3 values(3,"王五","中国","新疆","伊犁","新源"); insert into student3 values(4,"赵六","中国","新疆","卡拉玛依","乌尔禾"); #输出结果 +----+------+--------+----------+----------+---------+ | id | name | contry | privence | city | distrct | +----+------+--------+----------+----------+---------+ | 1 | 张三 | 中国 | 新疆 | 昌吉 | 玛纳斯 | | 2 | 李四 | 中国 | 新疆 | 石河子 | 玛纳斯 | | 3 | 王五 | 中国 | 新疆 | 伊犁 | 新源 | | 4 | 赵六 | 中国 | 新疆 | 卡拉玛依 | 乌尔禾 | +----+------+--------+----------+----------+---------+ #最小地址不可再分,所以满足第一范式
2.第二范式(2NF)
-
在满足第一字段的前提下,第二范式要求,除主键外其他列必须完全依赖与 主键。
-
如果出现不完全依赖,只可能发生在联合主键的情况下。
#示例一 create table myorder( product_id int, customer_id int, product_name varchar(20), customer_name varchar(20)), primary key(product_id,customer_id)); ## 问题??? #除主键外的其他列,只依赖与主键的部分字段(不满足2NF),其实适合联合主键的只要两个加起来不相同就行的特点有关 #解决——拆表 #示例二 #对表进行拆分 create table myorder( order_id int primary key, product_id int, customer_id int); create table product( id int primary key, name varchar(20)); create table customer( id inr primary key, name varchar(20)) #--分成三个表之后,就满足了第二范式
第三范式(3NF)
-
必须先满足第二范式,除开主键的其他列之间不能有传递依赖关系。
#示例一(不满足3NF) create table myorder( order_id int primary key, product_id int, customer_id int, customer_phone int); #严重依赖customer_i又依赖主键d,customer_id #示例二(可修改为) create table customer( id int primary key, name varchar(20), phone varchar(15));