任何开发只要有数据呈现,都会用到数据库,本篇我们就聊一下mysql数据库。
mysql
的版本最神奇的是从5.7直接跳跃到8.0版本,可见8.0版本在功能上做了显著的增强和改进,开发者对MYSQL
的源代码进行了重构,最突出的一点是多Mysql Optimizer( Optimizer即数据库优化器)
优化器进行了改进。不仅在速度上得到了改善,还为用户代理了更号的性能和更棒的体验。
其实市面上有很多的数据库,但是为什么要选择Mysql
呢?
具有一下特点:
- 开源代码,使用成本低。
- 性能相对卓越,服务也稳定,所以很多互联网公司都在用,经过了时间的验证。
- 软件体积下,使用简单,易于维护。
- 存在的历史悠久,社区用户活跃,遇到问题便于咨询
这个时候不得不提另一个数据库-oralce
。
oracle
更适合大型跨国公司,以及政府使用,他们对费用不敏感,但是对性能和安全要求更高。mysql
由于体积小,速度快,总体使用成本低,可以处理上千万条的大型数据库,尤其开发源码这个特色,所以很多互联网公司,中小型网站都选择了mysql
作为网站数据库比如国内的:阿里巴巴,蚂蚁金服等。
首先先聊一些概念。
DBMS
DBMS
一般指数据库管理系统。 数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS
。
但是DBMS
其又分两类关系型数据库(RDBMS)
和非关系型数据库(非RDBMS)
。
RDBMS
其实关系型数据库是DBMS
中最常用的的,其中使用最多的RDBMS
分别是Oralce,Mysql和SQL Server。
关系型数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系(也就是二维表格的形式)。
id | 姓名 |
1 | 张三 |
2 | 李四 |
3 | 王五 |
关系型数据库以行(row)
和列(column)
的形式存储数据,便于用户理解。这样行和列组成了一个新的概念—表(table)
,然而多个表又可以形成了新的概念—库(database)
.
而表与表之间的记录又有关系(relationship
)。而现实中实体和实体之间各种联系军用关系模型来表示或者描述。而关系数据库也就是建立在关系模型上的基础数据库。
使用数据库的适合,经常用的是DBMS(数据库管理系统)
。而这个又要区别一个DB(数据库)
。
其实这个很容易理解,比如常用的office软件中的word,我们新建了很多word文件,但是删除了office,其存文档还是存在电脑上。这个就有点类似比如安装的DMBS
然后创建了数据库。其是两个不同的概念。如下:
而在使用数据库所用的语言或者说专门用来与数据库通信的语言那就是SQL(结构化查询语言 Structured Query Languge )
当然RDBMS
关系数据库自然尤其优势,比如可以方便用SQL
语言方便在表与表之间做非常复杂的数据查询。以及事务的支持,满足对于安全性能很高的数据访问要求。
非RDBMS
非关系型数据库,其可以看做是关系型数据库的阉割版,基于键值对(key -value)存储数据,不需要经过sql层的解析:比如判断插入的数据一行是否满足有多少列。通过减少不常用的功能,进一步给的给提高了性能。
目前市面上的非RDBMS
数据库都是免费的。
而非关系数据库,其又有几种分类:键值型数据库(Redis等),文档型数据库(MongoDB,CouchDB等),搜索引擎数据库(Solr,Elasticsearch,Splunk等),列存储(Hbase等)等,除以以外还有图形数据库。所以很多时候用NoSQL
一词将这些技术囊括进来。
NoSQL对SQL做出了很好的补充,比如实际开发中,有很多业务需求,其实不需要完成的关系型数据库功能,使用非关系数据库就足够使用。这样性能更高,成本更低,其使用场景比如:日志收集,定时器等
当然本篇主要聊msyql,所以这些就不在细说,等聊非关系型数据库的时候,依次聊。
关系型数据库设计规则
关系型数据库的典型数据结构就是数据表,这些数据表的组成是结构化的。而数据是先放入表中,通过表将其存放在库中。所以一个数据库中可以有多个表,而每个表都必须有一个名字,其用来标识自己所以表名具有唯一性。表也有自己的特性,而这些特性定义了数据在表中如何存储,其实有点像是java中类的概念,为什么会这样说因为后来会聊一个思想----ORM(Object Relational Mapping).。
定义表
这个就设计到一个E-R(entity -relatiosn 实体--联系)
模型,其主要设计到三个主要概念:实体集,属性,联系集。
一个实体集对应的是一个数据库库中的表(table),一个实体则对应于数据库表中的一行(row),也称之为一条记录。一个属性对应的数据库中一列(column),也称之为字段(field)。
如下演示:
联系集,就是表演表之间的关系。
表的关联关系
表于表之间的数据记录有关系。一般分四种一对一关联,一对多关联,多对多关系,自我引用
一对一关联(one -to-one)
实际开发中不常用,毕竟一对一的化,可以创建一张表实现,没有必要创建两个表。这个会涉及到一个原则。
- 外键唯一:主表的主键和从表的外键(唯一),形成主外键概念性,外键唯一。
- 外键是主键:主表的主键和从表的注解,形成主外键关系。
上面两个具体是什么后面聊,现在先了解这个概念即可。以为这个涉及到数据库的优化。
上面的例子,是学生的详情和一张学生的所在的班级,毕竟一个人只能在一个班级,所以两个表之间的关系是一对一关联。
一对多(one-to-many)
这个和上面的不同一对多的建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。
主表如下
班级号 | 班级 |
1 | 一年级1班 |
2 | 一年级二班 |
从表如下:
班级号 | 学生 | 学号 |
1 | 001 | 张三 |
2 | 002 | 李四 |
1 | 003 | 王五 |
可见一个班级下面可以有多个学生,所以这种是一对多关联。
多对多 (many to many)
多对多这个可能有点绕,这个先看例子然后再理解。不过这种关系 实现需要的有一个中间表
课程表
课程号 | 课程 |
book1 | 数学 |
book2 | 英语 |
学生表
班级号 | 学生 | 学号 |
1 | 001 | 张三 |
2 | 002 | 李四 |
选课表(中间表)
课程号 | 学号 |
book1 | 1 |
book1 | 2 |
book2 | 1 |
这样可以看出学生可以选多个课程,而课程下面也可以又多个学生,学生表和课程表通过选课课程表相互关联起来,就有了多对多的关系。
这样有了一个多对多关系建立的原则:
- 需要创建第三张表,中间表只是有两个字段,这两个字段分别作为外键指向各自一方的主键。
自我引用(Self reference)
这个也就是名字的意思,那就是表自己引用自己的表,这种很多时候在公司的职工表中表现出来。
工号 | 姓名 | 职位 | 领导工号 |
001 | 王老大 | 董事长 | null |
002 | 赵老三 | 经理 | 001 |
003 | 李小四 | 职工 | 002 |
这个很直观了,那就是领导工号可以找到工号,然后可以看到领导的个人详细信息,这样就形成了内部的自我引用。
本篇其实就是一些理论的整理,当然在后面的涉及数据库的表结构的时候会在具体聊。