cmu 14-445是卡耐基梅隆大学的一门数据库课程

Overall Introduction of this class

  • Relation Databases
  • Storage
  • Execution
  • Concurrency Control
  • Distributed Databases
  • Potpourri

Databases

数据库是一个有组织的相互关联的数据集合,它为现实世界的某些方面建模(例如,在课堂或数字音乐存储中建模学生)。人们经常混淆“数据库”和“数据库管理系统”(例如,MySQL,Oracle,MongoDB)。数据库管理系统(DBMS)是一种管理数据库的软件。

考虑一个为数字音乐商店建模的数据库(例如,Spotify)。让数据库中保存关于这些艺术家的信息,以及这些艺术家已经发布了哪些专辑。

Flat File Strawman

数据库以DBMS管理的逗号分隔值(CSV)文件存储。每个实体都将存储在其自己的文件中。应用程序在每次想要读取或更新记录时都必须解析文件。每个实体都有自己的一组属性,因此在每个文件中,不同的记录由新行分隔,而记录中的每个相应属性都用逗号分隔。

按照数字音乐商店的例子,将会有两个文件:一个用于艺术家,另一个用于专辑。艺术家可以有名称、年份和乡村音乐属性,而专辑可以有名称、艺术家和年份属性。

Issues with Flat File

  • 数据完整性
    • 如何确保每个专辑作品的艺术家是相同的?
    • 如果有人用一个无效的字符串覆盖了专辑的年份该怎么办?
    • 如何存储一张专辑有多名艺术家的情况?
  • 实用性
    • 如何查找一个特定的记录
    • 如何使用相同的数据库,开发一个新的应用
    • 如何处理多个进程同时更改相同的文件内容
  • 数据持久性
    • 当程序更新数据时机器宕机应该怎么处理?
    • 当我们想要在多台机器上复制数据库以提高可用性时该怎么做?

Database Management System

DBMS是一种允许应用程序在数据库中存储和分析信息的软件。

一个通用的DBMS被设计用来定义、创建、查询、更新和管理数据库。

Early DBMSs

数据库应用程序很难构建和维护,因为逻辑层和物理层之间存在紧密的耦合。逻辑层是数据库拥有哪些实体和属性,而物理层是这些实体和属性的存储方式。在早期,物理层是在应用程序代码中定义的,所以如果我们想更改应用程序正在使用的物理层,我们就必须更改所有的代码来匹配新的物理层。

Relational Model

Ted Codd注意到人们每次想要改变物理层时都在重写DBMS,所以在1970年他提出了关系模型来避免这种情况。这个关系模型有三个关键点:

  • 将数据库存储为简单的数据结构(关系)

  • 通过高级语言访问数据

  • 数据的物理存储另行实现

数据模型(data model)是用于描述数据库中的数据的概念的集合。关系模型是一个数据模型的一个例子。

模式(scheme)是使用给定的数据模型对特定数据集合的描述。

关系模型定义了三个概念:

  • Structure:关系的定义及其内容。这是关系所具有的属性和这些属性可以持有的值。
  • Integrity:确保数据库的内容满足约束条件。一个示例约束条件是,年份属性的任何值都必须是一个数字。
  • Manipulation:如何访问和修改数据库中的内容。

关系(relation)是一个无序的集,它包含表示实体的属性之间的关系。由于这些关系是无序的,因此DBMS可以以任何它想要的方式来存储它们,从而允许进行优化。

元组(tuple)是关系中的一组属性值(也称为它的域)。最初,值必须是原子的或标量的,但现在的值也可以是列表或嵌套的数据结构。每个属性都可以是一个特殊的值,NULL,这意味着对于一个给定的元组,该属性是未定义的。

具有n个属性的关系称为n元关系。

键(key):关系的主键(primary key)唯一地标识单个元组。如果您没有定义一个内部主键,那么一些DBMS会自动创建一个内部主键。许多DBMS都支持自动生成的密钥,因此应用程序不必手动增加密钥。外键(foreign key)指定一个关系中的属性必须映射到另一个关系中的元组。

Data Manipulation Languages(DMLs)

一种从数据库中存储和检索信息的语言。这里有两类语言:

  • Procedural:该查询指定了DBMS应该用于查找所需结果的(高级)策略。
  • Non-procedural:查询只指定需要哪些数据,而不指定如何查找它。

Relation Algebra

关系代数是检索和操作关系中的元组的一组基本操作。每个操作符接受一个或多个关系作为输入,并输出一个新的关系。为了编写查询,我们可以将这些操作符“链式”在一起,以创建更复杂的操作。

  • Select Syntax:

    选择接受一个关系,并从该关系中输出满足选择谓词的元组子集。谓词就像一个过滤器,我们可以使用连词和分离词来组合多个谓词

  • Projection Syntax:

    投影接受一个关系,并输出一个与只包含指定属性的元组的关系。您可以重新排列输入关系中的属性的顺序,以及操作这些值。

  • Union Syntax:

    联合接受两个关系并输出一个关系,该关系包含出现在至少一个输入关系中的所有元组。注意:这两个输入关系必须具有完全相同的属性。

  • Intersection Syntax:

    交集接受两个关系并输出一个包含出现两个输入关系的所有元组的关系。注意:这两个输入关系必须具有完全相同的属性。

  • Difference Syntax:

    差分包含两个关系并输出一个关系,其中包含出现在第一个关系中的所有元组。注意:这两个输入关系必须具有完全相同的属性。

  • Product Syntax:

    乘积包含两个关系,并输出一个关系,其中包含来自输入关系的所有可能组合的元组。

  • Join Syntax:

    相交包含两个关系并输出一个关系,其中包含由两个元组组合的所有元组,其中对于两个关系共享的每个属性,两个元组的吸引点的值是相同的。

Observation

关系代数是一种过程性语言,因为它定义了如何计算查询的高级步骤。例如,说首先做R和S的连接,然后进行选择。 将首先在S上进行选择,然后连接。

这两个语句实际上会产生相同的答案,但是如果S中数以百万条元组中只有1个元组满足,那么 将比快得多。

一个更好的方法是说出您想要的结果,并让DBMS决定计算查询所要采取的具体步骤。SQL完全做到了这一点,而且它是在关系模型数据库上编写查询的实际标准。