欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据表设计——范式

程序员文章站 2024-03-08 15:58:58
...

一、第一范式 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有依赖关系,所以不符合第三范式。

相关标签: 数据库 mysql