数据表设计——范式

一、第一范式 1NF

数据表中的所有字段都是不可分割的原子值

create table student(
	id int primary key,
	name varchar(20),
	contact varchar(30)
);
---contact字段是可以拆分的
insert into student values(1,'张三','8159758,17625364718');
insert into student values(2,'李四','6547621,18743627162');
insert into student values(3,'王五','1253512,13345671243');

联系方式字段可以被分为座机和手机,所以不符合第一范式。不符合第一范式的要求,也就不是关系型数据库
但是,仅仅满足第一范式,会存在数据冗余过大,插入异常,删除异常,修改异常的问题。例如下表:
在这里插入图片描述

二、第二范式 2NF

必须满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖于主键。如果要出现不完全依赖,只可能发生在联合主键的情况下。

---订单表
create table myorder(
	product_id int,
	customer_id int,
	product_name varchar(20),
	customer_name varchar(20),
	primary key(product_id,customer_id)
);

问题:产品的名字只与产品id有关,顾客名字只与顾客名字有关,只依赖于主键的部分字段,所以不符合第二范式。
要进行拆表,以使其符合第二范式。

---拆表后均完全依赖主键
create table myorder(
	id int primary key,
	product_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)
);

三、第三范式 3NF

必须先满足第二范式,除主键列的其他列不能有传递依赖关系,即相互独立。

create table myorder(
	order_id int primary key,
	product_id int,
	customer_id int,
	product_name varchar(20)
);

product_name还和product_id有依赖关系,所以不符合第三范式。

发布了60 篇原创文章 · 获赞 6 · 访问量 1207

猜你喜欢

转载自blog.csdn.net/DLC990319/article/details/105046690