你们好,我是jacky,很高兴继续跟你们学习MySQL数据分析这门课,上次课咱们介绍了E-R图,咱们要给手机销售公司设计数据库,那么同一个项目,10个设计人员可能设计出10种不一样的E-R图;由于不一样的设计人员会从不一样的角度,标识出不一样的实体,而每一个实体又包含不一样的属性,天然设计出的下E-R图也就不一样了;
正是由于有这个缘由,因此咱们天然就要想办法找出一个E-R图设计优劣或者说好坏的标准,你们说是否是,有了这个标准,咱们才能找出最优的设计数据库的方案,那么,这个标准就是数据的三大范式;
这里,我估计确定会有朋友抱怨了,说jacky,你讲的太理论了,必定不实操啊,别着急,jacky从这节课开始就给你们用SQL语句来举例,而且经过对数据库设计三大范式的讲解,咱们才能更好的理解SQL语句背后的含义,jacky的课程不会向其余课程同样,只告诉你SQL语句是什么,我必定要告诉你SQL语句为何要这样来写,好,言归正传,开始咱们三大范式的讲解;mysql
(一)模拟建立数据库
1.如何处理数据冗余
好,在没有教授SQL语句以前,咱们还不知道怎样用SQL语句在数据库中建立表,咱们如今文件夹中,用excel这个二维表来模拟这个过程;sql
- 第一步,咱们建立一个命名为手机销售公司数据库的文件夹,这个数据库里是否是能够放不少表,是吧,咱们先放一个员工表,能够吧,记录和存储这家公司的员工信息;
咱们看这张表有什么问题?数据库
- 咱们发如今部门这列,有4条记录都出现了“开发部”,在数据库里,咱们把数据重复的现象叫作“数据冗余”,由于存在重复的数据,咱们就有必要简化;
下面的问题是:咱们该怎样把重复的数据作简化呢,咱们经常使用的方法是分类存储,好,对于上面的员工表,咱们拆分红两张表,员工表以外,咱们在建立一张部门编码表;服务器
好,经过这样拆分表的方法,咱们就解决了数据重复冗繁的问题;
上面,将咱们讲的知识理论化,就是数据库设计的第一范式(1NF):若是二维表中有的列包含多种信息,咱们能够把它抽取出来成为一个单独的表;markdown
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给有基础的同窗一个引伸吧,就是主键和惟一列的区别,零基础的朋友能够略过,后面的课程咱们还会提到spa
这里主键要跟惟一列区别,惟一能够为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 三范式的核心逻辑
数据库的核心思想
- 为了数据的存储
三范式的核心思想
- 不要出现冗余数据(用最少的空间存储最多的信息),第二范式是避免了冗余行的出现,第三范式是避免了冗余列的出现;