mysql学习笔记(5)数据库的三种设计范式

一、第一范式 1NF

第一范式数据表中的字段都是不可分割的原子值。

所谓第一范式,就是数据表的列不可再分。

create table student2 (
    id int,
    name varchar(20),
    address varchar(30)
);

insert into student2 value(1,'张三','蔡村');
insert into student2 value(2,'李四','景村');
insert into student2 value(3,'王五','站村');

mysql> select * from student2;
+------+------+---------+
| id   | name | address |
+------+------+---------+
|    1 | 张三 | 蔡村    |
|    2 | 李四 | 景村    |
|    3 | 王五 | 站村    |
+------+------+---------+
3 rows in set (0.00 sec)
#字段值还可以继续拆分的就不满足第一范式1NF

 下面这个数据表可以使用第一范式:

create table student3 (
    id int,
    name varchar(20),
    country varchar(30),
    privence varchar(30),
    city varchar(30),
    details varchar(30)
);

mysql> desc student3;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| country  | varchar(30) | YES  |     | NULL    |       |
| privence | varchar(30) | YES  |     | NULL    |       |
| city     | varchar(30) | YES  |     | NULL    |       |
| details  | varchar(30) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

insert into student3 value(1,'张三','中国','山东省','青岛市','崂山区青城大道305号');
insert into student3 value(2,'李四','中国','湖北省','武汉市','洪山区珞狮路122号');
insert into student3 value(3,'王五','中国','广东省','广东市','北环路52号');

mysql> select * from student3;
+------+------+---------+----------+--------+---------------------+
| id   | name | country | privence | city   | details             |
+------+------+---------+----------+--------+---------------------+
|    1 | 张三 | 中国    | 山东省   | 青岛市 | 崂山区青城大道305号 |
|    2 | 李四 | 中国    | 湖北省   | 武汉市 | 洪山区珞狮路122号   |
|    3 | 王五 | 中国    | 广东省   | 广东市 | 北环路52号          |
+------+------+---------+----------+--------+---------------------+
3 rows in set (0.01 sec)
#country、privence、city、detail可作为范式

一般范式设计的越详细,对于实际操作越好 。

二、第二范式 2NF

在满足第一范式的基础上,第二范式要求,除主键外的每一列都必须依赖完全于主键。(表中非主键列不存在对主键的部分依赖)

联合主键可能不依赖。

例1.设计一个订单表

create table myorder (
    product_id int,
    customer_id int,
    priduct_name varchar(20),
    customer_name varchar(20),
    primary key (product_id,customer_id) #这两个id共同组成了订单中的主键
);

--问题?
--除主键外的字段不完全依赖于主键。因此不满足第二范式。
--拆表。

create table myorder (
    order_id int primary key,
    product_id int,
    customer_id int          --product_id和customer_id完全依赖于order_id
);
create table product (
    id int primary key,
    name varchar(20)         --name完全依赖于id
);
create table customer (
    id int primary key,
    name varchar(20)         --name完全依赖于id
);

--分成三个表后就满足了第二范式的设计。

例2.学生选课表 

学号(主键)课程(主键)成绩课程学分
10001数学1006
10001语文902
10001英语853
10002数学906
10003数学996
10004语文892

表中主键为 (学号,课程),我们可以表示为 (学号,课程) -> (成绩,课程学分), 表示所有非主键列 (成绩,课程学分)都依赖于主键 (学号,课程)。

但是,表中还存在另外一个依赖:(课程)->(课程学分)。这样非主键列 ‘课程学分‘ 依赖于部分主键列 ’课程‘, 所以上表是不满足第二范式的。

我们把它拆成如下2张表:

学生选课表:

学号(主键)课程(主键)成绩
10001数学100
10001语文90
10001英语85
10002数学90
10003数学99
10004语文89


 课程信息表:

课程(主键)课程学分
数学6
语文3
英语2

 那么上面2个表,学生选课表主键为(学号,课程),课程信息表主键为(课程),表中所有非主键列都完全依赖主键。不仅符合第二范式,还符合第三范式。 


再看这样一个学生信息表:

学号(主键)姓名性别班级班主任
10001张三一班小王
10002李四一班小王
10003王五二班小李
10004张小三二班小李

上表中,主键为:(学号),所有字段 (姓名,性别,班级,班主任)都依赖与主键(学号),不存在对主键的部分依赖。所以是满足第二范式。

三、第三范式 3NF

第三范式定义是,满足第二范式,并且表中的列不存在对非主键列的传递依赖。(除开除主键列外的其他列之间不能有传递依赖)

create table myorder (
    order_id int primary key,
    product_id int,
    customer_id int          --product_id和customer_id完全依赖于order_id
    customer_phone varchar(11)  --customer_phone和非主键的customer_id之间有联系。
);
--非第三范式。

--修改成这样:
create table myorder (
    order_id int primary key,
    product_id int,
    customer_id int          
);
create table customer (
    id int primary key,
    name varchar(20),         --name完全依赖于id
    phone varchar(11)         --放到customer里就行了
);
满足了第三范式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值