IBM-数据工程-IV-笔记-全-
IBM 数据工程 IV 笔记(全)
001:数据基础知识复习 📚


在本节课中,我们将要学习数据的基本概念,包括数据的定义、分类、常见格式以及存储方式。这些知识是理解后续关系数据库内容的重要基础。
什么是数据?💡
当今世界充满了数据。我们如何定义数据?数据是未经组织的信息,经过处理后变得有意义。它可以由事实、观察或感知、数字、字符或符号、图像或这些元素的混合组成。


数据的结构分类 🗂️





数据可以根据其结构的层次和严格性进行分类。它可以分为结构化、半结构化和非结构化数据。





结构化数据
结构化数据可以像表格一样用行和列来表示。它拥有定义良好的模式(Schema)和严格的结构。这些特性使得关系数据库非常适合存储结构化数据,因为关系数据库正是将数据存储在表中。
核心概念:结构化数据 = 表格形式(行和列) + 定义良好的模式。

半结构化数据

半结构化数据具有一定的组织属性,但不足以轻松存储在严格表格模式所要求的行和列中。相反,半结构化数据使用标签和元数据组织成层次结构。
非结构化数据



非结构化数据没有可识别的结构。它不遵循任何特定的格式、顺序、语义或规则。它无法被组织成表格格式以存储在关系数据库中。非结构化数据通常存储在 NoSQL 数据库中。




数据来源 🌐
如今有大量的数据来源可用,从存储在数据库、平面文件或 XML 数据中的现有数据,到从网络抓取、数据流和订阅源收集的数据,再到从社交平台和带有传感器的物联网设备收集的数据。所有这些数据都可以被存储、处理并用于分析,为企业提供对其绩效的洞察。
常见数据文件格式 📄




数据可以以多种不同的文件格式保存或在系统间传输。以下是几种常见的格式:
上一节我们介绍了数据的来源,本节中我们来看看数据是如何被存储和传输的。以下是几种常见的数据文件格式:

- 分隔文本文件:在这些文件中,数据按行存储,每个变量由特定字符(如逗号或制表符)分隔。分隔文件包括:
- CSV:逗号分隔值文件。
- TSV:制表符分隔值文件。
- 电子表格:在这些文件中,数据像表格一样存储在行和列中。这使得数据易于访问和操作。你可以使用电子表格来创建 CSV 文件。
- 标记语言文件:如可扩展标记语言(XML)和 JavaScript 对象表示法(JSON),它们具有用于编码通过互联网发送的数据的既定规则和结构。
- XML:人类和机器都可读,独立于平台和编程语言。也就是说,它可以用任何编程语言读取。
- JSON:同样独立于编程语言。它是共享任何大小和类型数据(包括音频和视频)的热门选择。许多 API 和 Web 服务都返回 JSON 格式的数据。




数据存储:数据库 🗄️

一旦你收集了所有数据,应该将其存储在哪里?结构化和半结构化数据通常存储在数据库中,例如关系数据库(如 DB2)或非关系数据库(如 MongoDB)。每种类型的数据库都针对不同类型的操作进行了优化。你需要的数据类型以及你想对其应用的处理过程将决定你选择的存储类型。

联机事务处理系统
联机事务处理系统(OLTP)针对存储企业日常运营所需的大量数据进行了优化。OLTP 系统通常是关系数据库。
联机分析处理系统


联机分析处理系统(OLAP)针对执行复杂的数据分析进行了优化。OLAP 系统包括关系和非关系数据库、数据仓库、数据湖和其他大数据存储。




关系数据库



关系数据库由存储在相关表中的结构化数据组成。表之间的链接以最小化数据重复的方式定义,同时仍保持所有所需的复杂关系。关系数据库及其支持系统称为关系数据库管理系统(RDBMS)。例如 IBM DB2、Microsoft SQL Server、Oracle 和 MySQL。

关系数据库主要是用于支持日常业务活动的 OLTP 系统,例如客户交易、人力资源活动和工作流程。它们也可用于执行数据分析。例如,来自客户关系管理系统的数据可用于进行销售预测。
总结 📝


本节课中我们一起学习了数据的基础知识。我们了解到,数据是可以被处理以变得有意义的信息,如事实、数字、字符和图像。数据可以分为结构化、半结构化和非结构化。不同的数据源提供不同类型的数据,例如来自社交媒体的数据可能是非结构化或半结构化的。数据可以存储在关系数据库和非关系数据库等多种存储库中,并且可以通过 CSV、XML 和 JSON 等文件格式进行传输。
002:信息与数据模型 📊


在本节课中,我们将要学习信息模型与数据模型的基本概念,理解关系模型的优势,并掌握实体与属性的定义与区别。
信息模型与数据模型
信息模型和数据模型是数据库设计中的两个核心概念。它们服务于不同目的,处于不同的抽象层次。



信息模型是一种抽象的形式化表示,它描述了实体、实体的属性、实体间的关系以及可对实体执行的操作。这些实体可以来自现实世界,例如一个图书馆。信息模型处于概念层面,侧重于定义对象之间的关系。




数据模型则是数据库系统的蓝图。它定义在更具体的层面,包含特定细节,用于指导数据库的实际构建。



上一节我们介绍了信息模型与数据模型的基本定义,本节中我们来看看几种不同的信息模型类型。



信息模型的类型


存在多种不同类型的信息模型,其中最熟悉的是层次模型,它通常用于展示组织结构图。

以下是层次模型的主要特点:


- 树状结构:层次模型使用树形结构组织数据。树的根部是父节点,其后是子节点。
- 父子关系:一个子节点不能拥有多个父节点。然而,一个父节点可以拥有多个子节点。
第一个层次数据库管理系统是IBM于1968年发布的信息管理系统(IMS),它最初是为阿波罗太空计划构建的数据库。
关系模型与实体关系模型



关系模型是数据库中最常用的数据模型,因为它支持数据独立性。数据存储在简单的数据结构——表中。这提供了逻辑数据独立性、物理数据独立性和物理存储独立性。
实体关系数据模型(ER数据模型)是关系数据模型的一种替代设计工具。它建议将数据库视为实体的集合。ER模型本身通常不作为独立的数据库模型使用,而是作为设计关系数据库的工具。



在ER模型中,实体是数据库中独立于其他任何对象而存在的对象。将ER图转换为表的集合非常简单。ER图的构建块是实体和属性。



实体与属性

实体可以是名词、人、地点或事物。属性是描述实体的数据元素,它们告诉我们更多关于实体的信息。
在ER图中,实体用矩形表示,属性用椭圆形表示。每个属性只连接到一个实体。
以简化的图书馆数据库为例:
- “书” 是一个实体。
- 实体“书”拥有诸如书名、版次、出版年份等属性。
- 在数据库中,实体“书”成为一张表,其属性则成为该表中的列。

继续图书馆的例子,书由作者撰写。因此,“作者”也是一个实体。

以下是“作者”实体的属性示例:
- 作者姓氏
- 作者名字
- 电子邮件
- 城市
- 国家
- 作者ID(用于唯一标识作者)
同样,实体“作者”在数据库中成为一张表,其属性成为该表的列。



在简化图书馆数据库的设计过程中,我们会逐步识别其他实体,例如借阅图书的“借阅者”、每本书的多个“副本”以及已借出的“借阅记录”。最终,每个ER图中的实体都会成为数据库中的一张表。



总结
本节课中我们一起学习了以下核心概念:
- 信息模型是包含实体属性、关系及操作的抽象形式化表示。
- 数据模型定义在更具体的层面,包含细节,是数据库系统的蓝图。
- 关系模型因其支持逻辑、物理及存储独立性而成为最常用的数据库模型。
- 实体是数据库中独立存在的对象,可以是人、地点或事物(如书或作者)。
- 属性是描述实体的数据元素(例如,“书”实体拥有“作者”、“书名”等属性)。

理解信息模型与数据模型的区别,以及掌握实体和属性的概念,是设计和理解关系数据库的重要基础。
003:关系类型 🗂️


在本节课中,我们将要学习关系数据库设计中核心概念之一:关系类型。我们将了解构成关系的基本构件,学习如何用符号表示它们,并详细探讨一对一、一对多和多对多这三种基本关系类型。
概述



关系是连接数据库中不同实体的纽带。理解不同类型的关系对于设计高效、准确的数据库结构至关重要。本节将介绍关系的构成要素及其可视化表示方法。
关系的构成要素
关系的构建主要依赖于三个基本构件:实体、关系集和鸦脚表示法。
以下是这些构件的详细说明:


- 实体集:实体集由矩形表示。它代表数据库中具有相同属性的一类对象,例如“图书”或“作者”。
- 关系集:关系集由菱形表示,并通过线条连接相关联的实体。它描述了实体之间的交互或联系,例如“撰写”。
- 鸦脚表示法:这是一种用于直观表示关系基数(即数量对应关系)的符号系统。常用的符号包括大于号(
>)、小于号(<)和竖线(|)。



实体与属性
在实体关系图中,实体用矩形框表示,而实体的属性则用椭圆形表示。属性是描述实体特定性质的字段。


例如,“图书”实体可能拥有“标题”、“版次”、“出版年份”、“价格”等属性。每个属性必须且只能连接到一个实体。

同样,“作者”实体可能拥有“姓氏”、“名字”、“邮箱”、“城市”、“国家”和“作者ID”等属性。
理解关系类型
上一节我们介绍了实体和属性的表示方法,本节中我们来看看实体之间如何通过不同类型的关系相互关联。
以“图书”和“作者”为例。一本书必须由至少一位作者撰写,但也可能由两位或更多位作者合著。反过来,一位作者可以只写一本书,也可以撰写两本或多本书。这种联系就是通过关系来定义的。

一对一关系



当每个实体实例只与另一个实体集中的一个实例相关联时,即构成一对一关系。



在关系图中,我们用一条粗线连接实体和关系集,表示“至少且恰好一个”的参与约束。

示例公式: 1本书 <--[撰写]--> 1位作者
这表示一本书有且仅有一位作者,同时一位作者也只撰写这一本书。
注意:在关系图中,为了保持清晰,通常只显示实体,而省略属性,因为属性会使图表变得杂乱。



一对多关系
当实体集A中的一个实例可以与实体集B中的多个实例相关联,但B中的一个实例只能与A中的一个实例相关联时,即构成一对多关系。
这里我们引入鸦脚表示法。在“图书”端使用小于号(<),表示“图书”实体参与了关系集中的多个关系。
示例公式: 1本书 <--[撰写]--< 多位作者
这表示一本书可以由多位作者合著(一对多),反之,从作者角度看,多位作者共同撰写一本书(多对一)。
多对多关系


当实体集A中的多个实例可以与实体集B中的多个实例自由关联时,即构成多对多关系。


在关系集的两侧分别使用大于号(>)和小于号(<)来表示这种关系。
示例公式: 多本书 >--[撰写]--< 多位作者
这表示多位作者可以共同撰写多本不同的书籍,同时一本书也可以由多位作者合作完成。关系集中的每个实体都参与了多个关系。
总结
本节课中我们一起学习了关系数据库设计的核心——关系类型。
我们了解到:
- 关系由实体、关系集和鸦脚表示法构成。
- 一对一关系指一个实体只关联另一个实体的一个实例,例如一本书对应唯一作者。
- 一对多关系指一个实体关联另一个实体的多个实例,例如一本书拥有多位合著者。
- 多对多关系指多个实体实例与另一个实体集的多个实例相互关联,例如多位作者合作撰写多本不同的书籍。


掌握这些关系类型是进行规范化数据库设计的关键基础。
004:将实体映射到表 📊


在本节课中,我们将学习如何将实体关系图(ERD)中的实体和属性,映射为关系数据库中的具体表格。这是数据库设计的关键一步。

概述


实体关系图是关系数据库设计的基础。我们首先创建ERD,然后将其映射到数据库中的表。本节将详细讲解这一映射过程。
从实体到表的映射
上一节我们介绍了实体关系图的基本概念。本节中,我们来看看如何将ERD中的一个实体及其属性,转换为数据库中的一张表。
以一个名为 Book(书籍)的实体为例。该实体拥有多个属性,如 BookID、Title、ISBN 等。
在映射过程中:
- 实体 本身成为数据库中的一张表。
- 实体的属性 则成为该表中的列。
为了便于理解,我们可以将实体和其属性分开来看。在这个例子中,实体 Book 变成了一张名为 Book 的表。

表的构成:行与列



现在,我们来看看表在关系数据库模型中的具体形式。一张表是行和列的组合。


在映射的初始阶段,实体变成了表,但此时表还没有具体的行和列形式。只有当属性被翻译成表中的列后,表才具备了基本的行列结构。


以下是映射过程的总结:
- 实体映射为表:例如,实体
Book映射为Book表。 - 属性映射为列:实体的每个属性(如
BookID,Title)成为表中的一个列。 - 添加数据形成行:后续向这些列中添加具体的数据值,就形成了表中的行,从而完成一张完整的数据表。
让我们通过另一个例子来巩固理解。对于 Author(作者)实体:
- 实体
Author成为Author表。 - 其属性(如
AuthorID,Name)成为表中的列。 - 向这些列填入作者信息后,就构成了完整的
Author数据表。



总结
本节课中,我们一起学习了实体关系图到数据库表的映射过程。我们了解到:
- 实体关系图是数据库设计的基础。
- 将ERD转换为关系数据库表时,实体成为表,属性成为表中的列。
- 通过向列中添加数据,最终形成包含行和列的完整数据表。


掌握这一映射原理,是进行后续数据库表设计和操作的重要前提。
005:数据类型 📊




概述
在本节课中,我们将要学习关系数据库管理系统(RDBMS)中的数据类型。我们将解释什么是数据类型,它们在数据库中如何被使用,识别一些常见的数据类型,并描述使用恰当数据类型的优势。
什么是数据类型?
数据库表代表一个单一的实体,表中的列代表该实体的属性。例如,一个名为 book 的表可以包含 title(书名)、publish_date(出版日期)和 pages(页数)等列。输入到每一列的信息应始终是相同种类或类型的数据。




在这个例子中,title 列应包含文本数据,publish_date 列应包含日期,而 pages 列应包含数字。我们可以利用这个概念来定义列可以存储的数据类型或数据类型。你分配给列的数据类型控制了该列可以存储的数据。




例如,文本列可以包含字母数字数据,但日期列只能包含有效日期格式的日期,而数字列只能包含数字。
常见的数据类型
不同的数据库管理系统可能对相似的数据类型使用不同的名称,但它们通常支持一组标准类型。让我们来看看RDBMS中常用的数据类型。
字符/字符串数据类型


字符/字符串数据类型包括定长数据类型和变长数据类型。





定长字符串的长度通常在类型名称后的括号中表示,例如 CHAR(10)。这种类型在数据库中占用相同的空间量,与实际存储的数据长度无关。



例如,在城市代码列 CHAR(10) 中存储 NY(代表纽约)仍然会占用10个字符的空间。

变长字符串通常命名为 VARCHAR,可以为字符串指定一个最大长度。
数值数据类型
数值数据类型包括整数类型和小数类型。
整数数据类型只保存没有小数位的整数。因此,12 是有效条目,而 12.5 则不是。整数数据类型通常使用2或4字节的存储空间来保存从负200万(或-32,000)到正200万(或32,000)的数字。




