原标题:Java - 数据库学习笔记
20世纪60年代后期以来,计算机管理的对象规模越来越大,应用范围又越来越广泛,数据量急剧增长,同时多种应用、多种语言互相覆盖地共享数据集合的要求越来越强烈,数据库技术便应运而生,出现了统一管理数据的专门软件系统——数据库管理系统。
一、数据库相关理论
在数据库中,数据不再以各个应用程序各自的要求来分别存储,而是把整个系统所有的数据,根据它们之间固有的关系,分门别类地加以存储。也就是说,数据库是存储在计算机系统内的结构化的、集成的、相关的、共享的和可控制的数据集合。
数据模型
数据模型是数据库系统的核心和基础,任何DBMS都支持一种数据模型。任何一种数据模型都是由3部分组成:
1)数据结构:主要描述数据的类型、内容、性质以及数据间的联系等。
2)数据操作:主要描述在相应的数据结构上的操作类型和操作方式。
3)数据约束:主要描述数据结构内数据间的语法、词义联系、他们之间的制约和依存关系,以及数据动态变化的规则,以保证数据的正确、有效和相容。
数据模型主要由三种,分别是层次模型、网状模型和关系模型。
关系模型是目前使用最广泛的数据模型,支持关系模型的DBMS称为关系型数据库管理系统。
关系型数据库是一组关系表的集合,关系表是关系模型的数据结构,它用二维表格来组织数据。
目前主流的关系型数据库有Mysql、Oracle、SQLServer、DB2、Sybase等等。在下面的内容中,涉及到数据库操作的部分我都是在MySQL数据库中进行的,MySQL是开源的数据库,使用起来很方便。
完整性约束
关系数据库模型的完整性约束是数据库设计的一部分。它的目的是创建检查数据库存储数据的依据和保障数据的正确性。
不但可以防止授权用户将不合法的数据存入数据库,还能够避免关系表之间的数据不一致。例如,学生表中学号必须唯一且不能为空,性别只能是男女两个值之一等等。
完整性约束主要由四种,分别是键约束,定义域约束,实体完整性,引用完整性。
1. 键约束
关系表中的“键”是指关系表架构中单一属性或者一组属性的集合。键约束是指关系表一定拥有一个唯一和最小的主键。简单的说,主键的目的就是关系表能够从两个及以上的元祖中标识出它们是不同的元祖。
在关系表中还有几个其它的键,超键是关系表中单一熟悉或者一组属性的集合,超键需要满足唯一性。候选键是指满足最小性的超键。外键是关系表的单一或多个属性的集合,其属性值是引用其他关系表的主键。
2. 定义域约束
定义域约束是指关系表的属性值一定是定义域的单元值。例如,年龄属性的定义域是int,那么属性值可以是24而不能是24.5。
3. 实体完整性
实体完整性是指在基底关系表主键的任何部分都不可以是空值,主键如果是多个属性的集合,任何一个属性都不可以是空值。
4. 引用完整性
引用完整性是当关系表存在外键时,外键的值一定来自引用关系表的主键值,或为空值。
关系表的规范化
规范化主要是决定关系表应该拥有哪些属性,其目的是创建良好结构的关系表,去除关系表中的重复数据,去除关系表中的不一致的依赖性,避免在新增、删除或者更新数据时造成错误或者数据不一致的异常情况。
关系表的规范化首要工作是处理主键与属性之间的“功能依赖”,它是三级范式的基础。
1. 第一范式
第一范式(1NF),是指在关系表中删除多值和复合属性,让关系表只拥有单元值属性。例如,学号和课程组成的学生表中,如果在一条记录中课程属性值同时有语文、数学、英语三门课,那么因为拥有多值属性不符合1NF,应该将这条记录分成3条。
2. 第二范式
第二范式(2NF),是指满足第一范式,且关系表没有部分依赖。简单地说,第二范式是指在关系表中,不是主键的属性需要完全依赖于主键。例如,如果在一个表中,有属性学号,姓名,性别,导师编号,导师姓名,导师办公室编号,办公室地址,那么因为导师姓名以及导师办公室编号,办公室地址并非完全依赖主键学号,所以不符合2NF。
3. 第三范式
第三范式(3NF),是指满足第二范式,且关系表没有递移依赖。第三范式的目的是移除那些不是直接功能依赖于主键的属性,这些属性是借由另一个属性来功能依赖于主键的。
比如上面在第二范式中提到的表,我们将学生表拆分成学生表和导师表两个表,但是导师表中办公室地址并非直接依赖于主键,而是通过办公室编号,不符合3NF。
二、MySQL基本使用
关系型数据库MySQL在现在使用还是比较广泛的,我们平时进行基本的开发时可以安装这个数据库来使用,安装完成后可以使用Navicat来对数据库进行操作。(在开始的学习中建议最好还是在控制台用命令行的方式来操作数据库,Navicat是一个图形化的数据库管理软件,使用它可以很方便地进行数据库管理,但过度依赖图形化操作还是不可取的,当然它也提供了命令行方式我们可以根据需要来选择。)
基本SQL语句
在Navicat中,我们先创建了数据库dbtest,下面主要是通过一些基本操作,来展示SQL,结构化查询语言的使用。
1. 创建表
上面就是创建一个用户表的语句,其中userid为主键,usersex表示性别默认值是‘男’。
2. 增
3. 删
4. 改
5. 查
单多表查询
索引
索引是对数据库表中一个或多个列的值进行排序的结构。创建数据表的索引可以提升SQL查询效率,让用户更快速地得到查询结果。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
创建索引的格式如下:
其中index_pk为索引名,on后面是表名,括号内是属性。
数据库索引的 优点 主要如下:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
增加索引也有许多 不利的方面 :
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
到目前为止,我们都还只是在数据库系统中直接对数据库进行操作,要真正地开发出一款将数据保存在数据库里的应用,我们必须学会有编程语言来操作数据库。下面主要介绍Java中的数据库编程。