MySQL数据分析-(6)数据库设计之规范化

你们好,我是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

  • 第一步,咱们建立一个命名为手机销售公司数据库的文件夹,这个数据库里是否是能够放不少表,是吧,咱们先放一个员工表,能够吧,记录和存储这家公司的员工信息;

数据分析-jacky

  • 咱们看这张表有什么问题?数据库

    • 咱们发如今部门这列,有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 三范式的核心逻辑

  • 数据库的核心思想

    • 为了数据的存储
  • 三范式的核心思想

    • 不要出现冗余数据(用最少的空间存储最多的信息),第二范式是避免了冗余行的出现,第三范式是避免了冗余列的出现;
相关文章
相关标签/搜索