SMALLINT 允许你为较小的数字使用更少的空间,而 BIGINT 则增加了数据类型可以容纳的数字大小。





小数数据类型可以存储整数和小数。这些数据类型的大小和精度因RDBMS而异,名称包括 NUMERIC、DECIMAL、DEC、REAL、DOUBLE、FLOAT、DECFLOAT 等。
日期/时间数据类型
日期/时间数据可以分为日期、时间和时间戳。

日期由年、月、日三部分值组成。时间通常也由小时、分钟、秒三部分值组成。




时间戳列是两者的结合,由七个部分组成:年、月、日、小时、分钟、秒和微秒。




其他常用数据类型
以下是其他一些常用的数据类型:
- 布尔型(BOOLEAN):只保存一位信息,一个
0或一个1。你可以将其用于真/假或是/否类型的数据。 - 二进制字符串(BINARY STRING):保存代表图像、语音或其他媒体数据的字节序列。
- 大对象(LOB):通常是非常大的对象,例如文件。这类数据通常存储在数据库主表之外,表中保存指向它的指针。
- XML数据类型:可以以分层形式存储与平台无关的非结构化数据。
除了本视频介绍的各种内置数据类型外,许多关系数据库还允许你创建自己的自定义或用户定义数据类型(UDT),这些类型是从内置类型派生或扩展而来的。

使用恰当数据类型的优势





你可能已经猜到,你可以完全不使用特定的数据类型,而将每一列都定义为保存字符数据。然而,使用恰当的数据类型会带来许多优势。




当你定义列应保存的数据类型时,可以避免将错误的数据插入该列。例如,如果你尝试将作者姓名添加到 books 表的 publish_date 列中,插入操作将失败,你可以采取适当的措施。
当日期、时间和数值数据被正确类型化时,你可以准确地排序这些数据。例如,如果你将一个包含数字的字符列按升序排序,102 可能会列在 12 之前,或者查询可能会失败。然而,如果该列被定义为数值类型,你可以确信数字将按通常预期的数字顺序返回。
同样地,当数据被正确类型化时,你可以准确地选择数据范围。例如,选择在2001年1月1日至2001年12月31日之间出版的所有书籍。
你可以对类型化的数据执行数值计算。例如,计算订单的总成本。

你可以利用标准函数。例如,返回年龄列的平均值,或将订单日期加上两天来估算发货日期。





总结



本节课中我们一起学习了数据类型。数据类型定义了可以存储在列中的数据的类型。存在适用于各种数据的多种不同数据类型,为列使用正确的数据类型具有许多优势,包括确保数据完整性、实现准确排序和范围选择、支持数值计算以及利用数据库内置函数。
006:关系模型核心概念 📚



在本节课中,我们将学习关系模型的基本概念。我们将定义关系、度数和基数等关键术语,并解释关系模式与关系实例之间的区别。
关系模型的数学基础 🧮

上一节我们介绍了关系数据库的概览,本节中我们来看看其背后的数学基础。关系模型于1970年首次提出,它建立在数学模型和数学术语之上。
关系模型的构建基石是关系和集合。关系数据模型基于关系的概念。关系本身是一个基于集合思想的数学概念。
一个集合是不同元素的无序集合。它是相同类型项目的集合,没有顺序,也没有重复项。




关系、模式与实例 📊
一个关系数据库就是一组关系的集合。在数学术语中,关系也指代表。一个表是行和列的组合。一个关系由两部分组成:关系模式和关系实例。
关系模式规定了关系的名称以及每一列(即属性)的类型。



以下是关系模式的一个例子:


作者 (作者ID CHAR, 姓氏 VARCHAR, 名字 VARCHAR, 邮箱 VARCHAR, 城市 VARCHAR, 国家 CHAR)
在这个例子中:
作者是关系的名称。作者ID是一个属性,其数据类型为CHAR(定长字符串)。姓氏、名字、邮箱、城市的数据类型为VARCHAR(变长字符串)。国家的数据类型也是CHAR。
这构成了关系模式。
一个关系实例则是由行和列组成的实际表格。列是属性或字段,行是元组。



度数(Degree)与基数(Cardinality)🔢


理解了关系的基本结构后,我们还需要掌握描述关系规模的两个重要指标。
以下是度数与基数的定义:
- 度数 指的是一个关系中属性或列的数量。
- 基数 指的是一个关系中元组或行的数量。
以作者表为例,如果该表有6列(作者ID、姓氏、名字、邮箱、城市、国家),那么它的度数就是6。如果该表中有5行作者数据,那么它的基数就是5。
总结 📝

本节课中我们一起学习了关系模型的核心概念。我们了解到关系数据模型基于关系这一数学概念,关系在数学上等同于表。一个关系由关系模式(定义结构)和关系实例(实际数据)组成。度数描述了一个关系中列的数量,而基数描述了行的数量。掌握这些基础术语是理解后续更复杂数据库操作的关键。
007:数据库体系结构 🏗️


在本节课中,我们将学习数据库的部署拓扑结构,并详细解释两层和三层架构,包括其中的各个层级,例如数据库驱动程序、接口和API。
概述
数据库的部署拓扑结构取决于其使用方式和访问需求。不同的场景需要不同的架构来支持数据处理和用户访问。




数据库部署拓扑





以下是几种常见的数据库部署拓扑结构。
单层架构
单层架构有时也称为单层拓扑。在这种架构中,数据库部署在用户的本地桌面系统上。访问通常仅限于单个用户。这种拓扑适用于开发和测试,或者当数据库嵌入在本地应用程序中时。
客户端-服务器架构(两层架构)
对于需要许多用户访问的较大型数据库,通常采用客户端-服务器架构。在这种场景下,数据库驻留在远程服务器上,用户通过网页或本地应用程序从客户端系统访问它。这种部署通常用于多用户场景,是生产环境的典型选择。




三层架构
某些场景会在应用程序客户端和远程数据库服务器之间采用一个中间层或应用服务器层。在这种三层架构中,数据库驻留在远程服务器上,用户通过应用服务器或中间层访问它。这提供了更好的可扩展性和安全性。
云部署
在云部署中,数据库驻留在云环境中,具备基于云服务的所有优势。用户无需下载或安装数据库软件,也无需维护支持基础设施。只要拥有互联网连接,用户就可以随时随地轻松访问数据库。在云部署中,客户端应用程序和用户通常通过云中的应用服务器层或接口访问数据库。云部署非常灵活,可用于开发、测试和完整的生产环境。


深入理解客户端-服务器拓扑

客户端-服务器拓扑也称为两层架构。在两层数据库架构中,数据库服务器和应用程序运行在两个独立的层级。
应用程序在客户端层通过某种数据库接口(例如API或框架)连接到数据库服务器,该接口可能依赖于编写应用程序的编程语言。数据库接口通过安装在客户端系统上的数据库客户端或API与数据库服务器通信。
服务器上的数据库管理系统软件(DBMS)包含多个层级,从高层次上可以分为数据访问层、数据库引擎层和数据库存储层。
数据访问层服务器包含用于不同类型客户端的接口,这些接口可以是行业标准API,如JDBC和ODBC,命令行处理器(CLP)接口,以及供应商特定或专有接口。
数据库服务器还包含一个引擎,用于编译查询、检索和处理数据,然后返回结果集。数据库存储或持久层是数据存储的地方,可能位于同一设备的本地存储上,也可能物理驻留在网络存储或专用存储设备上。


三层架构详解


在大多数生产环境中,尤其是在过去20到25年里,数据库服务器通常不直接访问(管理员除外)。客户端应用程序和用户通常通过一个中间层(例如Web应用服务器、BI服务器等)进行访问,因此被称为三层架构。
在这种架构中,应用程序表示层和业务逻辑层驻留在不同的层级。表示层是最终用户与之交互的界面,可以是传统的桌面应用程序、Web浏览器或移动应用程序。客户端应用程序通过网络与应用服务器通信。应用服务器封装了应用程序和业务逻辑,并通过数据库API或驱动程序与数据库服务器通信。


例如,假设客户端应用程序是一个互联网银行应用或手机银行应用。该应用连接到银行应用服务器,而银行应用服务器又与存储用户账户数据的银行数据库服务器连接。
总结

本节课我们一起学习了数据库的不同部署拓扑结构,了解了如何根据处理需求和访问要求选择最适合的架构。单层拓扑将数据库安装在用户的本地桌面上,适用于仅需单用户访问的小型数据库。两层数据库拓扑中,数据库驻留在远程服务器上,用户从客户端系统访问它。三层数据库拓扑中,数据库驻留在远程服务器上,用户通过应用服务器或中间层访问它。最后,在云部署中,数据库驻留在云端,用户通过同样驻留在云端的应用服务器层或其他接口访问它。
008:分布式体系结构与集群数据库 🗄️


在本节课中,我们将要学习关系数据库管理系统(RDBMS)的分布式体系结构。我们将探讨如何利用多台机器组成的集群来构建数据库,以满足高可用性、可扩展性和处理大规模工作负载的需求。
分布式架构概述
之前我们探讨的架构中,数据库都驻留在单台服务器上。然而,对于关键或大规模的工作负载,当高可用性和/或可扩展性至关重要时,主流的关系数据库管理系统也提供分布式架构,利用机器集群来承载数据库。
分布式数据库架构的主要类型包括共享磁盘架构和无共享架构。后者可以采用复制或分区技术。在某些情况下,你还会发现结合了其中一种或多种技术,甚至使用专门硬件组件来实现高可用性和可扩展性的架构。



共享磁盘架构
在共享磁盘数据库架构中,多台数据库服务器并行处理工作负载,从而允许工作负载被更快地处理。
以下是共享磁盘架构的关键特点:

- 每台数据库服务器都连接到共享存储基础设施。
- 服务器之间通过高速互连彼此连接。
- 客户端工作负载可以分布到不同的数据库服务器上,从而实现可扩展性。
- 当其中一台服务器发生故障时,连接到它的客户端可以被重新路由到数据库集群中的其他服务器,从而实现高可用性。


数据库复制
上一节我们介绍了共享磁盘架构,本节中我们来看看另一种实现高可用性和灾难恢复的技术:数据库复制。
数据库复制是一种技术,发生在数据库服务器上的更改会被复制到一个或多个数据库副本中。
以下是复制的两种主要类型及其作用:


- 高可用性副本:当副本位于同一地理位置时,它被称为高可用性副本。当主数据库服务器发生故障(如软件或硬件故障)时,连接到它的客户端可以被重新路由到高可用性副本。
- 灾难恢复副本:为了应对站点级灾难(如整个数据中心因停电、火灾、地震或洪水而中断),可以在地理上分散的位置设置副本。这样,客户端就可以被路由到灾难恢复副本。





分区与分片

我们已经了解了复制如何提供数据冗余,现在我们来探讨另一种用于处理海量数据的技术:分区与分片。
你可以将需要包含极大量数据的表划分为多个逻辑分区,每个分区包含整体数据的一个子集。例如,按季度划分销售记录:quarter1, quarter2 等。
当这些分区被放置在集群中的独立节点上时,就称为分片。
以下是分片的核心机制:

- 每个分片拥有自己的计算资源(处理、内存和存储)来处理其数据子集或分区。
- 当客户端发出查询时,查询会在数据库的多个节点或分片上并行处理。
- 来自不同节点的查询结果会被综合起来,返回给客户端。
- 随着数据或查询工作负载的增加,可以向数据库集群添加额外的分片和节点,以增加并行处理能力并提升性能。





数据库分区和分片更常见于涉及海量数据的数据仓库和商业智能工作负载中。




课程总结
本节课中,我们一起学习了关系数据库的分布式体系结构。
你了解到,在共享磁盘数据库架构中,多台数据库服务器并行处理工作负载,从而允许工作负载被更快地处理。

在数据库复制中,发生在数据库服务器上的更改会被复制到一个或多个数据库副本。位于单一地理位置的数据库复制提供了高可用性。当数据库副本存储在不同地理位置时,它提供了用于灾难恢复的数据副本。

在分区技术中,超大的表被拆分到多个逻辑分区中。而在分片技术中,每个分区拥有自己的计算资源。
009:数据库使用模式 🗂️



在本节课中,我们将要学习数据库的主要用户类别、他们的典型使用场景,以及不同类型用户访问数据库时所使用的接口和工具。了解这些内容有助于你根据自身角色选择合适的方式与数据库进行交互。



数据库用户的主要类别
访问数据库的方式和所使用的工具取决于你的工作角色。数据库用户主要分为三大类:数据工程师、数据科学家与业务分析师,以及应用程序开发人员。



上一节我们介绍了数据库用户的三大类别,本节中我们来看看第一类用户——数据工程师和数据库管理员(DBA)——通常使用哪些工具。
数据工程师与数据库管理员(DBA)的工具
数据工程师和数据库管理员通常为了执行管理任务而访问数据库,例如创建和管理数据库对象、设置访问控制、进行监控和性能调优。他们通常使用以下一种或多种机制来完成这些任务。






以下是数据工程师和DBA常用的工具类型:




- 图形用户界面(GUI)或基于Web的管理工具:大多数数据库都附带图形工具或基于Web的工具(尤其是云数据库),有时甚至包括移动应用程序。数据库供应商提供的工具可能在功能或易用性上有限制,因此也可能有第三方或专用工具可用。
- 命令行界面和实用程序:随着功能更全面的GUI工具的出现,命令行的使用有所减少,但数据工程师仍需要掌握相关知识。命令行界面可以是从终端发出的简单数据库命令,例如:
DB2 create database sampleMy SQL dumpSela Sela SQL
也可以是交互式命令行外壳,例如Oracle的SQL*Plus或Db2的CLP(Db2 Command Line Processor)。
- SQL脚本和批处理文件:可以从Shell执行的脚本文件。
- 编程接口或API:许多数据库还包含用于管理任务的编程接口或API,数据工程师或第三方可以从他们创建的应用程序和工具中调用这些接口。


了解了数据工程师的工具后,接下来我们看看数据科学家和业务分析师如何与数据库交互。



数据科学家与业务分析师的工具
数据分析师、数据科学家、业务分析师和商业智能分析师访问数据库是为了分析其中的数据、从中获取洞察力并做出数据驱动的预测。因此,他们的数据访问模式涉及访问现有数据源,并且通常是只读的。然而,有时他们也可能需要创建数据库对象并填充数据,尤其是在他们自己的沙盒环境中。
以下是数据科学和商业智能领域常用的一些工具:





- 数据科学与机器学习工具:包括Jupyter、RStudio、Zeppelin、SAS和SPSS。
- 报告、仪表板和商业智能工具:包括电子表格软件(如Microsoft Excel)、IBM Cognos、Microsoft Power BI、Tableau和Microsoft Stratagy。
- SQL查询工具:用于临时查询。大多数数据库都附带自己的可视化SQL查询工具,但也有适用于多种数据库的第三方工具。




无论是数据科学工具还是商业智能工具,它们通常都使用SQL接口和API与关系数据库交互。在许多情况下,这些接口抽象了直接使用SQL的需求。

