大家好,我是jacky,很高兴继续跟大家学习MySQL数据分析这门课,上次课我们介绍了E-R图,我们要给手机销售公司设计数据库,那么同一个项目,10个设计人员可能设计出10种不同的E-R图;因为不同的设计人员会从不同的角度,标识出不同的实体,而每个实体又包含不同的属性,自然设计出的下E-R图也就不同了;
正是因为有这个原因,所以我们自然就要想办法找出一个E-R图设计优劣或者说好坏的标准,大家说是不是,有了这个标准,我们才能找出最优的设计数据库的方案,那么,这个标准就是数据的三大范式;
这里,我估计肯定会有朋友抱怨了,说jacky,你讲的太理论了,一定不实操啊,别着急,jacky从这节课开始就给大家用SQL语句来举例,并且通过对数据库设计三大范式的讲解,我们才能更好的理解SQL语句背后的含义,jacky的课程不会向其他课程一样,只告诉你SQL语句是什么,我一定要告诉你SQL语句为什么要这样来写,好,言归正传,开始我们三大范式的讲解;
(一)模拟创建数据库
1.如何处理数据冗余
好,在没有教授SQL语句之前,我们还不知道怎样用SQL语句在数据库中创建表,我们现在文件夹中,用excel这个二维表来模拟这个过程;
- 第一步,我们创建一个命名为手机销售公司数据库的文件夹,这个数据库里是不是可以放很多表,是吧,我们先放一个员工表,可以吧,记录和存储这家公司的员工信息;
我们看这张表有什么问题?
- 我们发现在部门这列,有4条记录都出现了“开发部”,在数据库里,我们把数据重复的现象叫做“数据冗余”,因为存在重复的数据,我们就有必要简化;
下面的问题是:我们该怎样把重复的数据做简化呢,我们常用的方法是分类存储,好,对于上面的员工表,我们拆分成两张表,员工表之外,我们在创建一张部门编码表;
好,通过这样拆分表的方法,我们就解决了数据重复冗繁的问题;
上面,将我们讲的知识理论化,就是数据库设计的第一范式(1NF):如果二维表中有的列包含多种信息,我们可以把它抽取出来成为一个单独的表;
2.如何保证数据可以快速查找数据
2.1 问题的提出
我们之所以要创建数据库,就是因为可以方便我们随时调用数据库中的数据库,那么,在我们实际工作中,数据库中的数据网网都是海量的,拿我们上面那个用户表,如何表中的姓名列,我们的数据是海量的,比如说有十几万表,或几百万条,我们要筛选出jacky这个姓名,我们在Excel中,是不是使用查找,是吧,如果电脑配置不够高,我们用查找还是比较卡的;那么在数据库中,我们SQL语句中where来查找,速度也是比较慢的;这里jacky还没开始教大家用SQL语句呢,是吧,这里我用SQL语句给大家演示一下这个过程,大家能看懂,就看懂,看不懂没关系,下面的课程都是围绕SQL语句来讲的,今天就是给大家一个预热和印象;
2.2 SQL语句预热和演示
好,下面jacky就跟大家演示怎样查询才能提供数据的查询效率和速度,然后引出主键的概念,最后给大家总结数据库第二范式和第三范式;
#1.打开MySQL客户端
#1.1 连接服务器
sudo /usr/local/mysql/support-files/mysql.server start
#1.2 连接MySQL客户端
mysql -u root -p
#2.创建使用数据库
use test;
#3.创建表
create table staff( nid int not null auto_increment, name char(10), index(nid));
#4.向创建的表中插入数据
insert into staff(name)values('jacky');
#5.查看新创建表中的数据
select * from staff;
#6.查找name列中jacky的字段
#6.1 不通过主键查找;
select * from staff where name='jacky';
#6.2 通过主键查找;
select * from staff where nid=1;
- 通过上面的这段代码,在没讲SQL 之间,jacky只想告诉大家用where name=’jacky’来在海量数据中查询数据是没有效率的,所以在数据库设计时,就会设置主键,也就是nid列,下面jacky就跟大家总价下主键是什么;
(二)主键,我们不一样
好,现在jacky跟大家总结一下主键,大家可以思考一下:如果在表中存储了很多行数据,就会引发这样的问题:如何判断表中没有重复的数据行?如何判断一个员工的信息没有被输入两次?
这时就需要这样一个列,这个列的值用来唯一标识表中的每一行,这样的列就是主键;
主键就是主要的键,一张表只能有一个主键,是唯一的,不能重复不能为空(null),一般情况下会将自增列设置为主键;
下面jacky给有基础的同学一个引申吧,就是主键和唯一列的区别,零基础的朋友可以略过,后面的课程我们还会提到
这里主键要跟唯一列区别,唯一可以为null,对于唯一列,一张表可以有多个;主键和唯一列都叫索引,虽然有很多很多的约束,但是它们的好处特别明显,就是查找速度特别特别的快;
下面这张表,比如说这张表是海量数据,如果我们查找jacky这个字段,我们用name=jacky来查找,可能需要几秒钟;但是查询nid=2,可能我们用0.00000秒就能查询到;
nid | name | address |
---|---|---|
1 | andy | |
2 | jacky | |
3 | lucky |
总结主键和唯一列的两大功能:
(1)约束;
(2)索引
- 加速查找
(三)三范式总结
3.1 第一范式(1NF)
- 数据库的列不可分割,如果有的列包含多种信息,可以把它抽取出来成为一个单独的表;
3.2 第二范式(2NF)
- 数据表中的每一行,都应该有唯一的标识,即每一行都应有主键区分
3.3 第三范式(3NF)
- 数据表中的所有非关键字段,必须依赖于主键
3.4 三范式的核心逻辑
数据库的核心思想
- 为了数据的存储
三范式的核心思想
- 不要出现冗余数据(用最少的空间存储最多的信息),第二范式是避免了冗余行的出现,第三范式是避免了冗余列的出现;