跳到主要内容

第一节课程

15445 讲的是如何实现数据库系统,而不是如何使用数据库编写应用。

15445 由 Andy Pavlo 教授主讲,Andy 曾说过:“这个世界我只在乎两件事,一是我的老婆和女儿,二就是数据库。”

这门课程的公开程度非常高,外校学生也能访问到所有的课程资料。这门课程的课件、作业、实验、考试、录播视频、讲义、讨论区等等都是公开的。各类资源链接请看 Overview

Course Logistics

data models

  • Relational 关系型,例如 MySQL, PostgreSQL
  • NoSQL 非关系型,例如 MongoDB, Cassandra
    • Key/Value KV 数据库,例如 Redis
    • Graph 图数据库,例如 Neo4j
    • Document/Object 文档数据库,例如 MongoDB
    • Wide-Column/Column-Family 列数据库,简单来说就是按列存储的数据库,例如 Cassandra
  • Array/Matrix/Vectors 向量数据库,常用于 AI/ML 领域
  • Legacy 遗留数据库, 指一些早期的数据库系统,已经过时了
    • Hierarchical 层次数据库
    • Network 网络数据库
    • Multi-Value 多值数据库

术语

以下是一些基本的术语,在同一行的术语是同义词:

  • database, schema 数据库,模式
  • relation, table 关系,表
  • tuple, row, record 元组,行,记录
  • attribute, column, field 属性,列,字段

主键

一些 DBMS 会自动创建一个内部主键,一般为自增主键。

  • SEQUENCE (SQL:2003)
  • AUTO_INCREMENT (MySQL)

外键

当涉及到一对多或者多对一的关系时,我们可以使用外键实现。

我编的一个 SQL 示例
MariaDB
create table Artist
(
id integer auto_increment primary key,
name text,
year integer,
country text
);

create table Album
(
id integer auto_increment primary key,
name text,
year integer
);

insert into Artist (name, year, country)
values ('Wu-Tang Clan', 1992, 'USA'),
('Notorious B.I.G.', 1994, 'USA'),
('GZA', 1990, 'USA');

insert into Album (name, year)
values ('Enter the Wu-Tang (36 Chambers)', 1993),
('Liquid Swords', 1995),
('Ready to Die', 1994);

create table ArtistAlbum
(
artist_id integer,
album_id integer,
primary key (artist_id, album_id),
foreign key (artist_id) references Artist (id),
foreign key (album_id) references Album (id)
);

insert into ArtistAlbum (artist_id, album_id)
values (1, 1),
(1, 2),
(3, 2),
(2, 3);

foreign key

可以看到,ArtistAlbum 表中的 artist_id 和 album_id 分别是 Artist 和 Album 表的外键。使用外键的一个好处是当我们删除 Artist 或 Album 表中的一条记录时,ArtistAlbum 表中对应的记录也会被删除。同时,外键也可以保证数据一致性,即 ArtistAlbum 表中的 artist_id 和 album_id 必须是 Artist 和 Album 表中已经存在的 id。

但同时,外键也会带来一些问题,例如性能问题。在大型数据库中,外键的检查可能会导致性能下降。因此,开发某些应用时,可以不选择使用外键或者不启用外键约束,而是在应用层面进行约束。