总之,数据库系统和数据库管理系统是处理数据和信息的重要工具,能够有效地存储和管理大量相关联的数据,并提供对数据的高效访问和操作功能。
数据处理是对各种数据进行收集、存储、加工和传播的一系列活动,而数据管理则是对数据进行分类、组织、编码、存储、检索和维护的活动。数据管理技术经历了人工管理阶段、文件系统阶段和数据库系统阶段。
在人工管理阶段,由于计算机主要用于科学计算,数据处理是通过手工进行的。这个阶段的特点是数据量较少、数据不保存以及缺乏软件系统对数据进行管理。手工处理数据存在依赖性强、数据冗余等问题。
随着辅助存储设备的出现,进入了文件系统阶段。在文件系统中,数据被组织成文件,并通过文件系统进行存取和加工。文件系统阶段的特点包括数据可以长期保留、数据的逻辑结构和物理结构有区别、数据可重复使用等。然而,文件系统存在数据冗余、数据不一致性和数据孤立等问题。
最后进入了数据库系统阶段,其中数据库系统由计算机软件、硬件资源组成,能够组织地、动态地存储大量关联数据,实现数据的共享和交叉访问。数据库系统的特点包括采用复杂的数据模型表示数据结构、具有高度的数据独立性以及提供数据完整性、一致性和安全性管理手段。数据库系统相较于文件系统具有数据共享性、操作方便性和数据的高度独立性等优势。
数据处理和数据管理是相互关联的活动,随着技术的不断发展,数据管理从人工管理到文件系统再到数据库系统,逐步提高了数据的组织和利用效率。
数据库的基础结构是数据模型,包括数据结构、数据操作和数据的约束条件。历史上,数据库发展经历了三个阶段:层次和网状数据库系统、关系数据库系统和第三代数据库系统。
三级模式结构提供了数据的物理独立性和逻辑独立性,使得数据库系统更加灵活和可维护。
关系模型是关系数据库的基础,由关系数据结构、关系操作集合和关系完整性规则3部分组成。
关系数据库系统是支持关系数据模型的数据库系统,其应用了数学方法来处理数据。关系数据库的理论基础由E.F.Codd在1970年提出,并在之后的几十年取得了辉煌的成就。商业化的关系数据库管理系统如IBM DB2、Oracle、Ingres、SYBASE、Informix等得到广泛应用。关系数据库系统在各个领域的应用也迅速扩大。
关系数据库模式是关系数据库的结构描述,包括域的定义和关系模式的定义。关系数据库的值则是关系模式在某一时刻对应的关系的集合,也称为关系数据库。
具体来说,关系数据库模式由以下两部分组成:
域的定义:每个属性都有一个取值范围,该范围对应着属性的域。域定义了属性可以取值的类型和限制条件,例如整数、字符串等。
关系模式的定义:关系模式是对关系的结构和约束进行描述。它包含了关系的名称和属性的集合,以及对这些属性的约束条件,如主键、外键、唯一约束等。
关系数据库的值则是关系模式在某一时刻对应的实际数据。值是关系的集合,其中每个关系表示了表中的一组数据。关系由行和列组成,每一行表示一个元组(tuple),每一列表示一个属性,每个元组的值对应于相应属性的数据。
举个例子来说明,假设有一个关系数据库模式如下:
学生表(Student):
学号 | 姓名 | 年龄 |
---|---|---|
101 | 张三 | 20 |
102 | 李四 | 22 |
课程表(Course):
课程号 | 课程名 |
---|---|
C101 | 数据库 |
C102 | 算法 |
在这个例子中,学生表和课程表分别是关系模式,描述了学生和课程的属性和结构。而具体的学生数据和课程数据则是关系数据库的值,表示了实际的学生信息和课程信息。例如,学生表中的第一行记录表示学号为101的学生叫张三,年龄为20岁。
关系的完整性约束用于保证数据的一致性,防止对数据的意外破坏。主要分为以下三类:
实体完整性 (Entity Integrity):要求每个数据表都必须有主键,并且作为主键的所有字段的属性必须是唯一且非空的。例如,在一个学生表中,学号可以作为主键,保证每个学生的学号都是唯一且非空的。
参照完整性 (Referential Integrity):描述了关系模型中实体之间的联系和引用。如果一个关系R的外码F与另一个关系S的主码Ks相对应,则对于关系R中的每个元组,在F上的值要么为空值,要么等于关系S中某个元组的主码值。例如,如果有一个员工表和一个部门表,员工表中的部门编号字段作为外码与部门表的主码对应,这样就可以通过参照完整性来确保员工表中的部门编号必须是有效的部门编号。
用户定义完整性 (User Defined Integrity):针对特定的关系数据库设计,反映了某个具体应用所涉及的数据必须满足的语义要求。这些约束是由应用程序的环境决定的。例如,银行系统中可以定义用户账户余额必须大于等于100000,小于999999这样的规则,以确保账户余额的有效范围。
关系操作的特点是操作对象和操作结果都是集合,其中操作包括集合运算符、专门的关系运算符、算术比较符和逻辑运算符。
集合运算符:包括并、交和差。并操作符(∪)用于将两个关系的元组合并成一个新的关系,交操作符(∩)用于获取两个关系的共有元组,差操作符(-)用于从一个关系中剔除另一个关系中的元组。
专门的关系运算符:包括选择、投影、连接和除法。选择操作符(σ)根据给定的条件选择满足条件的元组,投影操作符(π)则将关系中的某些属性投影到一个新的关系中。连接操作符(⨝)用于将两个关系的元组按照某种条件连接起来,除法操作符(÷)用于求解某个关系在另一个关系中的商。
算术比较符:用于对关系中的属性进行比较,包括等于(=)、不等于(<>)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)。
函数依赖(Functional Dependency):函数依赖是指在关系模式中,一个属性或属性集合的取值能够决定另一个属性的取值。例如,如果在关系R(A, B, C)中,属性A的取值能够唯一地决定属性B的取值,则可以表示为 A→B。函数依赖在关系数据中起到了约束和规范的作用,帮助保证数据的一致性和完整性。
多值依赖(Multivalued Dependency):多值依赖是指在关系模式中,一个关系中的某个属性集合对于另一个属性集合的取值具有多个可能的依赖关系。例如,如果在关系R(A, B, C)中,属性A和属性B的取值决定了属性C的取值,同时属性A和属性C的取值决定了属性B的取值,则可以表示为 A→→C 和 A→→B。多值依赖的存在可能引起数据冗余和不一致性,需要进行规范化来消除。
规范化(Normalization):规范化是指通过分解关系模式,将其转化为更小、更简洁、更符合数据库设计原则的关系模式的过程。规范化的目标是消除数据冗余和不一致性,提高数据库的性能和可维护性。常用的规范化形式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。每个范式都有特定的依赖关系要求,例如1NF要求属性具有原子性,2NF要求非主属性完全依赖于候选键,3NF要求非主属性不存在传递依赖等。
通过函数依赖和多值依赖的分析,可以进行规范化的过程,将关系模式分解成更小的、符合范式要求的关系模式,从而提高数据库的设计质量和性能。
数据库设计一般包括以下六个阶段:
数据需求分析是在项目确定之后,用户和设计人员对数据库应用系统所要涉及的内容(数据)和功能(行为)的整理和描述。需要进行详细调查,在了解现行系统的概况,确定新系统功能的过程中,收集支持系统目标的基础数据及处理方法。分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。需求分析的重点是调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求,以此获得用户对系统的信息要求、处理要求和系统要求等。
数据需求分析是后续开发的基础,因为逻辑设计、物理设计以及应用程序的设计都会以此为依据。有效的沟通和合作是非常重要的,分析人员需要了解用户的各项业务并进行分析和加工,将用户眼中的业务转换成为设计人员所需要的信息组织。
概念结构设计的目标是产生反映系统信息需求的数据库概念结构,即概念模式。概念结构是独立于支持数据库的DBMS和使用的硬件环境的。常用的方法是实体-联系方法(E-R方法),它使用E-R模型将现实世界的信息结构统一由实体、属性和实体之间的联系来描述。概念结构设计的步骤包括选择局部应用、逐一设计E-R图和合并E-R图。
在概念结构设计中,设计人员从用户的角度看待数据以及数据处理的要求和约束,产生一个反映用户观点的概念模式。这个过程涉及对现实事物的分类、聚集和概括,进而确定实体、属性和联系的定义。通过E-R图的设计,可以将需求分析阶段得到的数据进行整理和组织,形成清晰的概念模式。概念结构设计是将用户需求转换为逻辑模式的关键一步。
通过以上步骤,可以建立一个精炼的、能够被所有用户共同理解和接受的全局概念模型。
E-R图转换为关系模式:
物理设计的主要工作步骤包括确定数据分布、存储结构和访问方式。
存储记录结构设计需考虑数据项的类型、长度和联系,而存储记录布局则确定数据的存放位置,可采用聚簇功能提高查询效率。存取方法的设计包括存储结构和检索机制,通过建立索引来满足多用户的多种应用要求。然而,需要注意不宜对过小、经常更新、属性值很少、过长、特殊数据类型或不常出现在查询条件中的属性建立索引,以避免影响性能。
根据逻辑和物理设计的结果,在计算机上实现数据库,这个过程包括建立实际的数据库结构、数据加载以及进行试运行和评价。
数据库维护工作包括对数据库性能的监测和改善、故障恢复以及数据库的重组和重构。DBA需要利用系统提供的性能监控和分析工具,经常对数据库运行、存储空间及响应时间进行分析。备份方案应根据应用要求制定不同的备份方案,保证一旦发生故障能够快速将数据库恢复到一致性状态。数据库重组是去除废弃空间和碎片空间中的指针链,使数据库记录在物理上紧连;数据库重构包括表结构和视图的修改,需要评价和验证,保证数据的安全性。
数据库提供的库函数级别的数据访问接口,如Oracle Call Interface(OCI),是最底层的高级程序语言访问数据接口。OCI由一组API组成,包含连接数据库、调用SQL和事务控制等函数,通过调用OCI库函数实现对数据库的访问。OCI开发方法将SQL和高级程序语言相结合,具有SQL语言非过程性和C语言过程性的优点,但往往强依赖于特定数据库,需要对该数据库机制有较深的理解,学习难度大,开发效率不高。
嵌入式SQL(Embedded SQL)是一种将SQL语句直接嵌入到高级程序语言源代码中的方法,使得应用程序可以访问和处理数据。宿主语言是指嵌入SQL的目标源码语言,如C、COBOL、Java等。数据库厂商需要提供嵌入式SQL的支持,包括预编译器和函数库,以解决宿主语言编译器无法识别SQL程序、数据传递、查询结果赋值、数据类型转换等问题。嵌入式SQL中除了执行标准SQL程序外,还增加了宿主变量声明、数据库访问、事务控制、游标操作等额外的语法成分。通过嵌入式SQL,应用程序可以更方便地与数据库交互。
开放数据库连接(ODBC)是为解决异构数据库间的数据共享而产生的,它提供了统一的接口,允许应用程序以SQL为标准访问不同的DBMS。ODBC的优点是可以以统一的方式处理所有关系数据库。
在具体操作中,需要先使用ODBC管理器注册一个数据源,然后应用程序通过ODBC与具体数据库建立连接。
为了简化ODBC的操作,微软开发了数据库访问对象(DAO)、远程数据库对象(RDO)、ActiveX数据对象(ADO)等数据库接口。这些接口分别适用于不同的应用场景和数据库类型。ADO.NET是在.NET框架下开发的一组面向对象类库,用于与数据源进行交互。
Java数据库连接(JDBC)是Java语言中用于访问数据库的应用程序接口,提供了查询和更新数据库的方法。JDBC可以为多种关系数据库提供统一访问,它是一种基础接口,可以构建高级接口和工具。
对象关系映射(ORM)是一种程序设计技术,用于实现面向对象编程语言中不同类型系统数据之间的转换。ORM通过使用元数据,将程序中的对象与关系数据库相互映射,可以解决数据库与程序间的异构性。
ORM负责实体域对象的持久化,封装数据库访问细节,提供了实现持久化层的另一种模式。采用映射元数据(XML)来描述对象-关系的映射细节,使得ORM中间件能在任何一个应用的业务逻辑层和数据库之间充当桥梁。
在软件开发效率上,ORM的使用降低了程序员数据库知识的要求。在编程过程中,程序员只需考虑对象即可,无需关心数据库中的数据模式及对应的SQL语句。
在Java语言环境中,常见的ORM框架包括Hibernate、Mybatis和JPA等。其中,Hibernate是全自动的框架,强大、复杂、笨重、学习成本较高;Mybatis是半自动的框架;JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,是Java自带的框架。
本文介绍了当前出现的不同类型、面向不同应用的 NoSQL 数据库,总结了四种主要类型及其特点:列式存储数据库、键值对存储数据库、文档型数据库和图数据库。这些数据库普遍具有易扩展、大数据量、高性能、灵活的数据模型和高可用等特点。虽然业界对 NoSQL 并没有明确的范围和定义,但是这些特点是它们共同的特征,也是其在大数据环境下得以广泛应用的重要原因。
总结起来,NoSQL整体框架包括数据持久层、数据分布层、数据逻辑模型层和接口层。其中,数据持久层定义了数据的存储形式,包括基于内存、硬盘、内存和硬盘接口、订制可插拔等形式;数据分布层定义了数据的分布方式,包括CAP支持、多数据中心支持和动态部署支持;数据逻辑模型层定义了数据的逻辑表现形式;接口层提供了方便的数据调用接口,包括Rest、Thrift、Map/Reduce、Get/Put和特定语言API等。
NoSQL数据库适用于数据模型简单、需要灵活性更强的IT系统、对数据库性能要求较高、不需要高度的数据一致性以及在给定key下映射复杂值的环境。虽然每个产品在每一层都可以有多种选择,但这种分层设计提供了灵活性和兼容性。