大家好,我是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. Session和Cookie的原理

    1.session和cookie的存储 session一般保存在服务端文件中,php.ini中有个配置项--session.save_path='';这个里面填写的路径,将会使session文件保存在 ...

  2. MacBook使用HHKB键盘设置

    问题: macbook上使用hhkb的时候,很纠结档位4要不要开,开启4号DIP开关后,虽然会使HHKB键盘上减少一个“◇(Win键)”键,但是会在键盘左侧多出一个“FN”键.多出来的左“FN”键,不 ...

  3. Unity中的Character Controller

    Unity中默认提供了一个Character Controller的组件用于实现角色控制,一个3D的游戏物体,可以直接添加.Character Controller会自动模拟出Capsule Coll ...

  4. (二)手动配置第一个HelloWorld程序

    上例的HelloWorld是由Android sutudio 自动生成的,现在我们手动来配置. 1. 重新创建工程 2. 创建空的Activity 生成的MainActivity.java 文件: p ...

  5. Java Web 深入分析(2) DNS

    DNS :Domain Name System,域名系统 ,通俗的来说需要把我们日常见到的URL 网址信息解析成IP地址,例如 DNS域名解析过程 用户浏览器:用户在浏览器地址栏输入域名进行访问,浏览 ...

  6. mysql8中查询语句表别名不能使用 “of”

    今天在迁移一个项目的时候,发现有一个sql报错,但是语句跟迁移之前完全一样,所以想来应该是 mysql 版本差异导致的. 迁移之前版本:5.6.28(腾讯云) 迁移之后版本:8.0.16(阿里云) 新 ...

  7. 一线互联网常见的Java面试题,你颤抖了吗程序员

    跳槽不算频繁,但参加过不少面试(电话面试.face to face面试),面过大/小公司.互联网/传统软件公司,面糊过(眼高手低,缺乏实战经验,挂掉),也面过人,所幸未因失败而气馁,在此过程中不断查缺 ...

  8. mysql的unsigned属性负值报错和为0情况及mysql的严格模式

    最近发现在进行线程操作时,发现数据库的unsigned字段减为负数时并未报错而是变为0,因此去寻找解决方案,发现这和我的sql_mode有关. sql_mode MySQL服务器可以以不同的SQL模式 ...

  9. 关于stm32 SDIO初始化TF卡 失败的问题

    类似问题:http://www.openedv.com/thread-33232-1-1.html 现象:初始化4bit SDIO模式的TF卡,卡死在初始化过程中. 问题现象代码移植于野火开发板相关例 ...

  10. 集成IDE anaconda

    Anaconda 下载安装完anaconda后,会生成如下工具: 安装Anaconda不需要使用管理员权限.安装完毕后,Anaconda附带一个图形启动器(Anaconda Prompt),可以使用他 ...