大家好,我是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 三范式的核心逻辑

  • 数据库的核心思想

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

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

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. PHP迭代生成器---yield

    1.迭代生成器 生成器的核心是一个yield关键字,一个生成器函数看起来像一个普通的函数,不同的是:普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值.生成器函数被调用时,返回的是一个 ...

  2. (二十四)JSP标签之基本标签(<jsp:标签名>)

    一.常用标签 1.1 jsp中标签一共有8中,其中常用的有6中,本文将介绍这6种常用的标签. 1.2 6种标签 1. <jsp:include> <jsp:include>标签 ...

  3. 修改ubuntu设备名

    修改ubuntu设备名   执行如下命令:   sudo sed -i 's/当前设备名/新设备名/' /etc/hostname sudo sed -i 's/当前设备名/新设备名/' /etc/h ...

  4. XML-RPC-2RPC

    远程过程调用协议 RPC一般指远程过程调用协议 RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协 ...

  5. 为什么Java大数据能带你走上人生巅峰

    国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发. 开发程序员的工作大多是重复性劳动,容易产生疲惫感,薪资在工作2-5年内就达到了一个峰值,再要提升就比较困 ...

  6. linux 基础7-正则表达式

    1. 基础正规表示法 1.1 以grep获取字符串: 在万用字符*是0-无限个字符,?是一个字符:在正则表达式中是0-无限个字符前一个相同字符..一个前一个相同字符 grep '^[a-z]' gre ...

  7. PAT Advanced 1073 Scientific Notation (20 分)

    Scientific notation is the way that scientists easily handle very large numbers or very small number ...

  8. 在linux中安装VM tools

    step 1:虚拟机选择安装 Vmware tools ,在DVD中将.tar.gz的文件包拖到桌面中: step 2:打开终端,切换到桌面,cd /home/whoami/桌面 cd /home/u ...

  9. WPF绑定属性

    1.创建model类 model类要继承接口INotifyPropertyChanged,用于通知客户端属性值已更改 public class StudentModel : INotifyProper ...

  10. mongodb 启动数据库失败原因及解决办法

    刚开始接触mongodb 每次启动完数据库  用好之后退出时直接 command+q强制退出了 导致了下一次数据库启动失败 错误原因: 上一次退出数据库端口号并没有杀死 解决办法 lsof -i tc ...