一 数据库的相关概念
1,数据库的组成
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
数据(data)
描述事物的符号记录
包括数字,文字、图形、图像、声音、档案记录等
以“记录”形式按统一格式进行存储
表
将不同的记录组织在一起
用来存储具体数据
记录:行
字段(属性):列
以行+列的形式就组成了表(数据存储在表中)
数据库
表的集合,是存储数据的仓库
以一定的组织方式存储的相互有关的数据集合
“关系型数据库”表与表字段/属性的关联
2、数据库类型
关系型数据库(SQL):存储的往往是字符、字符串、数值、布尔值等(磁盘)
非关系型数据库(NoSQL):存储的往往是图片、视频、语音等(内存)
时序数据库(TSDB):心电图,持续性,根据时间点进行变化的一组连续性的数据。
当今主流关系型数据库介绍
SQL Server (微软公司产品):面向Windows操作系统,简单、易用。
Oracle(甲骨文公司产品): 面向所有主流平台,安全、完善,操作复杂。
DB2 (IBM公司产品): 面向所有主流平台,大型、安全、完善。
MySQL(甲骨文公司收购): 免费、开源、体积小
关系型数据库
关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。关系数据的存储是二维表格,在每个二维表中每一行称为一条记录,用来描述一个对象的信息;每一列称为一个字段,用来描述对象的一个属性。关系模型可用简单的“实体-关系”(E-R)图来表示E-R图中包含了实体(数据对象)、关系和属性三个要素
特点:关系数据库系统是基于关系模型的数据库系统。关系模型的数据结构使用简单易懂的二维数据表。
实体和关系的概念
实体:也称为实例,对应现实世界中区别于其他对象的事务。如:银行客户,银行账户等。
属性:描述一个实体的详细信息,实体所具有的某一特性,一个实体可以由多个属性。如“银行客户”实体集中的每个实体均具有姓名,住址,电话等属性。
联系:实体之间的对应关系称为联系,也称为关系。如银行客户和银行账户之间存在“储蓄”的关系。
所有实体及实体之间联系的集合钩成一个关系数据库,多个实体之间存在联系。
非关系型数据库
非关系数据库也被称作NoSQL (Not Only SQL)。存储数据不以关系模型为依据,不需要固定的表格式。非关系型数据库有Redis、maogodb(芒果)、memcached、postgresql (PG)、hbase等。常用的非关系数据库:Redis、mongoDB等。
非关系型数据库的优点有:
数据库可高并发读写(数据放在内存中);对海量数据高效率存储与访问;数据库具有高扩展性与高可用性。
补充:
K-V键值对:是计算机科学技术,查看jdk文档,找MAP接口。键值对存储是数据库最简单的组织形式。
键:就是存的值的编号
值:就是要存放的数据
关系数据库与非关系数据库的对比
关系数据库:
关系数据库结构是二维数据表,二维表当中每个字段(列)用来描述对象的一个属性,每个记录(行)用来描述一个对象的信息(完整信息),关系数据库写存储在硬盘当中,读写系统就会受到的IO限制或者瓶颈。其他,关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
非关系型数据库(NoSQL):
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合可以是文档或者键值对等。
优点:
格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
高扩展性;
成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
不提供sql支持,学习和使用成本较高;
无事务处理;
数据结构相对复杂,复杂查询方面稍欠。
3,数据库系统(DBS)
是一个人机系统,由硬件、OS、数据库、DBMS、应用软件和数据库用户组成
用户可以通过DBMS或应用程序操作数据库
3,数据库管理系统(DBMS)
是实现对数据库资源有效组织、管理和存取的系统软件
功能:数据库的建立和维护功能、数据定义功能、数据操控功能、数据库的运行管理功能、通信功能。
补充:
RDBMS是关系数据库一管理系统。
DBMS是数据库管理系统,这个概念更大一些。
DBMS的工作模式如下:
①、接受应用程序的数据请求和处理请求
②、将用户的数据请求(高级指令)转换为复杂机器代码(底层指令)
③、实现对数据库的操作
④、从数据库的操作中接受查询结果
⑤、对查询结果进行处理(格式转换)
⑥、将处理结果返回给用户
RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:
1、数据以表格的形式出现
2、每行为各种记录名称
3、每列为记录名称所对应的数据域
4、许多的行和列组成一张表单
5、若干的表单组成database
RDBMS 术语
在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
数据库(DB): 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素,字段) 包含了相同的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的且不可为空。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
表头(header): 每一列的名称;
列(col): 具有相同数据类型的数据的集合;
行(row): 每一行用来描述某条记录的具体信息;
值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
键(key): 键的值在当前列中具有唯一性。
二 Mysql数据库
1,Mysql的概述
MySQL开源免费,MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。。MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
MySQL数据库是一种C/S模型(即客户端和服务端模型),客户端通过账号、密码来连接服务器,连接成功之后才可以进行数据库的操作(CRUD:增加、删除、变更、查询)。MySQL的服务端采用IO复用 + 可伸缩的连接池,实现了网络高并发的经典模型。
简单的来说 ,MySql是一个开放的、快速的、多线程的、多用户的SQL数据库服务器。
2,Mysql的特点
MySQL 是开源的,所以你不需要支付额外的费用。
MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
MySQL 使用标准的 SQL 数据语言形式。
MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
总结:性能卓越、服务稳定;开源、无版权限制、成本低,多线程、多用户;基于C/S(客户端/服务器)架构;安全可靠。
3,商业版与社区版
MySQL商业版是由MySQLAB公司负责开发与维护,需要付费才能使用
MySQL社区版是由分散在世界各地的MySQL开发者爱好者一起开发与维护,可以免费使用
两者区别
商业版组织管理与测试环节更加严格,会比社区版更稳定
商业版不遵守GPL,社区版遵从GPL可以免费使用
商业版可获得7*24小时的服务,社区版则没有
4,产品阵营
第一阵营:5.0-5.1阵营,可说是早期产品的延续
第二阵营:5.4-5.7阵营,整合了MySQL AB公司、社区和第三方公司开发的存储引擎,从而提高性能
第三阵营:6.0-7.1阵营,就是MySQL Cluster版本,为适应新时代对数据库的集群需求而开发
下载网址
http://www.dev.mysql.com/downloads
5,日志
数据库日志文件用于各份,恢复,是最核心的部分
mysql与oracle日志有所区别
mysql写一条数据,同步到日志中一条
oracle:重做日志组
一个组中至少3个日志成员,轮流存储日志
还会有另一个组与之同步/备份
阿里云OSS对象存储,一式三份备份(使用重做日志组思想)
对象存储:存储大都是一些静态文件,图片、音频、视频不能直接在对象存储中修改数据
飞天平台,盘古系统,钟尴:安全,女娲:选举/调度,盘古一式三份
6,mysql 存储引擎
7,mysql 数据类型
MySQL 中定义数据字段的类型对数据库的优化是非常重要的。MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
1、数值类型
MySQL 支持所有标准 SQL 数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。
作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
2、日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
3、字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
注意**:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30)就可以存储 30 个字符
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB,BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB类型,可存储的最大长度不同,可根据实际情况选择。
8,当默认配置好一套MySQL数据库服务后,系统会默认创建4个库:
(1)information_schema:记录用户、表、视图等元数据信息。它是虚拟出来的库,是由MySQL实例创建和维护的,其对象都保存在内存中(在磁盘上找不到对应的物理存在,因为是虚拟的),用户也无法在该库中创建对象,root用户也不可以。对于该库用户唯一能做的事情就是查询。
(2)mysql:记录用户权限、帮助、日志等信息。
(3)performance_schema:MySQL服务性能指标库。
(4)sys或者st:测试库。
9,应用范式的好处
(1)减少数据冗余(最主要的好处,其它好处因此附带 )
(2)消除异常(插入异常、更新异常、删除异常)
(3)让数据组织的更加和谐
10,数据库范式:
第一范式(1NF):每一列保持原子特征。
列是基本数据项,不能再进行擦缝,否则设计成一对多的关系。不满足第一范式不能称之为关系型数据库。
学生表(学号、用户名、性别、年龄、地址)
其中地址信息还可进行拆分,拆分改造后为:
学生表(学号、用户名、性别、年龄、地址ID)
地址表(地址ID、省、市、区)
(二)第二范式(2NF):属性完全依赖于主键(针对联合主键进行消除部分依赖)
1NF基础上,非主属性完全依赖于主键。如果不是依赖主键,应该拆分成新的主体,拆分成一对多的关系。
例如:
学生选课表(学生ID、学生姓名、学生性别、课程名称、课程成绩)
主键(学生ID、课程名称)
学生姓名——》学生ID——》部分依赖
学生性别——》学生ID——》部分依赖
课程成绩——》(学生ID、课程名称)——》完全依赖
拆分改造后:
学生表(学生ID、学生姓名、学生性别)——主键:学生ID
课程成绩表(课程ID、课程名字、学生ID、成绩)——主键:课程ID
键(课程ID、学生ID)
(三)第三范式(3NF):
2NF基础上,属性不依赖于其它非主属性(消除依赖传递)
学生表(学生ID、学生姓名、学生性别、学院名称、学院电话)——主键:学生ID
学生姓名——》学生ID
学生性别——》学生ID
学院电话——》学生ID——》查询学院——》查询学院电话
拆分改造后:
学生表(学生ID、学生姓名、学生性别、学院ID)——主键:学生ID
学院表(学院ID、学院名称、学院电话)——主键:学院ID
注意:
通过范式学习,应用范式越高表越多。
表多带来的问题:
(1)查询时需要连接多个表,增加了查询的复杂性。
(2)查询时需要连接多个表,降低了数据库查询的性能。
一般满足第三范式即可。
附:
MySQL中的表对象是基于库维护的,即表是属于某个库的,库在表在。
Oracle中的表对象是基于用户的,属于创建该对象的用户所有,用户在表在。
MySQL数据库都是由多个数据库组成(一经创建,默认至少有4个)。
Oracle中的数据库则是一个整体。