第一节课程
15445 讲的是如何实现数据库系统,而不是如何使用数据库编写应用。
15445 由 Andy Pavlo 教授主讲,Andy 曾说过:“这个世界我只在乎两件 事,一是我的老婆和女儿,二就是数据库。”
这门课程的公开程度非常高,外校学生也能访问到所有的课程资料。这门课程的课件、作业、实验、考试、录播视频、讲义、讨论区等等都是公开的。各类资源链接请看 Overview
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);
可以看到,ArtistAlbum 表中的 artist_id 和 album_id 分别是 Artist 和 Album 表的外键。使用外键的一个好处是当我们删除 Artist 或 Album 表中的一条记录时,ArtistAlbum 表中对应的记录也会被删除。同时,外键也可以保证数据一致性,即 ArtistAlbum 表中的 artist_id 和 album_id 必须是 Artist 和 Album 表中已经存在的 id。
但同时,外键也会带来一些问题,例如性能问题。在大型数据库中,外键的检查可能会导致性能下降。因此,开发某些应用时,可以不选择使用外键或者不启用外键约束,而是在应用层面进行约束。