跳转至

Lec 1: Introduction⚓︎

4045 个字 预计阅读时间 20 分钟

数据库管理系统(database management system, DBMS):一组相互关联的数据,以及一套访问这些数据的程序。它的基本目标是提供一种方便高效的存储和检索数据库信息的方式。

数据库(database):存放数据的容器,包含与企业相关的大体量的信息。

学习数据库的原因:

  • 数据处理和管理是计算机应用中的一大重要领域,对于计算机科学家而言,掌握数据库概念的知识相当有必要
  • 数据库遍布于信息社会的方方面面
  • 4.0 学分的课不得不学

学习数据库的三个方面:

  • 数据库的建模和设计:从现实世界中建立(抽象)的数据模型,然后将其转化为对 DBMS 而言合适的形式(比如表格 (tables)、视图 (views) 等)
  • 编程:使用数据库——对数据的查询和更新
  • DBMS 的实现:DBMS 如何工作,我们如何设计一个 DBMS

Database-System Applications⚓︎

对于数据库应用而言,其核心不是执行计算的程序,而是数据本身。

数据库系统用于管理具有以下特征的数据:

  • 价值高
  • (相对而言)体量很大
  • 允许被多个用户和程序访问,且通常是同时的

抽象(abstraction) 这一概念在数据库管理中(而且在其他领域也)非常重要,它能让我们在不了解设备或系统的底层细节的情况下,能够使用这些复杂的设备或系统。数据库系统提供了简洁、抽象的视图,使得用户和应用程序员无需注意关于数据存储和组织的底层细节。

尽管用户界面隐藏了访问数据库的细节,且很多人甚至没有注意到他们在与数据库打交道,但是访问数据库这件事已经成为我们日常生活的重要部分。

数据库使用的两种模式:

  • 支持在线事务处理(online transaction processing):最基本的模式,针对大量用户访问的数据库应用
  • 支持数据分析(data analytics):从数据中得出结论,用于商业决策
    • 需要建立预测模型 (predictive models)
    • 数据挖掘 (data mining)

Purpose of Database System⚓︎

数据库系统的使用目的,很大程度上是为了克服计算机操作系统自带的文件处理系统(file-processing system) 的缺陷。文件处理系统用于存储位于各种文件的永久记录,需要用不同的应用程序提取其中的记录,或向合适的文件添加记录,这为保持信息的组织性带来了一定阻碍,理由如下:

  • 数据的冗余 (redundancy) 和不一致性 (incosistency)
    • 不同的文件有不同的结构,程序可能用好几种编程语言编写
    • 相同的信息可能被复制在不同的地方
    • 冗余会带来更多的存储和访问成本
    • 数据不一致性:相同数据的不同拷贝不一致
  • 访问数据的困难:无法满足个性化的数据查询需求,如果要访问具有特定特征的数据,需要专门编写程序,或者手工从所有数据中筛选符合条件的数据,但这两种方法都无法令人满意
  • 数据隔离 (isolation):数据可能散落在不同的文件内,且文件可能具备不同的格式
  • 完整性 (integrity) 问题:存储在数据库的数据值必须满足特定类型的一致性限制,但是文件系统很难维护这样的限制
  • 原子性 (atomicity) 问题
    • 当故障发生时,数据必须恢复到故障发生前的状态
  • 并发访问异常 (concurrent-access anomalies)
  • 安全问题
    • 并不是所有用户都有权限访问数据库内的所有数据
    • 文件系统很难确保数据库的安全性约束

而数据库系统正能解决上述所有的问题,因此逐渐发展起来,现在被广泛使用。

View of Data⚓︎

Data Models⚓︎

