数据库的三大范式
1. 第一范式:1NF
数据表中的字段都是不可分割的原子值。
create table student2(
id int primary key,
name varchar(20),
address varchar(30)
);
insert into student2 values(1, '张三','中国浙江省余姚市阳明西路269号');
insert into student2 values(2, '李四','中国浙江省余姚市阳明西路169号');
insert into student2 values(3, '王五','中国浙江省余姚市阳明西路369号');
select * from student2;
+----+--------+--------------------------------------------+
| id | name | address |
+----+--------+--------------------------------------------+
| 1 | 张三 | 中国浙江省余姚市阳明西路269号 |
| 2 | 李四 | 中国浙江省余姚市阳明西路169号 |
| 3 | 王五 | 中国浙江省余姚市阳明西路369号 |
+----+--------+--------------------------------------------+
-- 字段还可以拆分,不满足第一范式。
create table student3(
id int primary key,
name varchar(20),
country varchar(30),
privence varchar(30),
city varchar(30),
detail varchar(30)
);
insert into student3 values(1, '张三', '中国', '浙江省', '余姚市', '姚明西路269号');
insert into student3 values(2, '里斯', '漂亮国', '麻省', '黑市', '地堡大道扛把子号');
insert into student3 values(3, '普京', '俄国', '西伯利亚', '莫斯科', '卢布廖夫卡信号');
update student3 set name='陆民' where id=1;
select * from student3;
+----+--------+-----------+--------------+-----------+--------------------------+
| id | name | country | privence | city | detail |
+----+--------+-----------+--------------+-----------+--------------------------+
| 1 | 陆民 | 中国 | 浙江省 | 余姚市 | 姚明西路269号 |
| 2 | 里斯 | 漂亮国 | 麻省 | 黑市 | 地堡大道扛把子号 |
| 3 | 普京 | 俄国 | 西伯利亚 | 莫斯科 | 卢布廖夫卡信号 |
+----+--------+-----------+--------------+-----------+--------------------
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)
);
上表中,除主键以外的其他列,只依赖与主键部分字段。
进行拆表。
create table myorder(
order_id int primary key,
pruduct_id int,
customer_id int
);
create table product(
id int primary key,
name varchar(20)
);
create table customer(
id int primary key,
name varchar(20)
);
分成3个表之后,满足第二范式。
3. 第三范式:3NF
必须先满足第二范式,第三范式要求:除开主键外的其他列,不能有传递依赖。
create table myorder(
order_id int primary key,
pruduct_id int,
customer_id int,
customer_phone varchar(15)
);
--- 改为:
create table myorder(
order_id int primary key,
pruduct_id int,
customer_id int
);
create table product(
id int primary key,
name varchar(20),
phone varchar(15)
);