1 MySQL数据库

1.1 简介

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。

MySQL使用的SQL语言是用于访问数据库的最常用的标准化语言。

1.2 特性

使用C和C++编写,并使用多种编译器进行测试,保证源代码的可移植性。

支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。

为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。

提供TCP/IP、ODBC和JDBC等多种数据库连接途径。

支持多线程,充分利用CPU资源。

优化的SQL查询算法,有效地提高查询速度。

既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入其他的软件中。

提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。

提供用于管理、检查、优化数据库操作的管理工具。

支持大型的数据库,可以处理拥有上千万条记录的大型数据库。

支持多种存储引擎。

2 SQL语言

2.1 简介

MySQL服务器正确安装以后,就已经完成了一个完整的DBMS的搭建,可以通过命令行管理工具或者图形化的管理工具对MySQL数据库进行操作。

这种操作实质上是通过结构化查询语言(Structured Query Language,SQL)来实现的,SQL语言是各种数据库交互方式的基础。

SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。与其他程序设计语言(如C、Java等)不同的是,SQL由很少的关键字组成,每个SQL语句通过一个或多个关键字构成。

2.2 优点

一体化:SQL集数据定义、数据操作和数据控制于一体,可以完成数据库中的全部工作。

使用方式灵活:SQL具有两种使用方式,可以直接以命令方式交互使用,也可以嵌入使用,嵌入C、C++、Fortran、COBOL、Java等语言中使用。

非过程化:只提操作要求,不必描述操作步骤,也不需要导航。使用时只需要告诉计算机“做什么”,而不需要告诉它“怎么做”。

语言简洁、语法简单、好学好用:在ANSI标准中,只包含94个英文单词,核心功能只用6个动词,语法接近英语口语。

2.3 注意

SQL语句不区分大小写,许多SQL开发人员习惯对关键字进行大写,而对表或者列的名称使用小写,这样可以提高代码的可阅读性和可维护性。

大多数数据库都支持通用的SQL语句,同时不同的数据库具有各自特有的SQL语言特性。

某些数据库系统要求在每条SQL命令的末端使用分号。分号是在数据库系统中分隔每条SQL语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。

3 范式

3.1 什么是范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

但是有些时候一昧的追求范式减少冗余,反而会降低数据读写的效率,这个时候就要反范式,利用空间来换时间。

3.2 类型

目前关系数据库有六种范式:

第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF,又称为修正的第三范式)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。

一般说来,数据库只需满足第三范式(3NF)就行了。

3.3 基础知识

想要正确理解范式的知识,必须先对涉及到的概念名词有一定的了解。

3.3.1 概念名词

实体:可以理解为表,一张表可以看做是一种实体。

属性:可以理解为表的字段,一个字段可以看做是一个属性。

元组:可以理解为表的记录,一条记录可以看做是一个元组。

候选码:能够唯一确定某个元组的属性或属性组。

主码:从候选码中挑出作为主键或联合主键的属性或属性组,简称为码。

全码:能够包含某个元组的所有属性。

主属性:候选码中的所有属性。

非主属性:不在候选码中的所有属性。

外码:虽然在本表中不是候选码,但在其他表中是候选码,这种属性或属性组被称为全码。

3.3.2 依赖关系

完全函数依赖:

假设X和Y是关系R的两个属性集合,通过X能确定Y,X1是X的真子集,如果通过每个X1都不能确定Y,则称Y完全函数依赖于X。

举个例子,比如(学号,课程号)和(成绩)这两个属性集合,能通过(学号,课程号)确定成(成绩),通过(学号)和(课程号)都不能确定(成绩),所以称(成绩)完全函数依赖于(学号,课程号)。

部分函数依赖:

假设X和Y是关系R的两个属性集合,通过X能确定Y,X1是X的真子集,如果通过某个X1能确定Y,则称Y部分函数依赖于X。

举个例子,比如(学号,课程号)和(姓名)这两个属性集合,能通过(学号,课程号)确定成(姓名),通过(学号)能确定(姓名),所以称(姓名)部分函数依赖于(学号,课程号)。

传递函数依赖:

假设X、Y、Z是关系R中不同的属性集合,如果通过X能确定Y,但通过Y不能确定X,并且通过Y能确定Z,则称Z传递函数依赖于X。

举个例子,比如(学号)、(专业)、(书费)这两个属性集合,能通过(学号)确定成(专业),通过(专业)能确定(书费),所以称(书费)传递函数依赖于(学号)。

3.4 说明

3.4.1 第一范式(1NF)

保证原子性。

属性不可再分,关系数据库默认符合,否则就不是关系数据库。

3.4.2 第二范式(2NF)

消除部分函数依赖。

必须先满足第一范式(1NF), 非主属性对候选码完全函数依赖。

3.4.3 第三范式(3NF)

消除传递函数依赖。

必须先满足第二范式(2NF),非主属性不能依赖非主属性。

3.4.4 巴斯-科德范式(BCNF)

消除主属性的部分函数依赖和传递函数依赖。

必须先满足第三范式(3NF),非主属性对候选码完全函数依赖,主属性对其他候选码也是完全函数依赖,没有任何属性对非主属性完全函数依赖。