现在,让我们转向最后一类用户,看看应用程序开发人员如何通过他们的程序来访问数据库。




应用程序开发人员的工具


应用程序开发人员很少直接访问数据库。他们创建需要同时对数据库进行读写访问的应用程序。应用程序使用编程语言编写,例如C++、C#、Java、JavaScript、.NET、PHP、Perl、Python和Ruby。

这些语言通过SQL接口和API(如ODBC和JDBC)与数据库通信。一些数据库(尤其是基于云的数据库)也包含用于访问数据的REST API。虽然可以使用这些底层API或REST API来编写应用程序(过去就是这样开发的),但如今大多数程序员使用对象关系映射(ORM)框架来处理数据库,因为它们更易于使用,并掩盖了底层关系数据库和SQL的复杂性。
以下是流行的ORM框架示例:





- Ruby应用程序中的 Active Record
- Python中的 Django
- .NET中的 Entity Framework
- Java中的 Hibernate
- JavaScript中的 Sequelize


总结


本节课中我们一起学习了数据库的三大主要用户类别及其使用的工具。
- 数据库可以通过图形和Web界面访问,这使得可视化交互变得容易。
- 命令行工具和脚本使用起来可能有些繁琐,但在经验丰富的数据工程师手中非常强大,有助于自动化重复性任务。
- API和ORM帮助应用程序开发人员创建代表用户或客户端应用程序访问数据库的程序。
数据库应用程序的主要类别包括:
- 数据库管理工具(如phpMyAdmin或pgAdmin)。
- 数据科学和商业智能工具(如Microsoft Excel、IBM Cognos和Microsoft Stratagy),使数据科学家和数据分析师能够分析数据并生成针对性报告。
- 为特定任务(如电子商务、供应链等)构建的或现成的商业应用程序。

你选择访问数据库的方法取决于你的具体需求。
010:关系数据库产品简介 📚



在本节课中,我们将要学习关系数据库的发展简史,了解主流商业与开源数据库产品,并探讨过去十年间开源与商业数据库的流行趋势,以及云数据库的兴起。

关系数据库简史 📜
上一节我们了解了关系数据库的基本概念,本节中我们来看看它的发展历程。

第一个可被识别为关系数据库的产品出现在20世纪60年代,即美国航空公司使用的IBM Saber座位预订系统。70年代初,埃德加·F·科德列出了定义关系数据库的12条规则。70年代末,加州大学伯克利分校开发的Ingress和IBM圣何塞研发的System R投入使用。1976年,陈品山提出了一种名为实体关系(ER)的新数据库模型。到了80年代,关系数据库系统取得了商业上的成功。


商业数据库的兴起 🏢
随着SQL成为标准查询语言,商业数据库产品开始主导市场。
DB2成为IBM的旗舰数据库产品,而结构化查询语言(SQL)成为了标准查询语言。80年代末,IBM的一个工作组设计了一种分布式关系数据库架构,使网络连接的关系数据库能够协作处理SQL请求。90年代初,包括Oracle Developer、PowerBuilder和VB在内的新应用开发客户端工具,以及ODBC、Excel和Access等个人生产力工具开始流行。90年代末,数据库行业呈指数级增长,普通桌面用户开始使用客户端-服务器数据库系统来访问包含遗留数据的计算机系统。一些最流行的关系数据库包括Oracle、Microsoft SQL Server和IBM DB2等巨头。
开源数据库的崛起 🐧
进入21世纪,开源数据库开始获得主流关注并取代了许多商业数据库。


在2000年代后期,像MySQL、PostgreSQL和SQLite这样采用开源许可的关系数据库系统人气激增。开源数据库在多种许可类型下运作。



以下是几种流行的开源数据库示例:
- MySQL:由Oracle公司出品,采用GPLv2许可。
- PostgreSQL:由PostgreSQL全球开发组出品,采用自由开放源码的PostgreSQL许可。
- SQLite:由D. Richard Hipp出品,属于公共领域。
数据库产品流行度分析 📊
行业分析机构DB-Engines每月评估不同类型数据库产品的流行度。

该列表显示了截至2021年2月最流行的10个关系数据库系统:
- Oracle
- MySQL
- Microsoft SQL Server
- PostgreSQL
- IBM DB2
- SQLite
- Microsoft Access
- MariaDB
- Hive
- Microsoft Azure SQL Database





DB-Engines的排名基于多个因素的综合评估,包括网站在线提及频率、谷歌和必应搜索结果、谷歌趋势关注度、Stack Overflow等技术论坛讨论频率、招聘信息中的提及次数,以及LinkedIn等社交媒体资料中的出现频率。

开源与商业数据库的趋势变化 📈
过去十年间,包括关系数据库在内的所有类型软件,其商业许可与开源许可的流行度发生了巨大变化。


开源关系数据库的流行度上升,而商业数据库的流行度下降。2021年DB-Engines的一项研究发现,开源系统在总流行度得分中占50.1%,高于2013年的35.5%。
云数据库的兴起 ☁️
云数据库是通过云平台构建和访问的数据库服务。它具备传统数据库的许多功能,并增加了云计算的灵活性。
过去十年,云数据库的流行度稳步增长。这一趋势是由组织转向软件即服务(SaaS)模式以利用云优势(如增强的可扩展性)所驱动的。云数据库具有高度可扩展性,使组织能够处理数据分析所需的海量数据。


过去十年,云数据库的流行度增长了一倍多,且这一增长将持续。根据Gartner的预测,到2022年,75%的数据库将被部署或迁移到云平台。


以下是领先的云数据库产品:
- Amazon DynamoDB
- Microsoft Azure Cosmos DB
- Microsoft Azure SQL DB
- Google BigQuery
- Amazon Redshift
总结 ✨


本节课中我们一起学习了关系数据库产品的演变。我们了解到,关系数据库既有来自IBM、Oracle和Microsoft等公司的商业许可版本,也有采用各种免费许可的开源版本。过去十年,开源关系数据库的流行度已上升至约50%,而云数据库的流行度更是增长了一倍多。理解这些产品及其发展趋势,对于选择适合特定需求的数据库解决方案至关重要。
011:DB2介绍 🗄️

在本节课中,我们将学习IBM的DB2数据库。我们将了解DB2的历史、特性、产品家族、部署选项,以及它在云端的高可用性和可扩展性方案。
DB2概述




DB2,或称Database 2,是IBM在1983年首次发布的关系数据库管理系统(RDBMS)。它最初运行在IBM大型机上,但后来发展出可在多种操作系统上运行的版本,包括OS/2、Unix、Linux和Windows。
经过多次迭代,DB2现已发展成为一个完整的数据管理产品套件。

DB2产品家族
DB2产品家族包含多个成员,以满足不同的数据管理需求。
以下是DB2产品家族的主要成员:
- DB2 Database:一个功能强大的、企业级的本地部署RDBMS,专为OLTP(联机事务处理)优化。它支持Linux、Unix和Windows,并提供高性能、高可用性、可扩展性和弹性。
- DB2 Warehouse:一个本地部署的数据仓库,提供高级数据分析、大规模并行处理(MPP)和机器学习功能。
- DB2 on Cloud:一个完全托管的、基于云的SQL数据库,提供与本地DB2 Database相似的功能,包括性能、高可用性、可扩展性和弹性。
- DB2 Warehouse on Cloud:一个完全托管的、弹性的、基于云的数据仓库,提供与本地DB2 Warehouse相似的功能。
- DB2 Big SQL:一个基于Hadoop的SQL引擎,提供大规模并行处理和高级查询功能。它可以查询多种数据源,包括Hadoop HDFS、Web HDFS、RDBMS、NoSQL和其他对象存储。
- DB2 Event Store:一个内存优化的数据库,用于摄取和分析事件驱动应用程序的流数据。它集成了IBM Watson Studio,为机器学习模型提供开发环境。
- DB2 for z/OS:一个为IBM Z系统设计的企业数据服务器。它提供了一个关键任务数据解决方案,集成了分析、移动和云功能,支持数千客户和数百万用户。
这些产品都可以部署在IBM Cloud或Amazon Web Services上。
DB2的评估与特性

有多种方式可以免费评估DB2产品。
以下是主要的免费评估选项:
- 使用DB2 Database社区版许可证,有100GB的数据限制。
- 下载DB2 Database的免费Docker镜像。
- 在IBM Cloud上使用DB2 on Cloud的免费轻量版计划进行开发和评估。
- 使用DB2 Warehouse企业版和DB2 Big SQL的免费试用版。
- 免费使用DB2 Warehouse on Cloud,数据量上限为1GB。
- 下载DB2 Event Store开发者版的免费版本。
DB2产品利用AI驱动的功能来简化数据管理和查询。
以下是DB2的一些核心特性:
- 机器学习优化查询:使用机器学习算法提高查询效率和性能。
- 列存储:通过将查询定向到特定列,而不是处理整个数据表,来提高分析工作负载的性能并减少开销。
- 数据跳过:通过自动避免处理特定查询中不需要的数据来减少开销。
- 通用SQL引擎:DB2家族产品使用通用的SQL引擎,这意味着你可以编写一次查询,并确保它能在家族其他产品上运行,这简化了应用程序在不同产品和平台间的迁移。
- 支持所有数据类型:支持关系型、结构化和非结构化数据,使你能够访问所有企业数据以做出更好的业务决策。
- 数据复制功能:支持实现高可用性和灾难恢复解决方案。
DB2的可扩展性

DB2通过多种方式提供可扩展性。

以下是DB2实现可扩展性的主要方法:
- 短期峰值处理:可以将本地存储和计算能力扩展到托管的云部署上。
- 独立扩展:在托管的云部署中,可以独立扩展计算能力和存储,只在需要时使用和支付额外资源。
- 数据库分区:在DB2 Warehouse中,可以使用数据库分区功能,将数据透明地分割到多个分区和服务器上,以最大化可用计算能力并实现大规模并行处理。
Cloud Pak for Data平台
Cloud Pak for Data是一个完全集成的数据和AI平台,可用于处理和管理所有数据。它运行在Red Hat OpenShift容器中,因此可以部署在任何私有、公共或混合云上。

使用Cloud Pak for Data,你可以连接DB2或任何其他数据源,无论其存储在哪里。你可以使用Watson知识目录来组织数据,使用一系列分析服务来获取数据洞察,并使用Watson和其他服务将AI注入你的系统。
DB2 on Cloud入门

DB2 on Cloud是开始使用DB2的好方法。它提供三种计划:轻量版、标准版和企业版。
以下是DB2 on Cloud的三种计划:
- 轻量版计划:免费且无时间限制,意味着你可以在项目中使用它,而不用担心试用期结束。该计划限制为200MB数据和15个并发连接。
- 标准版计划:提供灵活的计算能力和存储扩展,以及内置的三节点高可用性集群。
- 企业版计划:提供一个专用的数据库实例,同样具有灵活的计算能力和存储扩展,以及内置的三节点高可用性集群。
DB2 on Cloud可以部署在IBM Cloud平台或Amazon Web Services上。运行后,你可以通过CLP+命令行界面、DB2 on Cloud图形用户界面控制台或标准API(如ODBC、JDBC和REST)来访问数据库。你还可以轻松地从Excel、CSV和文本文件加载数据,或从Amazon S3对象存储加载数据。

DB2的高可用性


DB2提供高可用性灾难恢复(HADR)功能来支持高可用性系统。HDR将主数据库的更改复制到多个备用服务器。

如果主数据库因任何原因(硬件、软件或网络问题)发生故障,你可以自动将其中一个备用数据库提升为主数据库,将客户端应用程序重定向到这个新的主数据库,并继续向组中的其他备用服务器复制数据。
当原始主数据库恢复在线时,它可以取代备用服务器的位置,或者被重新提升回主数据库位置。

DB2 Warehouse的可扩展性
DB2 Warehouse为商业智能工作负载提供大规模并行处理和数据分析。有时,你可能需要扩展系统的存储能力以满足峰值需求,或在需求低时降低成本。
DB2 Warehouse中的数据存储在数据节点中。要扩展存储容量,你只需要向部署中添加一个节点。分区及其工作负载会自动在新的节点设置中重新平衡。


同样,要缩减规模,你只需要移除一个节点即可恢复到原始状态。

总结
本节课中,我们一起学习了DB2数据库家族。我们了解到DB2是一个产品家族,你可以根据需要以多种方式使用和管理数据。DB2可以跨多个平台部署,包括本地和云端。Cloud Pak for Data平台集成了DB2和许多IBM数据工具。DB2 on Cloud是一个完全托管的、基于云的SQL数据库,可以在IBM Cloud或AWS上运行。此外,DB2还提供了高可用性、灾难恢复和可扩展性功能。
012:MySQL入门 🐬




在本节课中,我们将要学习MySQL数据库管理系统。我们将了解MySQL的历史、核心特性、存储引擎以及其高可用性和可扩展性选项。通过本讲,你将能够描述MySQL,解释如何使用它,并理解其在不同场景下的应用。
概述 📋
MySQL最初由瑞典公司MySQL AB开发,并以联合创始人Monty Widenius的女儿“My”命名。该公司后来被Sun Microsystems收购,随后Sun Microsystems又被Oracle Corporation收购。MySQL的标志海豚名为“Sakila”,这个名字是在一次命名比赛中选出的。


MySQL在20世纪90年代末和21世纪初迅速流行,部分原因是它成为LAMP技术栈(Linux操作系统、Apache Web服务器、MySQL数据库和PHP脚本语言)的关键组件,该技术栈在当时被广泛用于构建热门网站。

MySQL采用双许可证模式:开源GNU GPL许可证和商业许可证。由于采用GNU GPL许可证,MySQL是开源的。MySQL存在多个分支,其中最著名的是由部分原始开发者主导的MariaDB。
MySQL的核心特性 ⚙️
MySQL是一个对象关系数据库管理系统。它是一个流行且维护成本低的数据库,提供多种版本和附加功能,包括用于高要求工作负载的集群版本。




以下是MySQL的一些核心特性:

- 跨平台支持:你可以在多种Unix版本、Microsoft Windows和Linux上运行MySQL。
- 多语言客户端支持:你可以使用大多数现代编程语言为MySQL编写客户端应用程序。
- SQL语法兼容:MySQL使用标准SQL语法,并拥有自己的扩展以提供额外功能,例如
LOAD DATA语句可以快速将文本文件中的数据读入数据库表。 - 数据类型支持:MySQL主要处理关系型数据,但也支持JSON。
MySQL存储引擎 🛠️
与许多其他RDBMS一样,MySQL支持多种存储引擎。存储引擎是处理表上SQL操作的组件,它定义了该表可以使用哪些功能。因此,你需要根据特定表的预期工作负载和需求来选择存储引擎。





以下是MySQL中一些常见的存储引擎:

- InnoDB:这是MySQL的默认存储引擎。它支持事务以确保数据一致性,支持行级锁以提高多用户性能,支持主键上的聚簇索引以提升常用查询的性能,并支持外键约束以维护数据完整性。该引擎在高性能和可靠性之间取得了平衡。
- MyISAM:该引擎适用于主要进行读取操作、更新较少的场景,例如数据仓库或Web应用。它使用表级锁,这在读写混合的环境中会影响性能。
- NDB:该引擎支持在集群中运行多个MySQL服务器实例,主要用于需要高可用性和冗余的应用程序。
高可用性与可扩展性 📈


