MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言——结构化查询语言(SQL)进行数据库管理,由于其速度、可靠性和适应性而备受关注,大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
MySQL在网络环境中使用客户端/服务器(Client/Server)架构,其核心程序扮演者服务器角色,他管理者对磁盘数据库和内存的访问,而各客户端程序连接到服务器并提出请求。MySQL Server进行多线程操作,可支持多个客户端连接的同时访问,Client客户端程序被用于和Server进行通信以修改服务器端Server管理的数据库信息。二者进行交互时使用的通信协议如下:
关系型数据库:是指采用了关系模型(二维表格模型)来组织数据得数据库,也就是由二维表及其之间的联系所组成的一个数据组织。
关系模型中的常用概念:
关系型数据库的优点:
数据库事务必须具备ACID特性:分别指Atomic原子性,Consistency一致性,Lsolation隔离性,Durability持久性。
非关系型数据库:又被称为NoSQL(Not Only SQL),指非关系型,分布式数据库,且不能保证遵循ACID原则的数据存储系统,其内部存储依靠键值对<Key,Value>存储,且结构不固定,每一个元组可有不一样的字段,不局限于固定的结构,可根据需要增加键值对。
关系型数据库和非关系型数据库的比较:
为了建立冗余小、结构合理的数据库,设计数据库需要遵循一定的规则,在关系型数据库我们将这种规则称为范式。范式是符合某一中设计要求的总结,要想设计一个结构合理的关系型数据库,需要满足一定的范式。通俗来说范式可理解为一张数据表的表结构所符合的某种设计标准的级别,例如装修的建材,最环保的是E0级别,然后是E1、E2级别等。
关系数据库有六种范式:第一范式(1NF),第二范式(2NF),第三范式(3NF),巴德斯科范式(BCNF),第四范式(4NF)和第五范式(5NF)。
满足最低要求的范式为第一范式,在第一范式的基础上进一步满足更多要求的为第二范式,以此类推,一般的数据库只需满足第三范式(3NF)。越高范式数据库的冗余度越低。但也不能说数据库范式越高越好,范式越高意味表越多,多表联合查询的机率越大,SQL语句效率就会变低。
范式的设计优点:
关键码与属性:
函数依赖:
设R(U)是一个属性集U 上的关系模式,X和Y是U的子集,若对于R(U)的任意两个可能的具体关系r1、r2,若r1[x] == r2[x] 则r1[y] == r2[y],或者若r1[x] != r2[x]则r1[y] != r2[y],称X决定Y,或者Y函数依赖于X,记作X->Y,就像我们学过的函数一样,给一个确定的输入(属性集X),就会有一个确定的输出(属性集Y)。
部份依赖:设X,Y是关系R上的两个属性集合,存在X→Y,若X‘ 是X的真子集,且存在X’ →Y,则称Y部份依赖与于X。
示例:学生基本信息表R中(学号,身份证号,姓名),学号的属性取值唯一,在R关系中,(学号,身份证号)→(姓名),(学号)→(姓名),(身份证号)→(姓名),因此姓名部分依赖于(学号,身份证号)。
完全依赖:设X,Y是关系R的两个属性集合,若X‘ 是X的真子集,且存在X →Y,但对每一个X’ 都有 X’ !→ Y,则称Y完全依赖于X。
示例:学生基本信息表R中(学号,班级,姓名)假设不同班级中有相同的学号,班级内的学号不能相同,则在R关系中(学号,班级)→(姓名),但(学号)→(姓名)不成立,(班级)→(姓名)不成立,所以姓名完全函数依赖于(学号,班级)。
传递依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递依赖于X。
示例:在关系R(学号,宿舍,用电量)中,(学号)→(宿舍),(宿舍)!→(学号),(宿舍)→(用电量),则符合传递依赖。
函数依赖和属性的关系:
符合1NF的关系,(“关系模式”和”关系“的区别就像类和对象的区别,“关系”是“关系模式“的实例,”关系“可理解为带数据的表,而”关系模式”就是这张表结构),第一范式的定义为:符合1NF的关系中每个属性不可再分,下图即不符合1NF的要求:
1NF是所有关系型数据库中最基本的要求,若不满足则不是关系型数据库。但第一范式仍存在大量的数据冗余、插入异常、删除异常和更新异常,因此我们引入第二范式。
首先要说明的是满足第二范式必须先满足第一范式。其次第二范式要求数据表每一个实例或者行中必须被唯一标识:
学号 | 姓名 | 年龄 | 课程名称 | 成绩 | 学分 |
---|---|---|---|---|---|
上表中的联合主键为(学号,课程名称),学分只与课程名称有关,与学号无关,即只依赖于联合主键的一个字段不满足第二范式。因此会存在:
我们需要将其拆分使其满足第二范式,将 (学号,课程名称,成绩)划分为选课关系表,将(课程名称,学分)划为课程信息表:
学生:Student(学号,姓名,年龄)
课程:Course(课程名称,学分)
选课关系:StudentCourse(学号、课程名称、成绩)
某一范式位第二范式,且每一个非主属性不能传递依赖于该范式的候选键,称为第三范式。如下例:
员工id | 姓名 | 年龄 | 部门id | 部门名称 | 部门电话 | |
---|---|---|---|---|---|---|
上表中员工id可唯一确定员工信息,但部门id可确定部门名称和部门电话,则部门信息传递依赖于员工id,因此不满足第三范式,如若想满足第三范式同样我们要对表进行拆分:
员工表
员工id | 姓名 | 年龄 | 部门id | |
---|---|---|---|---|
部门信息表
部门id | 部门名称 | 部门电话 |
---|---|---|
一般来说数据库只需满足第三范式就足够了。
总结:
BCNF是在第三范式的基础上消除了主属性对码的部分和传递函数依赖,也就是第三范式的一种特殊情况,即每个表中只有一个候选键,在上面第三范式的员工表中,每个员工的Email都唯一,所以此表存在多个候选键(员工id,Email),此时存在关键字决定关键字的情况,不符合BCFN范式,因此我们需要将表拆分成:
员工表
员工id | 姓名 | 年龄 | 部门id |
---|---|---|---|
Emali
员工id | |
---|---|
这样也就进一步消除了主属性的部分和传递依赖。
如有不懂可看:如何理解关系型数据库的常见设计范式