数据模型(data model):用于描述数据、数据关系、数据语义以及一致性限制的概念工具。有以下几类数据模型:

  • 关系模型(relational model):一组用于表示数据和数据之间的关系的表格。

    • 每个表格都有多个列,每列都有唯一的名称
    • 表格又称为关系(relation)
    • 这是最为广泛使用的数据模型
    例子

  • 实体 - 联系模型(entity-relationship/E-R model)

    • 实体 (entity)(对象:用一些属性 (attributes) 来描述实体

    • 联系 (relationship)

    例子

  • 半结构化数据模型(semi-structured data model):允许相同类型的数据项有不同的属性(而上述的两类数据模型均不允许)

    • 例子:XML(extensible markup language)、JSON
  • 面向对象模型:因面向对象编程 (OOP) 的兴盛而发展起来的,其中的对象概念可以被融入到关系数据库中

    • 可将这类模型看作是关系模型的扩展,包含了封装 (encapsulation)、方法和对象等概念
  • 更老的模型:网状模型、层级模型

数据模型的一大重要功能在于:不仅对于一般的数据库用户,甚至对于数据库应用的开发者也隐藏了底层的实现细节。

Data Abstraction⚓︎

开发者通过以下几层数据抽象(data abstraction) 来简化用户与数据库系统的交互:

  • 物理层(physical level):描述记录的存储方式(复杂的底层数据结构)
    • 将表格以记录序列的形式存储在文件中,不同的属性、不同的记录用特殊字符(比如用逗号和换行符)隔开
    • 使用索引以支持高效的记录检索
    • 此外还定义了用于高效访问数据的算法
  • 逻辑层(logical level):描述存储于数据库内的数据内容,以及数据之间的联系
    • 位于逻辑层的用户(比如数据库管理员)无需关注物理层的复杂性,这称为物理数据独立性(physical data independence)
  • 视图层(view level):最高层的抽象,位于该层的用户仅能访问部分数据库的内容
    • 该层的目的在于简化用户与系统的交互,并提供了多个视图
    • 此外还提供了安全机制,以阻止用户访问数据库的某些部分

Instances and Schemas⚓︎

  • 实例(instances):在特定的时间内,存储在数据库中的一组信息
  • 模式(schemas):数据库的总体设计

模式和实例之间的关系类似编程语言中的变量声明和变量值。

数据库的模式可以分为以下几类:

  • 物理模式(physical schema):描述在物理层上的数据库设计
  • 逻辑模式(logical schema):描述在逻辑层上的数据库设计
    • 对于应用程序而言,该模式是最为重要的,因为程序员需要通过该模式来构建程序
    • 一般来说,逻辑模式更改的频率不高,但是对于新建的数据库应用而言,可能需要更加灵活的逻辑模式(比如单个关系内的不同记录可能有不同的属性)
  • 子模式(subschema):描述数据库内的不同视图

Database Languages⚓︎

数据库语言的组成部分有:

  • 数据定义语言(data-definition language, DDL):用于指定数据库模式,描述数据的性质

    • 该语言还要指明数据的存储结构、访问方法和一致性约束 (consistency constraints)
    • 完整性约束包括:

      • 域约束(domain constraints):域的取值和它对应的属性类型相关
      • 参照完整性(referential integrity):出现在某个关系中的一组属性的值,也会出现在另一个关系的对应属性中
        • 对数据库的修改可能会破坏参照完整性
      • 授权(authorization):权限可以分为以下几类,不同用户获得的权限可以是这些权限的组合:
        • 读取 (read) 授权:只读,不可修改
        • 插入 (insert) 授权:可插入数据,但不可修改现有数据
        • 更新 (update) 授权:可以修改数据,但不可以删除数据
        • 删除 (delete) 授权:允许删除数据
    • 处理完 DDL 后得到的输出会存在一个称为数据字典(data dictionary) 的特殊文件内(可看作特殊的表格,只允许数据库自身访问和更新里面的内容,里面包含了元数据(metadata)(即“数据的数据”,包括:数据库模式、数据存储结构、访问模式和约束、统计信息、授权 (authorization)

  • 数据操纵语言(data-manipulation language, DML):允许用户访问和操纵那些被合适的数据模型组织过的数据,包括检索、插入、删除、修改等操作,分为以下两类:

    • 过程型(procedural) DMLs:用户指明所需数据以及获取数据的方法,比如 C、Pascal、Java 等语言
    • 声明型 / 非过程型(declarative/nonprocedural) DMLs:用户只需指明数据,无需指出如何获取数据,相比过程性 DMLs 更易于使用,比如 SQLProlog 等语言
  • 数据控制语言(data-control language, DCL)

SQL⚓︎

  • 查询(query):请求信息检索的语句。
  • 查询语言(query language):DML 中包含信息检索的那部分
  • SQL(structured query language,结构化查询语言:使用最广泛的查询语言
    • SQL 提供了丰富的 DDL,允许定义带有各种数据类型和完整性约束的表格
    • SQL 是非过程的查询语言,查询将一张或多张表格作为输入,输出一张表格

Database Access from Application Programs⚓︎

SQL 这样的非过程型查询语言并不具备与通用图灵机一样强大的能力,因为它无法进行一般编程语言能够做到的计算,也不支持用户输入、输出显示和网络通信等行为。因此这样的计算和行为必须用宿主语言(host language) 编写(比如 C/C++、Java、Python ,并依靠嵌入式的 SQL 查询来访问数据库内的数据。应用程序(application program) 就是通过这种方式来和数据库交互的程序。

一般来说,应用程序通过 API 来向数据库发送 DML DDL 语句并检索数据。下面列出两种常见的 API

  • ODBC(open database connectivity, 开放数据库互连:定义了 C 和其他语言的 API
  • JDBC(Java database connectivity, Java 数据库互连:定义了 Java 对应的接口

下面这张图片很好地概括了上述内容:

Data Design⚓︎

数据库设计步骤:

  • 需求分析(requirement analysis):需要什么数据、应用和操作
  • 概念设计(conceptual design):用 E-R 模型或类似的高级数据模型,以及一些算法来对数据进行高层级的描述
  • 逻辑设计(logical design):将高层的概念模式映射到数据库系统所用到的数据模型的实现中
  • 模式改善(schema refinement)(规范化 (normalization):检查关系模式中的冗余和关系异常
  • 物理设计(physical design):索引 (indexing)、聚类 (clustering) 和数据库调优 (tuning)
  • 创建和初始化数据库、安全设计(create and initialize database & security design)
    • 加载初始数据并测试
    • 识别不同的用户组及其角色

Data Engine⚓︎

数据库的功能组件可以分为:

  • 存储管理器(storage manager):为存储在数据库的底层数据、应用程序和提交到系统的查询之间提供接口

    • 需要与文件系统打交道,将各种 DML 语句翻译为底层的文件系统命令,并负责存储、检索和更新数据库内的数据
    • 组成部分:

      • 授权和完整性管理器(authorization and integrity manager)
      • 事务管理器(transaction manager):维护一致性和并发事务执行
      • 文件管理器(file manager):管理硬盘存储空间分配
      • 缓冲区管理器(buffer manager):将数据从硬盘拿到主存中,并决定将哪些数据放在缓存中
    • 存储管理器实现了如下数据结构,作为物理系统的实现:

      • 数据文件:存储数据库自身
      • 数据字典:存储数据库结构的元数据,尤其是数据库的模式
      • 索引:提供对数据项的快速访问
  • 查询处理器(query processor):包括以下组成部分

    • DDL 解释器(interpreter):解释 DDL 语句,并将定义记录在数据字典中
    • DML 编译器(compiler):将用查询语言表述的 DML 语句翻译为由底层指令构成的评估计划 (evaluation plan),此外还支持查询优化(选择成本最低的评估计划)
    • 查询评估引擎(query evaluation engine):执行由 DML 编译器生成的底层指令

  • 事务管理组件(transaction management component)

    • 事务(transaction):用于在数据库应用中执行单个逻辑功能的一组操作
    • 事务的要求——ACID原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)
    • 事务管理组件的组成部分:
      • 恢复管理器(recovery manager):通过备份或恢复子系统,来确保数据库在系统或事务故障时,能够保持数据库的一致(正确)状态
      • 并发控制管理器(concurrency-control manager) 用于控制并发事务之间的互动

Database and Application Architecture⚓︎

数据库系统架构图

  • 上述架构适用于共享内存,并使用多个 CPU 并行处理的服务器架构
  • 为了应对更大规模的数据,以及更高的处理速度,可以采用并行数据库(parallel database) 分布式数据库(distributed database)

下面考虑使用数据库作为后端的应用架构,可以分为:

  • 两级架构(two-tier architecture):应用程序位于客户端机器内,通过查询语言语句调用位于服务器上的数据库系统
  • 三级架构(three-tier architecture):
    • 客户端仅作为前端(浏览器或移动应用等,并不包含任何直接的数据库调用,与应用服务器通信
    • 应用服务器可以与数据库系统通信,以访问数据。应用的商业逻辑 (business logic) 也嵌在应用服务器上
    • 相比两级架构具备更好的安全性和性能

Database Users and Administrators⚓︎

不同的用户接口类型对应以下不同类型的用户:

  • 普通 (naive) 用户:通过预先定义的用户接口(比如 web 或移动应用)与数据库系统交互
  • 应用程序员:编写应用程序,通过多种工具开发用户接口
  • 富有经验的用户:并不通过编写程序与系统交互,而是使用数据库查询语言,或者使用数据分析软件等工具来构建请求
  • 数据库管理员(database administrator, DBA):具备对数据库和程序的中央控制权的特殊用户。
    • DBA 具备该数据库的最高特权
    • DBA 需要协调好数据库系统的所有活动
    • DBA 控制数据库所有用户的权限 (authority)
    • DBA 需要对企业信息资源和需求有较好的了解
    • DBA 的责任:
      • 模式、存储结构和访问方法的定义
      • 模式和物理组织的调整
      • 对数据访问的授权
      • 日常维护:监控性能、响应要求的改变、数据库的安全(周期性备份 (backup) 数据库、故障时恢复、留够硬盘空间

Supplements⚓︎

DBMS 的历史进程
  • 文件访问系统(1950s-1960s)
  • 网状 (network)/ 层次 (hierarchy) DBMS(1960s-1970s)
  • 关系型数据库系统 (RDBMS)(1970s-)
  • 面向对象的数据库系统 (OODBMS)
  • 面向关系的数据库系统 (ORDBMS)
  • 面向应用的数据库系统:空间、时间、多媒体、网络 (Web) 数据库
  • 数据仓库 (data warehousing)、联机分析处理 (online analytical processing)、数据挖掘系统 (data mining system)
数据库市场

评论区

如果大家有什么问题或想法,欢迎在下方留言~