MySQL支持高可用性和可扩展性。你可以使用复制技术在一个或多个副本上创建数据的副本。源数据库的数据变更也会在副本上执行。同一数据的多个副本意味着你可以在副本集之间分担读取负载,从而提高可扩展性。复制也提高了可用性,因为如果源数据库发生故障,你可以故障转移到使用其中一个副本。



MySQL提供两种集群选项:
- 基于InnoDB与组复制的集群:此选项使用InnoDB存储引擎和组复制技术,允许你使用一个读写主服务器和多个辅助服务器。然后,你可以使用MySQL Router在多个服务器实例之间对客户端应用程序进行负载均衡。如果任何服务器发生意外停机,MySQL Router会将客户端应用程序重新连接到可用的服务器。
- MySQL集群版:此选项使用NDB存储引擎来提供高可用和可扩展的解决方案。多个MySQL服务器节点访问一组数据节点(通常存储在内存中)。运行多个数据节点提供了冗余,从而在发生故障时提高了可用性;运行多个服务器节点则提供了可扩展性。
总结 🎯



本节课中,我们一起学习了MySQL数据库管理系统。我们了解到:

- MySQL是一个对象关系数据库,提供多种版本。
- 它支持多种操作系统。
- 支持多种语言进行客户端应用开发。
- 支持关系型数据和JSON数据。
- 为不同的工作负载提供多种存储引擎。
- 提供了高可用性和可扩展性选项。



通过学习这些内容,你现在应该对MySQL有了一个基本的认识,并能够理解其在不同应用场景下的优势和配置方式。
013:PostgreSQL入门 🐘


在本节课中,我们将要学习PostgreSQL。PostgreSQL是一个功能强大的开源对象关系型数据库管理系统。我们将了解它的起源、核心特性、支持的数据类型以及其高可用性和可扩展性功能。

PostgreSQL的起源与发展 📜
PostgreSQL起源于30多年前加州大学的Postgres项目。Postgres被广泛应用于许多研究和生产应用,覆盖了金融服务、航空和医疗等多个行业。1994年,开源版本Postgres 95发布,其中包含了一个SQL语言解释器。该项目很快更名为PostgreSQL,至今通常简称为Postgres。
你可以将其作为LAMP(Linux, Apache, MySQL, PHP/Python/Perl)或LAPP(Linux, Apache, PostgreSQL, PHP/Python/Perl)技术栈的一部分,用于Web应用和网站开发。此外,你还可以使用独立开发的扩展来增加功能,例如PostGIS用于地理和空间数据处理。



什么是PostgreSQL? 💡
PostgreSQL是一个免费、开源的对象关系型数据库管理系统。



- 开源:意味着你可以使用、修改和分发PostgreSQL的源代码,以满足你的业务需求。
- 对象关系型:类似于面向对象编程语言,它支持继承和重载。你可以使用这些技术来简化设计并重用数据库对象。


PostgreSQL的核心特性与优势 ⚙️



PostgreSQL兼容当今大多数常用操作系统,其低维护门槛使其易于在组织中实施。它支持多种编程语言,使你能够将其与Web应用程序集成,并支持ANSI SQL标准。
在使用PostgreSQL时,你可以使用所有标准的关系数据库结构,例如:
- 键(Keys)
- 事务(Transactions)
- 视图(Views)
- 函数(Functions)
- 存储过程(Stored Procedures)


此外,你还可以使用一些NoSQL功能,例如:
- JSON:用于处理结构化数据。
- HStore:用于处理非层次化数据。


PostgreSQL的高可用性与复制功能 🔄
PostgreSQL支持复制以实现高可用性。
它支持两节点同步复制。这会将你的数据副本存储在第二台服务器上,并将你对节点1所做的每个更改应用到节点2。然后,你可以在两个服务器之间分担读取负载。如果节点1发生故障,你可以启用节点2为所有客户端提供服务,直到节点1恢复运行。



它还支持多节点异步复制,以实现高可用性和可扩展性。在这里,一个主节点将其更改分发到多个只读副本以实现可扩展性。同样,如果读写节点发生故障,你可以快速用其中一个只读副本替换它。


高级扩展功能:分区与分片 📊


为了在扩展应用程序时获得更大的灵活性,你可以使用商业版本,例如EDB PostgreSQL复制服务器,它提供多主读写复制。这使你能够运行多个读写数据库,这些数据库之间相互复制更改。如果一个实例发生故障,用户可以轻松重定向到另一个实例,直到它再次可用。
近年来,PostgreSQL版本中添加了其他技术,以增强可扩展性和处理更大数据集的能力,包括:
- 分区(Partitioning):使你能够将一个大表拆分成多个较小的部分或分区,以提高查询性能。
- 分片(Sharding):使你能够跨多个远程服务器存储水平分区。



总结 📝

本节课中我们一起学习了PostgreSQL。我们了解到PostgreSQL是一个开源的对象关系型数据库。它支持多种语言用于客户端应用程序开发,支持关系型、结构化和非结构化数据,并且支持复制和分区以实现高可用性和可扩展性。
014:SQL语句类型 - DDL vs DML 🗂️



在本节课中,我们将学习SQL语句的两种主要类型:数据定义语言(DDL)和数据操作语言(DML)。你将能够区分这两种语句,并了解它们各自在关系数据库管理中的核心作用。

SQL语句用于与关系数据库中的实体(如表)、属性(即列)以及包含数据值的元组(即行)进行交互。

📝 SQL语句的两大类别

SQL语句主要分为两个不同的类别:数据定义语言(DDL)语句和数据操作语言(DML)语句。


上一节我们介绍了SQL语句的基本用途,本节中我们来看看这两种类别的具体区别。


🏗️ 数据定义语言(DDL)

数据定义语言(DDL)语句用于定义、更改或删除数据库对象,例如表。
以下是常见的DDL语句类型:



- CREATE:用于创建表并定义其列。
CREATE TABLE 表名 (列名1 数据类型, 列名2 数据类型, ...); - ALTER:用于修改表结构,包括添加和删除列,以及修改列的数据类型。
ALTER TABLE 表名 ADD 列名 数据类型; - TRUNCATE:用于删除表中的所有数据,但保留表本身的结构。
TRUNCATE TABLE 表名; - DROP:用于删除整个表。
DROP TABLE 表名;
🔧 数据操作语言(DML)



数据操作语言(DML)语句用于读取和修改表中的数据。这些操作有时也被称为CRUD操作,即对表中的行进行创建(Create)、读取(Read)、更新(Update)和删除(Delete)。

上一节我们了解了如何定义数据库结构,本节中我们来看看如何操作其中的数据。

以下是常见的DML语句类型:



- INSERT:用于向表中插入一行或多行数据。
INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2); - SELECT:用于从表中读取或选择一行或多行数据。
SELECT * FROM 表名; - UPDATE:用于编辑表中的一行或多行数据。
UPDATE 表名 SET 列名 = 新值 WHERE 条件; - DELETE:用于从表中删除一行或多行数据。
DELETE FROM 表名 WHERE 条件;

🎯 课程总结

本节课中,我们一起学习了SQL语句的两种核心类型。
- 数据定义语言(DDL)语句用于定义或更改数据库中的对象(如表)。
- 数据操作语言(DML)语句用于操作或处理表中的数据。



理解DDL和DML的区别是有效使用SQL管理和操作关系数据库的基础。
015:创建表



在本节课中,我们将学习如何在关系数据库中创建表。我们将了解创建表前的必要考虑因素,演示如何在图形界面(如 IBM DB2 on Cloud)中创建表,并解释如何在表创建后修改其结构。

🧠 创建表前的考虑因素
在开始创建表之前,你需要准备好一些关键信息。
以下是创建表前需要考虑的几个要点:






- 表的存放位置:许多关系数据库使用模式(Schema) 来将数据库对象(如表、视图、函数)组织成逻辑组。例如,在 IBM DB2 on Cloud 中,你的表将存储在你自己的用户模式中。
- 表的基本信息:你必须明确表名、每个列的名称及其数据类型。
- 列的约束:你需要考虑列是否允许重复值,或者是否允许 NULL 值。
- 设计依据:应使用你在数据库设计阶段创建的实体关系图(ERD) 来指导表的创建。
🛠️ 创建表的方法
上一节我们介绍了创建表前的准备工作,本节中我们来看看创建表有哪些不同的方法。


以下是三种常见的创建表的方式:

- 图形界面(GUI):大多数数据库都提供可视化的图形界面来创建和修改表。这种方式适用于小型或临时的任务,但扩展性不佳。
- SQL 语句:你可以使用
CREATE TABLESQL 语句来创建表。这种方式可以将创建过程写入脚本文件,有助于在创建多个表时实现自动化。 - 管理 API:一些数据库提供了管理 API,允许以编程方式创建和管理数据库。
本视频中的示例基于 DB2 on Cloud 控制台,但类似的概念也适用于其他数据库。
📝 在 DB2 on Cloud 中创建表





了解了创建表的方法后,我们将通过一个具体的例子,学习如何在 DB2 on Cloud 的图形界面中逐步创建一张表。




- 选择模式:首先,选择一个模式来存放新表。在 DB2 中,默认模式是用户名。本例中,选择的用户模式是
CQC63405。每个用户将拥有不同的用户名。 - 创建新表:点击“新建表”来创建一张新表。
- 命名表:为新表指定一个名称。例如,将表命名为
employee_details。由于它位于CQC63405模式中,该表的完全限定名是CQC63405.employee_details。 - 定义列:新表默认有一列。你可以重命名该列,并从列表中选择一个数据类型为其设置类型。
- 添加更多列:使用“添加列”按钮继续添加列,直到构建出完整的表结构。记住为每一列指定数据类型。
- 设置列属性:你还可以指定列是否接受 NULL 值,并根据数据类型指定长度和小数位数。
- 完成创建:最后,点击“创建”按钮。


🔧 表创建后的操作

表创建完成后,你还可以对它进行多种操作。


以下是创建表后可以执行的一些常见操作:
- 删除表:可以删除或丢弃(Drop)该表。
- 生成 SQL 代码:可以生成用于执行
SELECT、INSERT、UPDATE、DELETE等操作的 SQL 代码。 - 修改表结构:可以修改(Alter) 表,例如添加新列、设置约束或以其他方式更改表结构。
- 查看依赖关系:可以查看该表所依赖的数据库对象。




📖 课程总结
本节课中我们一起学习了关系数据库中创建表的核心知识。

我们了解到,许多关系数据库管理系统(RDBMS)使用模式来包含表、视图、函数等对象。大多数 RDBMS 都提供图形用户界面(GUI)来创建表,同时也可以使用 CREATE TABLE 等 SQL 语句来创建。在表创建后,如果需要添加列、更改数据类型或添加主键/外键,可以通过 ALTER TABLE 语句来修改表的结构。
016:CREATE TABLE 语句


在本节课中,我们将学习如何使用 CREATE TABLE 语句在关系数据库中创建表。你将了解如何将实体名称和属性转换为数据库中的表和列,并掌握该语句的基本语法和关键组成部分。
🛠️ CREATE TABLE 语句概述



CREATE TABLE 是最常见的数据定义语言(DDL)语句之一,用于在数据库中创建新表。其基本语法结构如下:



CREATE TABLE table_name (
column1_name data_type [constraints],
column2_name data_type [constraints],
...
);



语句以 CREATE TABLE 开头,后跟要创建的表名。其余部分用一对圆括号括起来。括号内的每一行定义一个列,包括列名、数据类型,以及可选的约束(如主键、非空等)。每个列定义之间用逗号分隔。



📝 基础示例:创建省份表
为了更好地理解,我们先看一个简单的例子。假设我们要为加拿大的省份创建一个表。



以下是创建该表的SQL语句:

CREATE TABLE provinces (
ID CHAR(2) PRIMARY KEY NOT NULL,
name VARCHAR(24)
);

在这个例子中:
ID列的数据类型是CHAR(2),表示它是一个固定长度为2的字符串,用于存储省份缩写(如AB, BC)。name列的数据类型是VARCHAR(24),表示它是一个可变长度字符串,最多可存储24个字符,用于存储省份全名(如Alberta, British Columbia)。ID列被指定为PRIMARY KEY(主键)并带有NOT NULL(非空)约束。



执行此语句后,数据库中将创建一个包含两列的 provinces 表。



📚 进阶示例:创建图书馆数据库的作者表

上一节我们介绍了基础语法,本节中我们来看看一个更贴近实际应用的例子。我们将基于一个图书馆数据库来创建 author(作者)表。
该表将包含以下属性(列):
author_id:作者ID,设为主键。last_name:姓氏。first_name:名字。email:电子邮件。city:城市。country:国家。
以下是创建 author 表的完整SQL语句:


CREATE TABLE author (
author_id CHAR(2) PRIMARY KEY NOT NULL,
last_name VARCHAR(15) NOT NULL,
first_name VARCHAR(15) NOT NULL,
email VARCHAR(40),
city VARCHAR(15),
country CHAR(2)
);

在这个语句中,我们应用了几个重要的概念:
- 主键约束:
author_id CHAR(2) PRIMARY KEY NOT NULL将author_id列设为主键。这确保了表中每一行都能被唯一标识,且该列不允许出现重复值或空值。 - 非空约束:
last_name和first_name列都带有NOT NULL约束。这意味着这些字段在插入数据时必须包含值,不能为空,因为作者必须拥有姓名。 - 可变长度字符:
VARCHAR类型用于存储长度可能变化的数据,如姓名、邮箱等,括号内的数字指定了最大允许长度。

✅ 课程总结

本节课中我们一起学习了 CREATE TABLE 语句的核心用法。我们了解到:
CREATE TABLE是用于在数据库中创建新表的DDL语句。- 其语法核心是定义表名和包含在圆括号内的列定义列表。
- 每个列定义需要指定列名和数据类型(如
CHAR,VARCHAR)。 - 可以为核心列添加约束,例如
PRIMARY KEY(主键)和NOT NULL(非空),以保证数据的完整性和准确性。



通过创建“省份表”和“作者表”的实例,我们实践了如何将实体和属性转化为具体的数据库表结构。掌握 CREATE TABLE 语句是构建任何关系数据库的第一步。
017:ALTER、DROP 和 TRUNCATE 表 🗂️


在本节课中,我们将学习如何修改和删除数据库中的表。具体来说,我们将掌握三个核心SQL语句:ALTER TABLE、DROP TABLE 和 TRUNCATE TABLE。这些语句用于改变表结构、删除整个表或清空表中的所有数据。
观看本视频后,你将能够描述这些语句的作用,解释其语法,并在查询中使用它们。ALTER TABLE 语句用于向表中添加或删除列、修改列的数据类型、添加或删除键以及约束。




ALTER TABLE 语句
ALTER TABLE 语句用于更改现有表的结构。其基本语法与 CREATE TABLE 语句不同,它不使用括号来包裹参数。语句中的每一行都指定了你希望对表进行的一项更改。
以下是 ALTER TABLE 语句的基本语法:
ALTER TABLE table_name
ADD COLUMN column_name data_type;
例如,为了在图书馆数据库的 author 表中添加一个用于存储作者电话号码的列,可以使用以下语句:
ALTER TABLE author
ADD COLUMN telephone_number BIGINT;
在这个例子中,列的数据类型是 BIGINT,它可以容纳长达19位的数字。

