目录
1.多表关系?
概述:在实际的项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构。由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一),多对多, 一对一。
1.一对多(多对一):
比如,部门与员工之间的关系。一个部门对应着多个员工,但是一个员工只能对应着一个部门。
实现:在多的一方(子表)建立外键,指向一的一方(父表)的主键。
2.多对多:
比如,学生与课程之间的关系。一个学生可以选修多门课程,一门课程也可以供多个学生来选择。
实现:建立第三张中间表,中间表至少包含着两个外键,分别关联其余两张表的主键。
3.一对一:
比如,用户与用户详情之间的关系是一对一的关系。一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其它的详情字段放在另一张表中,以提升操作的效率。
实现:在任意的一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)。
2.多表查询的概念和分类?
概念:多表查询指的是从多张表中查询出数据。在多表查询时,需要消除无效的笛卡尔积。(笛卡尔积:笛卡尔乘积是指在数学中,两个集合,A集合和B集合的所有的组合情况。)多表查询分为连接查询和子查询。
连接查询:连接查询指的是两张或者多张表以一定的连接条件连接起来查询它们的记录。连接查询分为内连接,外连接以及自连接。
内连接:分为隐式内连接和显示内连接。内连接相当于查询A、B这两张表的交集部分的数据。
外连接:分为左外连接和右外连接。
左外连接:查询左表所有的数据,以及两张表交集部分的数据。
右外连接:查询右表所有的数据,以及两张表交集部分的数据。
自连接:是指当前表与自身的连接查询,要想进行自连接必须使用表的别名。
子查询:SQL语句中嵌套SELECT语句,称为嵌套查询,又称为子查询。
3.数据库三大范式?
第一范式:第一范式是最基本的范式,要求原子性。数据库表中的列或者字段不能再分,要求属性具有原子性,不可以再分解。
第二范式:第二范式是在第一范式的基础之上更近一层,要求唯一性。一张表只记录一件事,是对记录的唯一性约束,要求记录有唯一标识。而主键就是一行数据的唯一标识,表中的每一列都必须依赖于主键,确保了表中每列都和主键相关。
第三范式:第三范式是对第二范式的补充,要求直接性。数据不能存在传递关系,即每一个属性都跟主键有直接关系,而不是间接关系,字段没有冗余。
4.MySQL数据库事务特性(ACID)和隔离级别?
事务:事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或者撤销操作的请求,即这些操作要么同时成功,要么同时失败。举例:银行转账。
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
事务四大特性(ACID):
重点理解:
一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态,事务完成时,必须使所有的数据都保持一致状态。比如转账的例子中,转账前两个账户余额总数为2000,转账完成后也应该为2000。
隔离性:由数据库系统提供的隔离机制,来保证在事务正确的被提交之前,不允许把该事务对数据的任何改变提供给任何其它事务。
并发事务问题:脏读,不可重复读,幻读。
事务隔离级别:读未提交,读已提交,可重复读,可串行化。
注意:事务隔离级别越高,数据越安全,但是性能越低。MySQL数据库管理系统默认的事务隔离级别是可重复读。
几点说明:
(1)读未提交(read Uncommited):
是最低级别的事务隔离级别,在该隔离级别,所有的事务都可以读取到别的事务中未提交的数据。会产生脏读,不可重复读,幻读等问题,在项目中基本不怎么用,安全性太差。
(2)读已提交(read commited):
这是大多数数据库默认的隔离级别(比如Oracle数据库),但是不是MySQL的默认隔离级别。这个隔离级别满足了简单的隔离要求:一个事务只能看见已经提交的事务所做出的改变,所以会避免脏读问题。由于一个事务可以看到别的事务已经提交的数据,于是随之而来产生了不可重复读和幻读等问题。
(3)可重复读(Repeatable read):
这是MySQL的默认隔离级别,它确保了一个事务中多个实例在并发读取数据的时候会读取到一样的数据。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。InnoDB存储引擎通过多版本并发控制(MVCC,Multi Version Concurrency Control)机制解决了该问题。
(4)可串行化(serializable):
这是最高级别的事务隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简而言之,它是在每个读的数据行上加上共享锁。在这个级别,可能会导致大量的超时现象和锁竞争,一般为了提升程序的吞吐量不会采用这个隔离级别。
5.MySQL的体系结构?
连接层:
最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
服务层:
第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。
引擎层:
存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。
存储层:
主要是将数据存储在文件系统之上,并完成与存储引擎的交互。