1.数据库简介
1.1.什么是数据库?
数据库管理系统就是由互相关联的数据集合和一组用于访问这些数据的程序组成,简称数据库。即,数据库=数据+程序。数据库的目标就是方便、高效、安全的存储、管理数据信息。
1.2 哪些数据需要被管理?
- 高价值的数据
- 庞大数据量的数据集合
- 常常被多个用户、系统访问的数据集合
1.3 为什么需要数据库语言?
早期的数据库简单,被作为办公室后台系统进行维护,用户通过打印报告的纸质文档作为输入数据,键盘输入就可与其交互,现在数据库越来越复杂,我们需要筛选过滤,范围查找等各种复杂操作,因此我们开发了数据库语言供程序员与其交互。
1.4 数据库给人类生活带来的改变在哪?
数据库使数据与用户更直接的相关联。在没有数据库之前,每一个银行客户都必须在交易时与出纳员打交道,而现在ATM机可以直接与用户交互。
1.5 我们用数据库可以干什么?
有两种使用数据库的方式。
- OLTP(联机事务处理,online transaction processing),大量的用户使用数据库,每个用户只检索少量数据,进行小的更新。
- 数据分析(data anaytics),对数据进行分析,给出结论,推到规则或决策程序,用于驱动业务决策。
2.数据库系统的目标——安全、方便的进行数据存储与访问
想象如果没有数据库,一个大学要怎么在计算机中存储学生、教师、课程等数据?
那只能够将数据存储在操作系统的文件中,并且编写对应的程序对于这些数据进行读写操作。至少需要有:
- 增加学生、教师和课程。
- 为课程注册学生,产生班级花名册
为学生填成绩,算绩点。
当需求增多,新的应用程序就需要被加入系统中,比如学校需要开设新的专业,就业为这个专业新建新的永久性文件(或者在现有文件增加新的数据),为了满足这个新专业数据处理的特殊规则,就需要编写新的程序。久而久之,越来越多的程序和文件会被添加到操作系统。这种文件处理系统(file-processing system)在传统操作系统中是被支持的。
它有什么问题?
- 数据冗余与不一致。比如学生半旧的地址信息可能重复出现在音乐课和美术课的文件中,更新了音乐课中半旧的地址,又可能忘记了美术表的地址更新。
- 数据访问困难,比如需要筛选分数超过60分的学生,就需要手动进行过滤或者编写程序完成。筛选性别为男的学生又需要重复上面的过程。
- 数据孤立,不同的数据分布于不同的文件,并且文件的数据组织结构还可能不同,想要检索适当的数据很困难。
- 完整性问题,比如要求每个系的财务账户余额不能小于0,需要编写对应的程序完成,这些财务数据还跨文件。问题会变得越来越复杂。
- 原子性问题,一致性问题,安全性问题…
总结起来就是三个特点,不好存,不好取,不安全。数据库就是为了解决这些问题的。
3.数据视图——将数据库从复杂变简单
数据的存储与维护是复杂的,对于用户当然不需要知道这些无聊枯燥的过程,数据库系统为用户提供了抽象视图,隐藏数据存储维护的某些细节。
3.1 数据模型:描述数据的方式
数据库的基础是数据模型,是一个描述数据、数据关系、数据语义和一致性约束概念工具的集合。可以分为四类。
关系模型(relational model),使用表来表示数据与数据之间的联系。表也被称为关系。
实体、联系模型(entity-relationship model),实体是现实世界中的一件“事情”或者一个“物体”。实体-联系模型包括数据实体与数据之间的联系,在数据库设计阶段广泛应用,后续文章会详细介绍。
- 半结构化模型。结构化的数据模型可以有效的支持数据查询的响应,但是无法支持数据结构的动态修改。半结构化模型允许相同类型的数据项含有不同的属性集,比如json和xml。
- 半结构化模型可以有效的处理以下场景:
(1)数据缺失
例如,在公司人事档案库中,已婚雇员会有配偶项信息,而未婚的雇员则无该项信息
(2)单值和集合值属性兼容
在传统查询语言如SQL、OQL、XSQL中, 单值和集合值属性是不兼容的,即集合不能按单值处理,单值也不能按集合处理。半结构化模型可以解决该问题。
(3)查询对象类型各异
在WWW 和异构信息源集成时,会有不少内容相同而类型各异的问题。如一信息源上的电话信息是用字符串表示,而另一信息源上则可能用整数表示。有些电话信息上可能带区号,而有些则不带。又如WWW上的主页,相同实体的类型差异也很大。如主页里的朋友项,有的是用字符串给出名字,有的则带有简单描述信息或是指向其朋友的网络地址。这就要求查询处理时有宽松的类型限制或没有类型检查。
(4)异构的查询返回结果
半结构化数据的同类实体查询会出现不同的结果对象,选择语句的返回结果可能因数据源的不同而异。
(5) 查询的对象结构未知
基于对象的数据模型。
java,c++等面向对象语言成为主导的软件开发语言,工程师们通过过程已经将对象的概念很好的整合到了关系型数据库中。
关系型数据模型是大多数数据库的理论基础。
3.2 数据抽象:屏蔽复杂细节
为了能够使数据库中的数据被高效地检索,数据库的开发人员不得不使用复杂的数据结构来表示数据。而数据库的用户多没受过专业的计算机训练,需要对他们进行如下几个层次的数据抽象,让不同层次的用户关注自己这层的事情,屏蔽不需要的内容。
- 物理层。物理层描述数据实际上是如何存储的。
- 逻辑层。逻辑层描述存储什么样的数据以及数据之间联系。
- 视图层。逻辑层尽管采用了相对简单的结构,但是还是具有一定的复杂性,数据库系统的用户可能并不需要这部分的数据,只需要一部分的数据,以用户友好,需要的方式展现出来。
3.3 实例和模式
数据库的整体设计被成为模式(schema),这就相当于一个模板。数据库在某一个特定时刻存储的数据总和被称为实例(instance).举个栗子,数据库的模式就像是变量的定义,而变量在每个时刻都会特定的值,这个值对应是数据库模式的一个实例。
按照不同的抽象层次划分,数据库有几种模式。物理模式在物理层描述数据库的设计,逻辑模式在逻辑层描述数据库的设计,数据库在视图层也可以有几种模式,通常被称为子模式,它用于描述数据库的不同视图。一般与程序员打交道的是逻辑模式。
4.数据库语言——定义和操作数据
数据库的定义语言DDL与数据库的操作语言DML都是数据库系统的操作语言,他们都是SQL语言的一部分,关系型数据库几乎都使用SQL语言。
4.1 数据定义语言
数据定义语言DDL用来进行数据存储和定义。数据库中的数据必须满足一致性约束,常见的约束有:
- 域约束。如,整数型、字符型、日期、时间等。
- 引用完整性。一个course中记录的dept_name必须出现在department关系中某个记录的dept_name属性中。
- 授权。不同的用户在数据库中的不同数据值上允许不同的访问类型。常见的是,读权限,插入权限、更新权限、删除权限。
- DDL的输出会被放在数据字典中,数据字典也包含元数据,也就是关于数据的数据。数据字典可以被看做一种特殊的表,这种表只能有数据库系统本身(不是常规的用户)来访问和修改。在读取和修改实际的数据前,数据库系统先要参考数据字典。
SQL数据定义语言可以参考:
create table department (dept_name char(20), building char(15), bugetn numeric(12,2));
我们还可以加完整性约束,后续文章会详细介绍。
4.2 数据操作语言
DML可以对数据进行访问和操作( 增删改查)。有以下两种类型。
过程化DML(procedural DML),要求用户指定需要什么数据以及如何获得这些数据。
声明式的DML(declarative DML),也被称为非过程化的DML,只要用户指定需要什么数据,而不必指明如何获取这些数据。
声明式的DML通常更加易学易用,由于用户不指明如何获得数据,数据库系统必须要提供一种访问数据的高效途径。
最常用的数据库查询语言SQL是非过程化的。举个栗子,一个常见的SQL查询语句如下。
select instructor.name from instructor where instructor.dept_name = 'History';
4.3 从应用程序访问数据库
很显然,sql语句只可以下发给数据库进行数据的访问与操作,对于从用户输入数据,输出到显示器或者网络上等活它不管,需要高级宿主语言比如C、C++,JAVA来完成。高级宿主语言要想和将SQL指令发送给数据库,数据库就必须提供接口。对于C语言等其他几种语言,开放数据库连接(ODBC)标准定义提供了接口,JDBC标准为java语言提供了相应的接口。