修改列的数据类型



你也可以使用 ALTER TABLE 语句来修改列的数据类型。为此,需要使用 ALTER COLUMN 子句,并为列指定新的数据类型。


例如,使用数字数据类型存储电话号码意味着你不能将括号、加号或破折号作为号码的一部分。为了克服这个问题,可以将列的数据类型改为 CHAR。
以下代码展示了如何修改 author 表:
ALTER TABLE author
ALTER COLUMN telephone_number
SET DATA TYPE CHAR(20);
需要注意的是,修改包含现有数据的列的数据类型可能会引发问题,特别是当现有数据与新数据类型不兼容时。例如,如果列中已包含非数字数据,尝试将列从 CHAR 类型更改为数字类型将会失败。你会看到错误提示,并且该语句不会执行。


删除列




如果你的需求发生变化,不再需要某个额外的列,你可以再次使用 ALTER TABLE 语句,这次配合 DROP COLUMN 子句来删除该列。


操作如下所示:
ALTER TABLE author
DROP COLUMN telephone_number;
DROP TABLE 语句
与使用 DROP COLUMN 从表中删除列类似,你可以使用 DROP TABLE 语句从数据库中删除整个表。默认情况下,如果你删除一个包含数据的表,数据将随表一起被删除。
DROP TABLE 语句的语法非常简单:
DROP TABLE table_name;
例如,要删除 author 表,你可以使用以下语句:
DROP TABLE author;






TRUNCATE TABLE 语句



有时,你可能只想删除表中的数据,而不是删除表本身。虽然你可以使用不带 WHERE 子句的 DELETE 语句来实现,但通常使用 TRUNCATE TABLE 语句会更快速、更高效。
TRUNCATE TABLE 语句用于删除表中的所有行。其语法如下:
TRUNCATE TABLE table_name IMMEDIATE;
这里的 IMMEDIATE 指定立即处理该语句,且操作无法撤销。
因此,要清空 author 表,你可以使用以下语句:
TRUNCATE TABLE author IMMEDIATE;
总结
本节课我们一起学习了三个重要的数据定义语言(DDL)语句:


ALTER TABLE语句:用于更改现有表的结构,例如添加、修改或删除列。DROP TABLE语句:用于删除数据库中的现有表。TRUNCATE TABLE语句:用于删除表中的所有数据行。



掌握这些语句将帮助你在管理数据库时灵活地调整结构并清理数据。
018:数据移动实用程序 📂



在本节课中,我们将学习数据移动工具和实用程序。学完本课后,你将能够识别需要数据移动的场景,列举关系数据库中用于数据移动的各种工具和实用程序,并理解备份与恢复、导入与导出以及加载工具之间的区别和适用场景。

数据工程师和数据库管理员经常需要将数据移入或移出现有数据库。这可能是出于多种原因。


上一节我们介绍了数据移动的必要性,本节中我们来看看具体有哪些工具和实用程序。

每个数据库都有其自己的数据移动工具,但它们大致可以分为三类:备份与恢复、导入与导出以及加载。让我们逐一了解。

备份与恢复 🔄


在数据库之间移动数据的一种方法是执行备份和恢复操作。备份操作会创建一个或多个文件,其中封装了所有数据库对象及其数据。恢复操作则从备份文件中创建原始数据库的精确副本。
备份和恢复操作会保留数据库中的所有对象,包括模式、表、视图、用户定义的数据类型、函数、存储过程、表约束、触发器、安全设置、对象之间的关系,当然还有所有表中的数据。



备份通常定期进行,目的是为生产数据库保留副本,用于灾难恢复。备份和恢复操作也可用于创建数据库的额外副本,以供开发和测试之用。
导入与导出 📤📥


导入操作从文件中读取数据,并对目标表执行一系列插入语句。
导出操作从指定表中选择数据,并将其保存到目标文件中。


根据数据库的不同,导入和导出操作可以通过多种界面执行。大多数数据库至少提供一个命令行实用程序。某些数据库的管理工具也支持导入和导出。在某些情况下,图形或Web管理工具会为这些操作提供可视化界面。此外,还有第三方工具允许对许多不同的数据库管理系统执行这些操作。
以下是数据库支持的常用文件格式:




- DEL 或定界 ASCII:用于在各种数据库管理器和文件管理器之间进行数据交换。这种方法使用特殊字符分隔符来分隔列值。一个众所周知的例子是逗号分隔变量或 CSV 文件。
- ASC 或非定界 ASCII:用于从创建具有对齐列数据的平面文本文件的其他应用程序导入或加载数据。
- PC/IXF:集成交换格式的 PC 版本。PC/IXF 是数据库表的结构化描述,包含内部表的外部表示。
- JSON:随着 JSON 和 RESTful Web 服务的普及,一些数据库和第三方工具也开始支持与 JSON 文件之间的数据导入和导出。
让我们看一些在不同界面中执行导入和导出操作的例子。在 DB2 中,命令行导入和导出实用程序允许你键入文件名、文件格式、表名,以及可选的用于导入和导出数据的消息文件。请注意,DB2 中的导出实用程序允许你指定 SQL 查询,以便在需要时仅导出指定表中的数据子集。
作为一个简单导出的例子,让我们看看如何在 DB2 控制台中将表导出为 CSV 文件。在你的模式中,选择要导出的表,选择该表,然后点击“查看数据”,选择“导出”按钮,点击“导出为 CSV”。你可以指定名称和位置来保存 CSV 文件。



加载工具 ⚡




作为导入实用程序的替代方案,一些数据库提供了加载实用程序。加载实用程序比导入实用程序更快,因为它直接将格式化页面写入数据库,而导入实用程序则执行一系列 SQL 插入语句。
然而,它不执行参照完整性或表约束检查。因此,如果你需要这些额外的检查,可能更倾向于使用导入实用程序。加载实用程序也可能绕过数据库日志记录,这也有助于提高性能。对于较小的表,导入可能效果很好,但当涉及非常大的数据量时,加载实用程序是首选。
你可以从命令行激活 DB2 导入实用程序,或通过应用程序调用其 API,甚至可以使用可视化数据库管理工具。



总结 📝
本节课中,我们一起学习了数据移动的相关知识。我们了解到,数据移动对于初始填充数据库和表、添加或追加数据以及为开发测试或灾难恢复制作副本是必需的。
备份和恢复实用程序用于创建和恢复整个数据库的副本,包括表、视图、约束及其数据等所有对象。导入实用程序支持从 DEL、CSV、ASC 和 IXF 等不同格式将数据插入到特定表中。导出实用程序支持将特定表中的数据保存为 CSV 等各种格式。加载实用程序支持高性能地将数据插入到指定表中,对于处理大量数据非常有用。
019:加载数据 📥


在本节课中,我们将要学习如何向数据库表中高效地加载大量数据。你将了解何时使用数据加载功能,可以加载哪些数据源,以及如何在DB2 Web控制台中通过四个步骤完成数据加载过程。
上一节我们介绍了数据库的基本操作,本节中我们来看看如何批量导入数据。








使用 INSERT 这样的SQL语句向表中添加数据,对于少量行或在开发和测试数据库系统时可能适用。然而,当需要加载成百上千行数据时,逐行输入并上传到数据库的方法效率低下,并不实用。
因此,大多数关系数据库管理系统(RDBMS)都提供了一种方法,能够快速、高效且可扩展地将大量数据直接加载到表中。
你的数据可能来自各种不同的来源和格式。例如,你可能希望用以下数据填充你的表:
- 从另一个数据库导出到分隔文本文件(如CSV)的信息。
- 从定制应用程序输出的对象数据。






在DB2 Web控制台中,你可以使用“加载数据”工具来加载存储在以下位置的数据:
- 本地计算机上的分隔文本文件。
- Amazon Web Services的S3对象存储。
- IBM的云对象存储。




接下来,让我们通过一个例子,看看如何使用DB2 Web控制台从CSV文件加载数据到表中。
以下是开始加载数据需要遵循的四个步骤:
- 识别源数据:在“源”页面,选择现有数据的位置,并输入该存储类型所需的任何身份验证信息。
- 例如,对于IBM云对象存储中的数据,你需要提供COS身份验证端点、访问密钥和秘密访问密钥。
- 而对于本地存储的CSV文件,你只需指定要上传的文件。






- 选择目标:在“目标”页面,为数据选择目标模式和表。你还可以在此处指定是将新数据追加到表的末尾,还是用新数据覆盖现有数据。
- 请注意,如果选择覆盖选项,即使加载失败,该表中所有现有数据也将丢失。
- 或者,你可以点击“新建表”,将数据加载到一个全新的表中,并使用新数据的格式来定义列的数据类型。



- 定义数据格式:在“定义”页面,定义文本文件的字符编码和分隔符,第一行是否包含列标题,以及使用何种时间和日期格式。




- 确认并开始加载:在“最终确定”页面,你可以在开始加载数据前查看所有设置。加载完成后,控制台将显示该过程的状态,并显示加载过程引发的任何错误或警告。


本节课中我们一起学习了数据加载。你了解到,与使用多个INSERT语句相比,加载数据更快、更高效且更具扩展性。你可以从多种数据源加载数据,包括分隔文本文件和云对象存储。而“加载数据”工具是DB2 Web控制台中一个简单易用的界面。
020:数据库对象与层次结构 📊



在本节课中,我们将学习关系数据库管理系统(RDBMS)中对象的组织方式。我们将探讨从实例到具体对象的完整层次结构,理解每个层级的概念和作用,这对于管理和设计数据库至关重要。

概述

关系数据库管理系统包含许多对象,数据库工程师和管理员必须有效地组织它们。将表、约束、索引等对象存储在层次结构中,有助于管理员管理安全性、维护和可访问性。虽然不同产品间可能存在细微差异,但以下层次结构示例概述了RDBMS的通用组织方式。




数据库层次结构


大多数RDBMS的层次结构始于一个实例。实例是组织数据库及其所有内容的单一方式。许多RDBMS允许在一个实例中包含多个数据库。


在层次结构的某个层级,你通常会找到至少一个模式。模式是数据库内对象的逻辑分组。



模式定义了数据库对象的命名方式,并防止引用歧义。一些RDBMS将模式视为数据库的父对象,而另一些则将其视为数据库内的一个对象。模式内部包含各种数据库对象,例如表、约束和索引。
实例详解
实例是数据库或数据库集的逻辑边界,你在此处组织数据库对象并设置配置参数。

实例内的每个数据库都被分配一个唯一的名称,拥有自己的一套系统目录表(用于跟踪数据库内的对象)以及自己的配置文件。






你可以在同一物理服务器上创建多个实例,为每个实例提供唯一的数据库服务器环境。一个实例内的数据库和其他对象与任何其他实例中的对象是隔离的。
在以下情况下,你可以使用多个实例:
- 希望将一个实例用于开发环境,另一个实例用于生产环境。
- 需要限制对敏感信息的访问。
- 需要控制高级管理访问权限。
并非所有RDBMS都使用实例的概念,它们通常将数据库配置信息管理在一个特殊的数据库中。在基于云的RDBMS中,术语“实例”指的是服务的特定运行副本。



关系数据库
关系数据库是一组用于存储、管理和访问数据的对象。这些对象包括表、视图、索引、函数、触发器和包。
数据库对象可以是系统定义的(内置对象),也可以是用户定义的(用户定义对象)。在关系数据库中,数据库工程师在表之间建立关系,以减少冗余数据并提高数据完整性。
分布式关系数据库在不同但互连的计算机系统之间共享表和其他对象。






模式详解




模式是一种专门的数据库对象,它提供了一种逻辑上分组其他数据库对象的方法。一个模式可以包含表、视图、别名、触发器、函数、包和其他对象。
创建数据库对象时,可以将其分配给一个模式。如果想将对象分配给特定模式,可以显式地包含模式名称。如果不包含模式名称,对象将隐式分配给当前模式。在大多数RDBMS中,默认模式是当前登录用户的用户模式。
模式还提供了一个命名上下文。使用模式名称作为名称限定符,可以区分不同模式中具有相同名称的对象。例如,模式名称 internal 和 external 使得区分两个不同的销售表变得容易:internal.sales(内部模式中的销售表)和 external.sales(外部模式中的销售表)。因此,模式使得多个应用程序可以在单个数据库中存储数据,而不会遇到命名空间冲突。
许多RDBMS使用专门的模式来保存特定数据库的配置信息和元数据。例如,系统模式中的表可以存储数据库用户列表及其访问权限、表上的索引信息、存在的任何数据库分区的详细信息以及用户定义的数据库类型。


数据库分区
分区关系数据库是其数据在多个数据库分区上进行管理的关系数据库。
可以将需要包含大量数据的表分区为多个逻辑分区,每个分区包含整体数据的一个子集。数据分区用于涉及海量数据的场景,例如数据仓库和商业智能数据分析。




常见数据库对象
数据库对象是存在于数据库中的项目。数据库设计过程包括定义数据库对象及其相互关系。
在大多数RDBMS中,你可以创建以下对象:
- 表:由行和列组成的逻辑结构,用于存储数据。
- 约束:业务数据通常受到某些限制或规则的约束。例如,员工编号必须唯一。约束提供了一种强制执行此类规则的方法。
- 索引:索引是一组指针,用于提高性能并确保数据的唯一性。
- 视图:视图提供了表示一个或多个表中数据的不同方式。视图不是实际的表,不需要永久存储。
- 别名:别名是对象(如表)的替代名称。它可以用来提供更短、更简单的名称来引用对象。
你可以通过图形化数据库管理工具、脚本或通过API访问数据库来创建和管理数据库对象。如果使用SQL创建或管理对象,你将使用数据定义语言(DDL)语句,如 CREATE 或 ALTER。


总结

本节课中,我们一起学习了关系数据库的层次结构。我们了解到:
- 实例是数据库或数据库集的逻辑边界,用于组织对象和设置配置参数。
- 关系数据库是一组用于存储、管理和访问数据的对象,表之间的关系可以减少冗余数据并提高数据库完整性。
- 模式是一种专门的数据库对象,用于在逻辑上对表、视图、别名、触发器、函数、包和其他对象进行分组。模式提供了命名上下文,因此可以区分同名对象。
- 用户模式包含表、视图、函数等数据库对象。
- 系统模式包含数据库的配置信息和元数据。
- 可以将非常大的表拆分到多个分区以提高性能。
- 数据库对象是存在于数据库中的项目,例如表、约束、索引、视图和别名。
021:主键与外键 🔑


在本节课中,我们将要学习关系数据库中两个核心概念:主键和外键。我们将了解它们的作用、如何创建它们,以及它们如何共同定义表与表之间的关系。
概述
主键和外键是关系数据库设计的基石。主键用于唯一标识表中的每一行数据,而外键则用于建立表与表之间的链接。理解并正确使用它们,是构建高效、无冗余数据库的关键。
什么是主键? 🗝️
主键用于唯一标识表中的每一行。在某些表中,主键的选择很直观,因为它是一个自然存在的唯一属性。例如,一本书的book_id或一名员工的employee_id。
如果表中没有现成的唯一属性,你可以添加一个新列作为主键。或者,如果两个属性的组合能唯一标识每一行,你也可以创建一个跨越这两列的复合主键。例如,当员工在其工作地点内有唯一标识符时,你可以使用site_id和employee_id的组合。
请注意:每个表只能有一个主键。



