数据表设计——范式
程序员文章站
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
有依赖关系,所以不符合第三范式。
上一篇: 1.用Java实现菱形星塔
下一篇: 查询Mysql数据库中数据量最大的数据表