zoukankan      html  css  js  c++  java
  • MySQL数据分析-(6)数据库设计之规范化

    大家好,我是jacky,很高兴继续跟大家学习MySQL数据分析这门课,上次课我们介绍了E-R图,我们要给手机销售公司设计数据库,那么同一个项目,10个设计人员可能设计出10种不同的E-R图;因为不同的设计人员会从不同的角度,标识出不同的实体,而每个实体又包含不同的属性,自然设计出的下E-R图也就不同了;
    正是因为有这个原因,所以我们自然就要想办法找出一个E-R图设计优劣或者说好坏的标准,大家说是不是,有了这个标准,我们才能找出最优的设计数据库的方案,那么,这个标准就是数据的三大范式;
    这里,我估计肯定会有朋友抱怨了,说jacky,你讲的太理论了,一定不实操啊,别着急,jacky从这节课开始就给大家用SQL语句来举例,并且通过对数据库设计三大范式的讲解,我们才能更好的理解SQL语句背后的含义,jacky的课程不会向其他课程一样,只告诉你SQL语句是什么,我一定要告诉你SQL语句为什么要这样来写,好,言归正传,开始我们三大范式的讲解;

    (一)模拟创建数据库

    1.如何处理数据冗余

    好,在没有教授SQL语句之前,我们还不知道怎样用SQL语句在数据库中创建表,我们现在文件夹中,用excel这个二维表来模拟这个过程;

    • 第一步,我们创建一个命名为手机销售公司数据库的文件夹,这个数据库里是不是可以放很多表,是吧,我们先放一个员工表,可以吧,记录和存储这家公司的员工信息;

    数据分析-jacky

    • 我们看这张表有什么问题?

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

    • 数据库的核心思想

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

      • 不要出现冗余数据(用最少的空间存储最多的信息),第二范式是避免了冗余行的出现,第三范式是避免了冗余列的出现;
  • 相关阅读:
    部署 AppGlobalResources 到 SharePoint 2010
    还原一个已删除的网站集
    使用仪表板设计器配置级联筛选器 (SharePoint Server 2010 SP1)
    File or arguments not valid for site template
    Pex and Moles Documentation
    Content Query Webpart匿名访问
    Running Moles using NUnit Console from Visual Studio
    Calling a WCF Service using jQuery in SharePoint the correct way
    Updating Content Types and Site Columns That Were Deployed as a Feature
    asp.net中判断传过来的字符串不为空的代码
  • 原文地址:https://www.cnblogs.com/shujufenxi/p/8543530.html
Copyright © 2011-2022 走看看