如何创建主键
以下是创建主键的两种主要方法。
1. 在创建表时定义主键
你可以在使用CREATE TABLE语句建表时,通过PRIMARY KEY子句来定义主键。在括号内指定作为主键的列名。
CREATE TABLE 表名 (
列1 数据类型,
列2 数据类型,
PRIMARY KEY (列名)
);
2. 为已存在的表添加主键
你也可以使用ALTER TABLE语句的ADD PRIMARY KEY子句,为已存在的表添加主键。同样,在括号内指定列名。

ALTER TABLE 表名
ADD PRIMARY KEY (列名);



什么是外键? 🔗



上一节我们介绍了主键,本节中我们来看看外键。外键用于定义表之间的关系。



外键是一个表中的列,它包含的信息与另一个表中的主键相同。例如,一个copy表可能列出了图书馆拥有的所有书籍副本。因此,copy表中每本书的book_id必须在book表中作为一个有效的图书ID存在。如果图书馆拥有多本热门书籍的副本,那么该特定书籍的book_id会在copy表中出现多次。

你可以指定,每当向copy表添加一行时,所使用的book_id必须已经存在于book表中。这确保了数据的引用完整性。
如何创建外键
与主键类似,你可以在建表时或之后创建外键。
1. 在创建表时定义外键
使用CREATE TABLE语句中的CONSTRAINT ... FOREIGN KEY子句。在括号内指定作为外键的列,然后使用REFERENCES关键字指明它链接到的目标表及其主键列。
CREATE TABLE 子表名 (
列1 数据类型,
外键列 数据类型,
CONSTRAINT 约束名 FOREIGN KEY (外键列)
REFERENCES 父表名 (父表主键列)
);
2. 定义外键约束规则


你还可以使用ON UPDATE和ON DELETE规则子句,来定义当父表(拥有主键的表)中的行被更新或删除时应采取的操作。



以下是可用的规则:



- NO ACTION:不采取任何特殊操作。如果子表中存在关联记录,对父表的更新或删除操作可能会失败。
- CASCADE:级联操作。当父表中的记录被删除时,自动删除子表中的所有相关记录;当父表的主键更新时,自动更新子表中所有相关外键的值。
- SET NULL:当父表中的记录被删除或更新时,将子表中相关记录的外键列设置为
NULL。



CREATE TABLE 子表名 (
列1 数据类型,
外键列 数据类型,
CONSTRAINT 约束名 FOREIGN KEY (外键列)
REFERENCES 父表名 (父表主键列)
ON DELETE CASCADE
ON UPDATE NO ACTION
);

总结
本节课中,我们一起学习了关系数据库中的主键和外键。

- 你可以使用主键来强制表中每一行的唯一性。
- 外键是一个表中的列,它包含与另一个表中主键相同的信息。
- 你可以使用主键和外键在表之间创建关系,从而构建出结构清晰、数据一致的关系型数据库。


掌握这些概念是成为合格数据工程师的重要一步。
022:索引概述


在本节课中,我们将要学习数据库索引。我们将了解索引是什么,如何创建索引,以及使用索引的优缺点。

什么是索引?🔍
上一节我们介绍了数据在表中的存储方式。通常,向表中添加数据时,数据会被追加到表的末尾。然而,这并非绝对保证,数据本身没有固有的顺序。
因此,当您从表中选择特定行时,处理器必须依次检查每一行,直到找到您想要的那一行。在大型表上,这可能成为一种非常缓慢的定位行的方法。
此外,当您选择多行时,除非在SELECT语句中指定排序顺序,否则它们可能以无序状态返回。因为您经常希望以特定顺序返回行或选择连续行的子集,所以可以在表上创建索引,以便轻松定位所需的特定行或行集。
索引的工作原理是存储指向表中每一行的指针。当您请求特定行时,SQL处理器可以使用索引快速定位该行。这类似于您使用书籍的索引来快速找到书中特定部分的方式。索引基于其建立的唯一键内的值进行排序。
如何创建索引?⚙️

默认情况下,当您在表上创建主键时,会自动在该键上创建一个索引。但您也可以在经常被搜索的列上创建自己的索引。



使用 CREATE INDEX 语句来定义索引,指定索引名称、其唯一性以及要基于的表和列。

CREATE INDEX index_name ON table_name (column_name);
以下是创建索引的步骤:
- 确定需要频繁查询的列。
- 使用
CREATE INDEX语句。 - 指定索引名称和对应的表及列。
索引的优点与缺点 ⚖️
索引为数据库用户提供了许多好处,但也存在一些缺点。让我们分别来看一下。



索引的优点




索引提供了以下主要优势:
- 提高SELECT查询性能:当在已索引的列上进行搜索时,索引提供了定位匹配搜索条件的行的快速路径,结果返回速度比必须检查表中每一行时要快。
- 减少数据排序需求:如果您经常需要按特定顺序获取行,使用索引可以消除在定位行之后再进行排序的需要。
- 保证行唯一性:如果在创建索引时使用
UNIQUE子句,您可以确保更新和插入操作不会在该列中创建重复条目,而无需承担必须对照表中每一行进行检查的开销。
索引的缺点
然而,索引也有一些缺点:
- 占用磁盘空间:您创建的每个索引都会占用磁盘空间,就像添加索引会增加书籍的页数一样。
- 降低INSERT、UPDATE和DELETE查询的性能:因为索引表中的行是根据索引排序的,所以添加或删除行可能比在非索引表中花费更长时间。
您应该只在从优势中获得的收益大于从劣势中遭受的损失时才创建索引。例如,在一个很少插入或更新行,但经常在SELECT查询和WHERE子句中使用的表上创建索引是合适的。

如果您在一个表上创建许多索引,实际上可能会抵消性能优势,就像为书中的每个单词都建立索引会导致一个无用的索引一样。

总结 📝
本节课中我们一起学习了数据库索引的核心概念。
您了解到:
- 索引为表中的行提供了有序的指针。
- 索引可以提高SELECT查询的性能。
- 索引可能会降低INSERT、UPDATE和DELETE查询的性能。


合理创建和使用索引是优化数据库查询性能的关键技术之一。
023:数据库规范化 📊


在本节课中,我们将要学习数据库规范化的概念和过程。规范化是数据库设计中的一项关键技术,旨在通过减少数据冗余和提高数据一致性来优化数据库结构。我们将依次介绍第一范式、第二范式和第三范式,并通过实例说明如何将一个非规范化的表逐步规范化。

概述

当你在数据库中记录数据时,例如记录书店的书籍信息,不可避免地会出现数据不一致和重复信息的情况。这种重复会导致在更新数据时产生额外的工作和不一致性,因为你必须在多个地方进行修改。规范化就是通过组织数据来减少冗余数据的过程,通常通过将较大的表拆分为多个相关的表来实现。
规范化有助于加快事务处理速度,因为你只需在规范化的数据库上执行一次更新、添加和删除操作。它还能提高数据完整性,因为它减少了数据在一处被修改而另一处未被修改的可能性。

在开始规范化过程时,重要的是要认识到,你需要专注于规范化每个表,直到达到所需的范式级别。规范化通常会导致创建更多的表,一旦所有表都规范化了,你就得到了一个规范化的数据库。
有多种规范化形式,大多数数据工程师需要熟悉第一范式、第二范式和第三范式。
第一范式(1NF)📝
要使一个表符合第一范式,必须满足两个条件:每一行必须是唯一的,并且每个单元格只能包含一个单一的值。第一范式也简称为 1NF。
让我们看看如何规范化一个简单的表。在这个例子中,book 表包含一些关于书籍的基本信息,包括书名、格式和作者。为了满足第一范式的要求,每个单元格必须包含一个单一的值,而不是一个列表。在这个例子中,你可以看到一本书的所有格式都列在了同一个单元格里。

原始表(不符合1NF)示例:
| Book_ID | Title | Formats | Author |
|---|---|---|---|
| 401 | Patterns of Software | Paperback, Hardback | Richard P. Gabriel |
为了规范化这个表,你可以添加额外的行,并将《Patterns of Software》的两种格式拆分到各自的行中。


规范化后的表(符合1NF):
| Book_ID | Title | Formats | Author |
|---|---|---|---|
| 401 | Patterns of Software | Paperback | Richard P. Gabriel |
| 401 | Patterns of Software | Hardback | Richard P. Gabriel |

现在,表中的每个单元格都只有一个条目。因此,该表符合第一范式。



第二范式(2NF)🔗

要使数据库符合第二范式,它必须首先满足第一范式。

第二范式规定,你应该通过创建新表来分离那些适用于多行数据的值组。第二范式也简称为 2NF。

为了清晰起见,这个例子只展示了 book 表中的一部分数据。书ID为401的书有平装和精装两种格式,因此在当前形式下,它必须被列出两次,每种格式一次。

当前表(符合1NF,但不符合2NF)示例:
| Book_ID | Title | Formats | Author |
|---|---|---|---|
| 401 | Patterns of Software | Paperback | Richard P. Gabriel |
| 401 | Patterns of Software | Hardback | Richard P. Gabriel |
在这种情况下,“格式”列包含的值适用于引用书ID 401的两行,因此存在数据重复。为了满足第二范式的要求,并为书ID 401实现只有一行,你可以拆分 book 表,使书的格式信息与书名、作者等不相关的信息分离开。



拆分后的表:


book表:
| Book_ID | Title | Author |
|---|---|---|
| 401 | Patterns of Software | Richard P. Gabriel |
format表:
| Book_ID | Formats |
|---|---|
| 401 | Paperback |
| 401 | Hardback |
每个结果表都符合第一范式。为了维护两个表之间的关系,需要确定一个表的主键,该主键将作为另一个表的外键使用。在我们的例子中,Book_ID 对每本书都是唯一的,因此你可以将其设为 book 表的主键,并作为外键包含在 format 表中。现在,你可以使用它来链接两个表,以查找每本唯一书籍的不同格式。




第三范式(3NF)🎯
要满足第三范式的要求,数据库必须已经符合第一范式和第二范式。


接下来,你必须消除任何不依赖于键的列。第三范式也简称为 3NF。
让我们考虑一些关于书籍的额外数据:出版商和书籍的发货地。每个出版商都从他们自己所在地的仓库发货书籍。因此,书籍的发货地取决于出版商,而不是书ID。所以,book 表不符合第三范式,因为“发货地”数据不依赖于主键。
不符合3NF的book表示例:


| Book_ID | Title | Author | Publisher | Ships_From |
|---|---|---|---|---|
| 401 | Patterns of Software | Richard P. Gabriel | ACM Press | New York |



为了满足第三范式的要求,你必须将出版商和发货地信息分离到一个独立的 publisher 表中。
规范化后的表:
book表(符合3NF):
| Book_ID | Title | Author | Publisher_ID |
|---|---|---|---|
| 401 | Patterns of Software | Richard P. Gabriel | 1 |
publisher表(符合3NF):
| Publisher_ID | Publisher | Ships_From |
|---|---|---|
| 1 | ACM Press | New York |

现在两个表都符合第三范式,这也是大多数关系数据库所达到的程度。此外,还有更高的范式,例如巴斯-科德范式,它是第三范式的扩展,以及第四和第五范式,这些可能用于特定的场景。

规范化在OLTP与OLAP系统中的不同应用

在事务处理系统(OLTP)中,数据被频繁地读取和写入,通常需要将数据规范化到第三范式。OLTP系统需要高效地处理和存储事务,以及查询事务数据,将数据规范化到第三范式有助于数据库高效地处理和存储单个事务。

在分析系统(OLAP)中,使用方式主要是只读的,数据库针对读取性能而非写入完整性进行了优化。因此,在数据被加载到分析系统(如数据仓库)之前,可能已经进行了一些反规范化,使其处于较低的范式级别。在数据仓库中,数据工程师关注的是性能,而处理更少的表可能对性能有益。
总结
在本节课中,我们一起学习了数据库规范化的核心概念。我们了解到,规范化可以减少数据冗余并提高数据一致性。

具体来说:
- 在第一范式中,每一行必须是唯一的,每个单元格必须只包含一个单一的项目。
- 在第二范式中,你必须为适用于多条记录的值组创建独立的表。
- 在第三范式中,你需要消除任何不依赖于键的列。

我们还探讨了规范化在OLTP和OLAP系统中的不同应用场景。掌握这些范式是设计高效、可靠关系数据库的基础。
024:关系模型约束详解



在本节课中,我们将要学习关系数据库模型中的六种核心约束。约束是用于实施业务规则、确保数据完整性的重要机制。理解这些约束对于设计和维护高质量的关系数据库至关重要。
上一节我们介绍了关系模型的基础概念,本节中我们来看看如何通过具体的约束规则来保证数据的准确性和一致性。


🔑 实体完整性约束


为了识别关系中的每个元组,关系必须有一个主键。主键是用于唯一标识表中每个元组或行的值。这就是实体完整性约束,有时也称为主键约束或唯一约束。该约束能防止表中出现重复值,通常通过索引来实现。

实体完整性约束规定:参与关系主键的任何属性都不允许接受空值(NULL)。空值表示该值未知。在主键中,不能存在未知的值。
例如,在 作者(author) 关系中,作者ID(author_ID) 是主键。它标识了关系中的每个元组。作者ID A1 对应来自多伦多的作者 Raoul Chong。如果将 A1 的值替换为 NULL,你仍然可以识别作者是 Raoul Chong。然而,如果你也将 作者ID A4 替换为 NULL,现在你就无法知道哪个 NULL 值对应哪个元组了。因此,实体完整性约束确保了主键属性的非空性。
🔗 参照完整性约束
参照完整性约束定义了表之间的关系,并确保这些关系保持有效。数据的有效性通过主键和外键的组合来强制执行。
如前所述,一本书要存在,必须至少由一位作者撰写。参照完整性约束确保了这种依赖关系的正确性。例如,书籍(book) 表中的 作者ID 外键必须引用 作者(author) 表中实际存在的主键值,不能引用一个不存在的作者ID。
🧠 语义完整性约束
语义完整性约束涉及数据含义的正确性。



例如,在 作者(author) 关系中,如果 城市(city) 属性包含一个无意义的垃圾值而不是“Toronto”,那么这个垃圾值没有任何实际意义。语义完整性约束关注的就是数据的正确含义。
🎯 域约束

域约束规定了给定属性允许的取值范围。
例如,在 作者(author) 关系中,国家(country) 属性必须包含一个两位字母的国家代码,如 CA 代表加拿大,IN 代表印度。如果为 国家 属性输入了数字值 34 而不是两位字母代码,那么值 34 就没有任何意义。域约束确保了属性值在预定义的、有意义的集合内。

🚫 空值约束


