大家好,我是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. #1.打开MySQL客户端
  2. #1.1 连接服务器
  3. sudo /usr/local/mysql/support-files/mysql.server start
  4. #1.2 连接MySQL客户端
  5. mysql -u root -p
  6. #2.创建使用数据库
  7. use test;
  8. #3.创建表
  9. create table staff( nid int not null auto_increment, name char(10), index(nid));
  10. #4.向创建的表中插入数据
  11. insert into staff(name)values('jacky');
  12. #5.查看新创建表中的数据
  13. select * from staff;
  14. #6.查找name列中jacky的字段
  15. #6.1 不通过主键查找;
  16. select * from staff where name='jacky';
  17. 6.2 通过主键查找;
  18. 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 三范式的核心逻辑

  • 数据库的核心思想

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

    • 不要出现冗余数据(用最少的空间存储最多的信息),第二范式是避免了冗余行的出现,第三范式是避免了冗余列的出现;

MySQL数据分析-(6)数据库设计之规范化的更多相关文章

  1. mysql学习笔记--数据库设计

    一.数据库基本概念 1. 关系:两个表的公共字段 2. 行:也称记录,也称实体 3. 列:也称字段,也称属性 4. 数据冗余:相同的数据存在不同的地方. 注意:冗余只能减少,不能杜绝. 减少冗余,只能 ...

  2. MySQL 约束和数据库设计

    1.MySQL 约束: 1.约束的概念: 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性. MySQL中,常用的几种约束: 约束类型: 非空 主键 唯一 外键 默认值 ...

  3. 使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/48318877 本文出自[我是干勾鱼的博客] 1 简单介绍 MySQL Workb ...

  4. 使用MySQL Workbench进行数据库设计——MySQL Workbench使用方法总结

    本文出自[我是干勾鱼的博客] 转自:https://blog.csdn.net/dongdong9223/article/details/48318877 1 创建Model(设计ER图) 使用wor ...

  5. MySQL 表的约束与数据库设计

    DQL 查询语句 排序 # 单列排序 * 只按某一个字段进行排序,单列排序 # 组合排序 * 同时对多个字段进行排序,如果第1个字段相等,则按照第2个字段排序,依次类推 * 语法: # 具体操作 * ...

  6. MySQL学习07(规范化数据库设计)

    规范化数据库设计 当数据库比较复杂时我们需要设计数据库 糟糕的数据库设计 : 数据冗余,存储空间浪费 数据更新和插入的异常 程序性能差 良好的数据库设计 : 节省数据的存储空间 能够保证数据的完整性 ...

  7. MySQL数据分析-(5)数据库设计之ER模型

    大家好,我是jacky,很高兴跟大家分享本课时的内容,从本节课开始,就开始了我们第二章的学习,第一章我们抛出了若干问题,从第二章开始往后,都是解决问题的一个过程: 第一章的案例中,我们拿手机销售公司举 ...

  8. MySQL 性能优化 30个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

  9. mysql学习5:数据库设计

    mysql学习5:数据库设计 本文转载:https://blog.51cto.com/9291927/2087925:原创为天山老妖S 一.数据库设计简介 按照规范设计,将数据库的设计过程分为六个阶段 ...

随机推荐

  1. YAPI安装和使用

    .本人已验证,参考文档:https://blog.csdn.net/qq_39429962/article/details/84000460 很详细.

  2. SQLiteDatabase执行update、insert操作的时候,conflictAlgorithm参数的含义区别

    /** * When a constraint violation occurs, an immediate ROLLBACK occurs, * thus ending the current tr ...

  3. CAD二次开发之入门坑

    如果没有引用第一个dll,则会报未找到引用CommandMethod

  4. zabbix-设置邮箱预警

    设置预警系统 机器是被监控上了,但是出了问题怎么通知呢?之前学过监控软件的都知道可以使用报警机制啊,如果监控平台zabbix server发现某个机器异常了,可以给运维管理员发邮件啊,通过邮件通知管理 ...

  5. 将现有vue项目基于electron打包成桌面应用程序

    一.前言 项目本来打算采用B/S架构去做的,浏览器网址方式打开还是让用户不方便: 二.使用electron集成桌面应用 本身项目是使用vue-cli开发的,在使用electron之前,需要将本身的项目 ...

  6. 【Zookeeper】实现负载均衡原理

    一.思路 使用Zookeeper实现负载均衡原理,服务器端将启动的服务注册到,zk注册中心上,采用临时节点.客户端从zk节点上获取最新服务节点信息,本地使用负载均衡算法,随机分配服务器. 服务端启动的 ...

  7. 日志实时查看、轮询、统计、监控工具 Loggrove

    Loggrove 是对日志文件进行 阅读.轮询.关键词匹配.监控告警.图表展示 的 Web 服务. 下载地址 https://github.com/olajowon/loggrove 超轻组件 Pyt ...

  8. opengl 4.5 中文api 链接

    https://www.cnblogs.com/wiki3d/p/opengl_a.html

  9. 安装sass时遇到Failed to build gem native extension

    错误信息 执行命令: sudo gem install sass时遇到下面的错误信息 Building native extensions. This could take a while... ER ...

  10. Centos杀死进程kill方法大全

    杀死进程最安全的方法是单纯使用kill命令. 首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释:标准的kill命令通常都能达到目的.终止有问题的进程,并 ...