正如前面所见,实体完整性约束规定主键属性不能为空;而空值约束则指定某些属性的值不能为 NULL。
例如,在 作者(author) 关系中,如果 姓氏(last_name) 或 名字(first_name) 包含空值,就很难正确识别作者。在此例中,名字和姓氏的属性值不能为空,作者必须拥有姓名。

✅ 检查约束
最后,检查约束通过限制关系属性可接受的值来强制实施域完整性。


在 书籍(book) 关系中,属性 年份(year) 表示特定书籍的出版年份。如果当前仍是 2010 年,那么出现一个大于当前年份的年份值是没有意义的。检查约束将通过限制 年份 属性可接受的值来强制实施域完整性,例如确保 year <= 2010。


以下是关系数据库中定义的六种约束的总结列表:
- 实体完整性约束:确保主键是唯一标识每个元组的值,且主键属性不允许为空。
- 参照完整性约束:定义表间关系,并通过主外键确保关系有效。
- 语义完整性约束:确保数据具有正确的含义。
- 域约束:规定属性允许的取值范围。
- 空值约束:规定特定属性的值不能为空。
- 检查约束:通过特定条件限制属性可接受的值。




本节课中我们一起学习了关系模型中的六种关键约束:实体完整性、参照完整性、语义完整性、域约束、空值约束和检查约束。这些约束共同作用,为数据库中的数据定义了必须遵守的规则,是保障数据准确性、一致性和业务逻辑正确性的基石。理解并正确应用这些约束,是成为一名合格数据工程师或数据库管理员的重要一步。
025:MySQL入门 🚀
在本节课中,我们将要学习MySQL的基础知识,包括其用途以及一些常用的工具。MySQL是一个流行的开源关系数据库管理系统(RDBMS)。通过本课,你将能够解释MySQL的使用方式,并描述一些流行的MySQL工具。
什么是MySQL? 🗄️
MySQL是一个流行的开源关系数据库管理系统(RDBMS)。MariaDB是由MySQL的一些原始开发者创建的一个分支版本。MySQL提供了多种方式来满足不同需求。
以下是获取和使用MySQL的主要方式:
- 社区版:你可以根据GNU通用公共许可证下载并安装免费的社区版,并将其嵌入到你自己的应用程序中。
- 商业版:你可以购买、下载并安装包含额外功能的商业版本,例如标准版、企业版和集群版。
- 云服务:MySQL也可以在云上使用。你可以通过虚拟机镜像或容器进行自我管理,也可以使用托管服务,例如IBM Cloud、Amazon RDS for MySQL、Azure Database for MySQL或Google Cloud SQL for MySQL。

常用MySQL工具 🛠️
有多种工具可以帮助你管理和操作MySQL数据库。上一节我们介绍了MySQL的基本概念,本节中我们来看看这些实用的工具。
以下是几种主要的MySQL工具:
- MySQL命令行界面:用于与MySQL服务器和数据交互的命令行工具。
- MySQL Admin:一个用于管理RDBMS的命令行程序,以及其他用于特定任务的MySQL实用程序。
- MySQL Workbench:一个适用于Windows、Linux和Mac OS的桌面应用程序。
- PHPMyAdmin:一个流行的第三方Web界面。

MySQL命令行界面 💻
MySQL命令行界面使你能够向MySQL服务器和数据发出命令。这些命令可以直接在提示符下以交互方式输入,也可以从你在命令提示符下调用的文本文件中读取。
此截图展示了以交互方式运行 SHOW DATABASES; 命令,以列出当前可用的数据库。

SHOW DATABASES;
在批处理模式下运行时,你可以指定一个文件来存储任何输出消息以供后续使用。
MySQL Workbench 🖥️

MySQL Workbench是一个可视化数据库设计工具,它将SQL开发、管理、数据库设计、创建和维护集成到一个统一的MySQL数据库系统开发环境中。

在管理页面,你可以查看连接详情和服务器功能,并执行管理任务,例如导入和导出数据,以及查看服务器日志和性能报告。
PHPMyAdmin 🌐
PHPMyAdmin是一个图形化的Web界面,你可以用它来与你的MySQL数据库进行交互。当你首次连接到服务器时,会看到服务器信息和系统数据库。然后,你可以创建自己的用户数据库,并使用不同的选项卡与它们进行交互。

以下是你可以通过PHPMyAdmin执行的主要操作:
- 创建数据库和表。
- 加载和查询数据。
- 导入和导出数据。
总结 📝

本节课中我们一起学习了MySQL的入门知识。你了解到,你可以在自己的桌面和服务器上下载并安装MySQL。你可以在云端进行自我管理或使用MySQL的托管服务。MySQL和MySQL Admin是用于数据库管理的命令行界面。MySQL Workbench是一个用于设计、开发和管理MySQL数据库的桌面应用程序。而PHPMyAdmin则是一个用于操作MySQL数据库的Web界面。
026:在MySQL中创建数据库和表 🗄️


在本节课中,我们将学习如何在MySQL中创建数据库和表。我们将介绍两种主要方法:使用命令行界面和使用图形用户界面工具PHPMyAdmin。通过本课的学习,你将能够掌握创建数据库、定义表结构以及编辑表定义的基本技能。

创建数据库和表的方法概述
与许多关系数据库管理系统(RDBMS)一样,你可以在MySQL中使用命令行界面、图形用户界面或API调用来创建数据库和表。本视频将演示如何使用命令行和PHPMyAdmin用户界面来执行这些任务。你将看到如何先创建数据库,再创建表,然后如何定义和编辑该表中的列。

使用命令行界面创建
你可以在MySQL命令行中执行命令来创建数据库对象。
以下是使用命令行创建数据库和表的基本步骤:
- 使用
CREATE DATABASE命令创建数据库。 - 使用
CREATE TABLE命令创建表,并指定列名和数据类型。 - 使用
DESCRIBE命令显示新创建表的结构。
示例代码:
CREATE DATABASE company_db;
USE company_db;
CREATE TABLE employee_details (
id INT,
name VARCHAR(100),
department VARCHAR(50),
hire_date DATE
);
DESCRIBE employee_details;
使用PHPMyAdmin创建


PHPMyAdmin是一个流行的、带有Web界面的可视化工具,用于操作MySQL。


上一节我们介绍了命令行方法,本节中我们来看看如何使用图形化工具完成同样的任务。

创建数据库


以下是使用PHPMyAdmin创建数据库的步骤:

- 在左侧窗格的树形视图中,点击“新建”。
- 在“数据库”选项卡中,输入新数据库的名称。
- 可以选择为数据选择编码。
- 点击“创建”。
这将创建数据库,该数据库现在会显示在窗口左侧的数据库树形视图中,并会打开“创建表”选项卡。
创建表
要创建表,请按以下步骤操作:

- 在“创建表”选项卡中,输入表名(例如
employee_details)。 - 选择表的列数。
- 点击“执行”。


在下一步中,你将定义表的列。
定义列
以下是定义表列的具体操作:

- 为每一列输入名称。
- 选择数据类型。
- 如果与该数据类型相关,则输入长度值。
- 点击“保存”。
之后,你将看到数据库中新表结构的摘要。在这里,你可以编辑列。
编辑表结构

创建表后,你可以对其进行修改。以下是可进行的操作:
- 编辑现有列。
- 删除列。
- 移动列的位置。
- 规范化表。
- 如果需要,还可以添加更多列。
总结

本节课中我们一起学习了在MySQL中创建数据库和表的两种主要方法。

你了解到,可以使用命令行界面、图形用户界面或API调用来创建数据库和表。PHPMyAdmin提供了一个易于使用的界面来创建数据库、表和列,并且你可以在创建表之后添加和修改列。
027:在MySQL中加载数据 📥


在本节课中,我们将学习如何向MySQL数据库和表中填充数据。你将了解如何使用备份与恢复功能、如何手动插入少量数据,以及如何通过导入/导出功能高效地处理大量数据。

概述

作为数据工程师或数据库管理员,经常需要向数据库和表填充数据。一种方法是备份一个包含所需数据的现有数据库,并将其恢复到新的目标位置。
上一节我们介绍了数据库的基本操作,本节中我们来看看具体的数据填充方法。




使用 mysqldump 进行备份与恢复 🔄
你可以使用 mysqldump 工具将数据库备份到一个 .sql 文件,该文件包含了重建数据库内容所需的所有SQL语句。

其最简单的用法如下所示:

mysqldump -u username -p database_name > backup_file.sql

在这个命令中:
-u参数指定用户名。database_name是要备份的数据库名称。backup_file.sql是用于创建备份的文件名。

如果你只想备份特定的表,可以在数据库名后列出这些表的名称。
要恢复备份文件,可以使用 mysql 命令以类似的方式操作:
mysql -u username -p database_name < backup_file.sql
这会运行备份文件中的所有SQL语句,从而在目标数据库中重新创建对象并恢复数据。


请注意:
- 符号
>表示输出到.sql文件(即备份)。 - 符号
<表示从文件输入到数据库(即恢复)。

如果你已经位于MySQL命令行提示符下,可以使用 source 命令来恢复转储文件:
source backup_file.sql;
此方法也可用于从文件执行SQL脚本。

使用 phpMyAdmin 进行备份与恢复 🖥️


你也可以使用图形化管理工具phpMyAdmin来备份数据库。

以下是操作步骤:
- 在树形视图中选择一个数据库。
- 点击“导出”选项卡。
- 点击“执行”按钮。
默认情况下,这种快速导出方法会生成一个SQL文件,其中包含完全重建数据库内容所需的所有脚本。然后,你可以使用“导入”选项卡将此数据库恢复到此MySQL实例或另一个实例中。


以下是恢复步骤:
- 选择你的目标数据库。
- 点击“导入”选项卡。
- 定位备份文件。
- 再次点击“执行”按钮。

这将运行备份文件中的所有SQL语句,以在目标数据库中重新创建对象并恢复数据。


手动插入少量数据 ✍️

如果你只想向单个表中填充少量数据,而不是整个数据库,可以使用phpMyAdmin工具手动输入行或运行SQL INSERT 语句。

在phpMyAdmin中手动输入行的步骤如下:
- 选择目标表。
- 点击“插入”选项卡。
- 输入数据。
- 点击“执行”按钮。
默认情况下,你可以一次输入两行数据,但可以根据需要增加或减少此数量。向表中输入数据后,你可以在“浏览”选项卡中查看这些数据。


手动输入行和运行单独的SQL语句适用于少量数据。但是,如果要加载大量行,你会发现导入功能更易于使用且速度更快。

导入大量数据 📁


你可以使用 LOAD DATA INFILE SQL语句将CSV文件的内容导入到现有的MySQL表中。
或者,可以使用 mysqlimport 实用程序,传入表所在的数据库名称和CSV文件名:
mysqlimport -u username -p database_name data_file.csv


表名是从CSV文件的名称推断出来的,因此你必须确保文件名与表名完全匹配。
此外,phpMyAdmin为向表中导入数据提供了可视化界面。
使用phpMyAdmin导入数据的步骤如下:
- 选择目标表。
- 点击“导入”选项卡。
- 点击“选择文件”按钮来选择你的文件。
- 检查格式和选项是否已根据数据文件正确确定。
- 点击“执行”按钮。


使用此方法,你一次最多可以导入2兆字节的数据。

导出数据到CSV文件 📤


你也可以使用phpMyAdmin将表中的数据导出为CSV格式。

以下是操作步骤:
- 选择要导出的表。
- 点击“导出”选项卡。
- 将格式更改为CSV。
- (可选)指定要导出的行。
- 点击“执行”按钮。

总结
本节课中我们一起学习了向MySQL填充数据的多种方法。

你了解到,可以在命令行和phpMyAdmin中使用备份与恢复功能来填充整个数据库。对于少量数据,可以使用phpMyAdmin手动插入。而对于大量数据,则可以在命令行和phpMyAdmin中使用导入和导出功能来高效地填充表格或将其数据保存到文件中。
028:在MySQL中使用键和约束 🔑




在本节课中,我们将学习如何在MySQL数据库中创建和使用键与约束。键和约束是确保数据完整性、一致性和建立表间关系的重要工具。

概述

与其他关系型数据库类似,MySQL支持多种键和约束,包括主键、外键、唯一约束和非空约束。你可以在创建表时定义它们,也可以在之后添加。本教程将使用流行的可视化工具PHPMyAdmin Web界面来演示如何创建和使用这些键与约束。


创建主键
主键可以定义在单个列上,也可以定义在多个列的组合上。主键列不能包含空值(NULL),并且键定义会强制该列或列组合的值具有唯一性。创建主键会自动在构成主键的列上创建一个索引。
在PHPMyAdmin中创建表时,可以通过以下步骤为列创建主键:
- 为列添加一个类型为“PRIMARY”的索引。
- 点击“执行”按钮进行确认。
如果你想将另一列也包含在主键中,只需为该列也添加一个主索引即可。完成后,你会在列名旁边看到一个主键图标,并且在表上会有一个名为“PRIMARY”的索引。



通常,表中会有一个现有列符合主键的要求,例如员工表中的员工ID列。




使用自增属性


然而,在其他场景下,你可能希望为添加到表中的每一行自动生成一个ID号。列的自增属性可以实现此功能。与键一样,你可以在创建表时设置它,也可以在之后设置。


在“创建表”或“结构”选项卡上,为你作为主键的列选中“A_I”(自动递增)复选框,然后点击“保存”。现在,当你向表中添加数据时,数据库引擎会自动为员工ID列生成递增的条目。
创建外键
你还可以创建外键来关联不同表中的数据。例如,你可以在employee_details表中使用员工ID列,通过创建外键链接到employee_contact_info表中的员工ID列。



在“结构”选项卡的“关联视图”中创建外键:
- 输入外键的名称。
- 标识定义此外键的列。
- 你还可以指定当相关行被删除或更新时要采取的操作。



与主键一样,底层索引现在也会默认显示在“结构”选项卡上。
管理非空与唯一约束


默认情况下,在PHPMyAdmin中创建MySQL表时,列被定义为“NOT NULL”(非空)。你可以在创建表时更改此设置,也可以通过修改列定义来更改。


例如,要允许在“开始日期”和“薪水”列中输入空值,请选中这些列的“Null”复选框。保持员工ID、名字和姓氏的“Null”复选框为空,可确保这些列需要输入数据。
为确保每位员工的电子邮件地址是唯一的,你可以使用唯一约束。在“结构”选项卡上,点击相关列的“更多”链接,然后点击“唯一”。
总结

本节课中,我们一起学习了MySQL中键与约束的核心用法:
- 通过在一个或多个列上定义主索引来创建主键。
- 使用自增属性在列中自动生成顺序数字数据。
- 创建外键时,可以定义ON DELETE和ON UPDATE操作。
- MySQL列默认是NOT NULL的。
- 可以将列配置为仅接受唯一值。

掌握这些概念对于设计和维护结构良好、数据可靠的关系数据库至关重要。
029:PostgreSQL入门指南 🐘




在本节课中,我们将学习PostgreSQL的基础知识,包括其特点、使用方式以及相关工具。通过本节内容,你将能够描述PostgreSQL,解释如何使用PostgreSQL数据库,并了解PSQL和PG Admin等工具的功能。
PostgreSQL是一个开源的对象-关系数据库管理系统,以其可靠性、灵活性以及对关系型和非关系型数据类型的支持而享有盛誉。PostgreSQL是OLTP(联机事务处理)、数据分析和地理信息系统的流行数据库选择。




你可以通过多种方式使用PostgreSQL:可以在自己的服务器上下载并安装,支持的操作系统包括Mac OS、Unix或Windows;也可以在云端的虚拟机镜像或容器中安装并自行管理PostgreSQL;或者使用托管服务,例如IBM Cloud Databases for PostgreSQL、Amazon RDS、Google Cloud SQL for PostgreSQL、EnterpriseDB Cloud或Microsoft Azure for PostgreSQL。
上一节我们介绍了PostgreSQL的基本概念和使用方式,本节中我们来看看连接PostgreSQL数据库的各种工具。

以下是几种常用的工具:




- PSQL:为PostgreSQL提供命令行界面。
- PG Admin:提供数据库服务器的开源图形界面,可作为桌面应用程序或安装在Web服务器上的Web应用程序使用。
- Navicat和DBeaver:是可用于访问PostgreSQL、MySQL和其他类型数据库的商业图形界面选项。
- 托管数据库和云服务提供商:是使用PostgreSQL的其他选择。例如,Amazon RDS for PostgreSQL提供了基于Web的管理控制台和RDS API。
PSQL是一个交互式命令行工具,可用于处理PostgreSQL数据库。你可以运行交互式查询并查看数据库中对象的信息。
这里的截图显示了library和postgres用户数据库,以及PostgreSQL在创建新数据库时用作模板的内部template0和template1数据库。





你也可以使用PG Admin与PostgreSQL数据库进行交互。首次连接到服务器时,你将连接到默认的postgres数据库。创建其他数据库后,可以指定直接连接到它们。你可以使用PG Admin完成所有开发和行政任务,包括创建数据库和表、加载数据、查询数据、编写存储过程和函数、管理数据库对象、管理安全性和监控使用情况。


上一节我们介绍了PSQL和PG Admin的基本功能,本节中我们来看看PG Admin中的两个核心工具:查询工具和ERD工具。
PG Admin包含查询工具,可用于运行SQL命令并在上方窗格中查看或与其结果进行交互。你可以在此处键入或粘贴SQL查询,结果将显示在下方。如果结果可编辑,你可以使用此区域编辑数据库。你还可以使用选项卡查看查询计划的解释、服务器消息以及此下方窗格中的异步服务器通知。





PG Admin还包含一个ERD工具,可用于为现有数据库创建ERD,或创建新的ERD并生成用于创建底层数据库对象的SQL语句。要从现有数据库创建实体关系图,请右键单击数据库,然后点击“生成ERD”。该工具会审查你的数据库结构并生成可视化图表,展示数据库中的表及其之间的关系。你可以在工具中重新组织表、添加、编辑和删除关系、添加注释以及生成SQL语句。

在本节课中,我们一起学习了PostgreSQL的基础知识。你了解到可以在自己的服务器上安装PostgreSQL,也可以在云端使用它。PSQL为PostgreSQL服务器提供了命令行界面,而PG Admin是PostgreSQL流行的数据库管理工具,它包含对象导航、查询工具和ERD工具。
030:在 PostgreSQL 中创建数据库和加载数据 🗄️➡️📥





欢迎学习在 PostgreSQL 中创建数据库和加载数据。

在本节课中,我们将要学习如何在命令行和使用 PG Admin 图形界面创建数据库和表,如何备份和恢复数据库,以及如何向表中导入和导出数据。


与许多关系数据库管理系统一样,你可以通过命令行界面、图形用户界面或 API 调用来创建 PostgreSQL 数据库和表,并加载数据。


在本视频中,你将看到如何使用 PSQL 命令行界面和 PG Admin 图形用户界面来执行这些任务。你将看到如何创建数据库,然后创建表并定义和编辑表中的列,最后你将看到如何将数据加载到数据库中。
使用 PSQL 命令行工具
上一节我们介绍了创建数据库的多种方式,本节中我们来看看如何使用 PSQL 命令行工具。






你可以使用 PSQL 来发出命令,以创建数据库对象并与之交互。使用 CREATE DATABASE 命令创建数据库,使用 CREATE TABLE 命令创建表并指定列名和数据类型。你可以使用 \d 命令来显示新创建表的结构。
创建数据库后,你可能希望将数据加载到其中。在命令行中,你可以使用 PSQL 来恢复之前使用 pg_dump 备份的数据库。只需指定目标数据库的名称和转储文件的名称。这将重新创建表以及任何其他数据库对象,并恢复创建转储文件时存在的数据。
以下是相关命令示例:
-- 创建数据库
CREATE DATABASE my_database;
-- 连接到数据库
\c my_database
-- 创建表
CREATE TABLE employee_details (
id INT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50)
);
-- 显示表结构
\d employee_details
-- 从转储文件恢复数据库
psql my_database < backup_file.sql

使用 PG Admin 图形界面


了解了命令行操作后,我们来看看更直观的图形界面操作。












PG Admin 是一个基于 Web 的可视化工具,可用于操作 PostgreSQL。要在左侧树状视图中创建数据库,请右键单击“数据库”,点击“创建”,然后点击“数据库”。

输入新数据库的名称,然后点击“保存”。如果你想从转储文件恢复整个数据库,请在树状视图中选择要恢复到的数据库,点击“恢复”,然后在恢复对话框中输入转储文件的位置。这将运行该文件中包含的 SQL 语句,以在当前数据库中重新创建数据库对象和数据。


在 PG Admin 中创建表和导入数据

创建好数据库后,下一步是创建表并填充数据。





或者,你可以使用 PG Admin 手动创建表。在树状视图中,右键单击“表”,点击“创建”,然后点击“表”。在“常规”页面输入表的名称(例如 employee_details),然后在“列”选项卡中输入列的详细信息,最后点击“保存”。之后,你将在树状视图窗格的“表”部分看到你的表和列。
从这里,你可以使用导入/导出功能将数据加载到新表中。










在“导入/导出数据”对话框中,选择“导入”,然后输入数据文件的位置和文件名。如果你从 CSV 文件加载数据,则无需指定分隔符,因为这是 CSV 文件的默认选项。然后,你可以使用“查看/编辑数据”选项来查看加载的数据。这将运行一个 SQL 查询来显示所选表中的数据。
导出数据与备份数据库

除了导入,我们还需要掌握如何导出数据和进行完整备份。





你也可以使用导入/导出功能将数据库中现有的数据导出为 CSV 文件以供其他地方使用。CSV 是默认格式,因此你只需指定文件名并点击“确定”即可。
如果你想备份整个数据库,可以使用 pg_dump 实用程序。其语法与使用 PSQL 恢复数据类似:指定数据库名称和转储文件的文件名。默认情况下,pg_dump 会创建一个包含描述数据库中所有对象和数据的脚本的 SQL 文件。
以下是相关命令示例:
# 备份整个数据库到 SQL 文件
pg_dump my_database > my_database_backup.sql


# 备份到自定义格式的压缩归档文件
pg_dump -Fc my_database > my_database_backup.dump





你还可以通过自定义命令将输出改为压缩归档文件。默认情况下,pg_dump 会备份数据库中的整个模式和数据。
总结

本节课中我们一起学习了创建 PostgreSQL 对象的多种工具,包括 PSQL 命令行实用程序和 PG Admin。我们学习了如何使用 pg_dump 备份数据库以及使用 PSQL 恢复它们。最后,我们还学习了如何使用 PG Admin 的导入/导出工具向表中加载数据以及从表中导出数据。
031:视图(Views)👁️


在本节课中,我们将要学习数据库中的“视图”概念。我们将了解什么是视图,如何创建和使用视图,以及物化视图与普通视图的区别。

什么是视图?

视图是一种表示一个或多个表(或其他视图)中数据的替代方式。你可以像与表交互一样与视图交互,根据需要插入、更新和删除数据。
视图是限制对敏感数据的访问、简化数据检索以及减少对底层表访问的有效方法。例如,你可以创建一个视图,仅包含来自两个表的“姓名”和“邮箱”列。这样,用户就可以轻松访问这些数据,而无需知道数据存储在不同的表中,也无需获得访问表中敏感薪资信息的权限。
如何创建和使用视图?
在PgAdmin中,视图在模式(Schema)内创建。以下是创建视图的步骤:


- 在左侧的树形视图中,右键点击“Views”。
- 点击“Create”,然后点击“View”。
- 这将打开“Create view”对话框。首先需要为视图命名。
- 在“Code”页面,输入定义该视图的SQL代码。
- 点击“Save”。




之后,你将在“Views”文件夹中看到你的视图。你可以展开视图以显示其中包含的列。


要运行视图,请右键点击视图名称,选择“View/Edit Data”,然后点击“All Rows”。你将看到视图中包含的所有行。


什么是物化视图?

PostgreSQL还支持另一种类型的视图,称为物化视图。
当你首次刷新物化视图时,其结果集会被“物化”或保存以供将来使用。这种物化意味着你只能查询数据,而不能更新或删除它。然而,这也提高了未来查询该视图的性能,因为结果集已经准备就绪,通常存储在内存中。
如何创建和使用物化视图?



创建物化视图的过程与创建常规视图类似,但你必须确保从树形视图中的“Materialized Views”文件夹开始操作。

以下是具体步骤:


- 在“Definition”页面输入视图名称后,输入定义视图的代码。例如,以下代码仅从
employ_details表中包含“员工ID”和“薪资”列,以匿名化薪资信息:SELECT employee_id, salary FROM employ_details; - 点击“Save”,物化视图就会被添加到文件夹中。


由于物化视图在使用前存储了数据,因此你需要用当前行来刷新它。之后,你就可以使用该视图来访问其中保存的数据。你可以随时刷新视图中的数据,以使用底层表中的数据来更新它。

课程总结

本节课中我们一起学习了数据库视图的相关知识。

- 视图是表示数据的一种替代方式。
- 你可以使用视图来限制对敏感数据的访问并简化数据检索。
- 物化视图会存储结果集,以便后续更快地访问。
- 你无法通过物化视图插入、更新或删除行。
032:数据库设计方法(含ERD)📊




在本节课中,我们将要学习数据库设计的重要性、设计过程以及实体关系图(ERD)工具的作用。一个良好的数据库设计是任何数据驱动项目成功的关键。



概述:优秀数据库设计的重要性 🎯

一个精心设计的数据库对于项目的成功至关重要。良好的数据库设计有助于保障数据完整性、减少数据冗余、提升应用程序性能并提高用户满意度,这些都是衡量项目成功的关键指标。



因此,在项目初期投入时间进行数据库设计,可以避免日后出现代价高昂的问题。


数据库设计的三步流程 🔄



数据库设计过程包含三个关键步骤:
- 需求分析:分析你正在处理的数据以及使用这些数据的需求。
- 逻辑设计:规划如何组织你的数据。
- 物理设计:规划如何在选定的数据库管理系统中实现你的逻辑设计。


接下来,我们将详细探讨每个步骤。

第一步:需求分析





在需求分析阶段,你需要收集并分析现实世界的业务信息和策略。


以下是此阶段的主要任务:
- 识别数据中的基本对象以及这些对象之间的关系。例如,在图书馆场景中,人借阅书。
- 识别与这些对象相关的信息,这些信息将用于与对象交互。对于一本书,这可能是标题、描述、ISBN和作者。对于一个人,这可能是姓名、地址和联系方式。


获取这些信息的方法因项目而异,但通常包括:
- 审查任何现有的数据存储,无论是在数据库、其他电子格式还是纸质系统中。
- 采访用户,了解业务当前如何使用这些数据。
- 采访用户和潜在用户,确定业务如何能更好地利用这些数据。
如果数据当前存在于数据库中,在审查现有结构时,请务必将其作为数据信息的来源,而不是作为你自己数据库设计的起始模板。

需求分析的输出可以是一份报告、一张数据图或一份演示文稿,你可以与利益相关者分享以验证你对系统的理解。
第二步:逻辑设计




在逻辑设计阶段,你将分析阶段确定的需求映射为实体、属性和关系。但请注意,逻辑模型不应指定任何技术要求,因此在此阶段不应考虑任何实现细节。

上一阶段识别的对象将成为实体。通常,实体是人、事件、地点或事物。如果你发现一个对象不属于这些类别之一,应仔细检查它是否真的是一个对象,而不是另一个对象的特征。




对象的特征将成为属性。因此,书对象成为书实体,人对象成为人实体。

在此阶段,你还应考虑实体的属性。你可能会认为一个人有一个名字,但在数据库术语中,最好将其视为有名和姓。这使得按名或姓进行搜索和排序变得更加容易。虽然需求分析确定了一个人有地址,但在考虑存储该地址时,应将其分解为组成部分。


在分析需求时,你识别出“一个人借阅一本书”。然而,一个人可能借阅多本书,一本书也可能被多个人借阅。因此,这是一个多对多关系,这可能导致数据库中的歧义。
解决此问题最简单的方法是通过在现有实体之间引入一个关联实体,创建两个独立的一对多关系。在书到人的场景中,你可以添加一个借阅实体。一个人可以有多笔借阅记录,一本书可以被借阅多次。借阅实体将包含来自书表和人表的属性,以及一些借阅特有的属性。


你可以通过匹配的属性来关联这些实体。然而,在书实体中,这些属性都不能保证是唯一的。ISBN将是唯一的,因此你可以将其用作主键。然后,你可以在借阅实体中使用ISBN而不是书名来标识借阅的书籍。在人实体中没有唯一属性,因此你可以向该实体添加一个标识符属性,并使用该属性将借阅与人关联起来。你还可以向借阅实体添加一个借阅ID,以唯一标识每笔借阅。







现在你有了实体和属性的视图,可以考虑规范化。大多数OLTP系统会规范化到第三范式以获得最佳事务性能,而OLAP系统通常会反规范化以增强读取性能。



为了遵循第一范式,你需要消除在一本书的作者属性中列出两个或更多作者姓名的可能性。一种选择是将其拆分为作者一和作者二属性。然而,这无法保证一本书的最大作者数量,并且不符合第二范式。因此,更好的方法是创建一个单独的作者实体,并与书实体建立多对一关系。

当你完成实体的规范化后,就可以进入物理设计阶段,规划数据库的实际形态。



第三步:物理设计

在此阶段,你可以开始考虑所选数据库管理系统对你的设计产生的影响。例如,它支持的数据类型、实现的命名规则以及支持的索引和约束。在考虑命名规则时,你还应考虑实施自己的命名约定,以便任何处理你数据的人都能理解你的模式。

因此,逻辑设计中的人实体将在物理设计中成为人表,每个属性成为一个有类型的列,并定义好键。







你可以使用ERD设计器来创建你的实体关系图。例如,pgAdmin包含一个ERD工具,你可以在其中设计ERD,然后生成一个SQL脚本,该脚本将根据你的设计创建数据库和对象。
总结 📝


本节课中,我们一起学习了数据库设计的关键知识。我们了解到,在开始实施之前投入时间设计数据库非常重要。数据库设计包含三个阶段:需求分析、逻辑设计和物理设计。使用ERD设计器可以简化设计过程。

浙公网安备 33010602011771号