Insights·2026-09-15

关系型数据库是什么 — 拆成表,用键相连

关系型数据库的形状,就是把多张表格用键连起来的电子表格。一张表就是一个 table,最上面一行是列名,下面每一行是一条数据。把表连起来的值叫外键,唯一标识每一行的值叫主键。事先钉住表的形状叫模式,让数据库做事的语句叫查询。PostgreSQL 是其中的代表产品。

표를 나누고 외래 키로 잇는다 — 글의 요약 도식

为什么一张表格不够用

假设你经营一家漫画租借店。你需要会员名册,需要在库漫画清单,还需要谁在什么时候借了什么、什么时候还的记录。

这些能全塞进一张表格吗?硬塞是能塞,但很快就没法用了。左边一块放会员、中间放书、往下从某一行开始放借阅记录,这样是管不下去的。

所以要拆成多张表。会员放会员表,书放书表,借阅记录放另一张表,然后把它们连起来。「这位会员借了这本书」这件事,写成连接两张表的形式。

关系型数据库正是这个形状。名字里的「关系」指的就是这些连接。

表、行、列,以及键

一张表叫 table,相当于电子表格里的一张工作表。

最上面一行放列名:编号、姓名、联系方式之类。下面每一行堆一条数据。一位会员一行,一本书一行。

接下来是连接。假设会员表里某位会员的编号是 1。在借阅记录表上设一个会员编号列,在那里写 1,就表达了这条借阅属于这位会员。这种指向别的表的值叫外键。

还需要一个能唯一标识每一行的值,比如会员表的编号,永不重复。这叫主键。外键归根结底指向的就是另一张表的主键。

三张表用键相连
members            books              loans
─────────────      ─────────────      ──────────────────────
id  name           id  title          id  member_id  book_id
1   金敏秀          7   灌篮高手 1     1   1          7
2   李书妍          8   灌篮高手 2     2   1          8
                                       3   2          7

loans.member_id 是指向 members.id 的外键
loans.book_id   是指向 books.id   的外键

模式很死板,也正因此稳定

对比展示模式的僵硬与稳定:日后改列要改动已存数据,但不符合既定格式的值根本无法写入。

表的形状叫模式:有哪些列、每一列能放什么形态的值,都事先定好。

定得相当细。这一列只能放数字,那一列文字最多多少个字,这个值不能为空,那个值之间不能重复。

它死板。以后要加一列或改形态,就得处理已经存进去的数据。作为交换,它稳定:不合规定形态的值一开始就进不来。

所以「一份数据该拆成几张表、怎么连」本身就是一门专业。服务做大了,会有人专职负责这份设计。同样的数据,拆法不同,后面是扛得住还是扛不住就分岔了。

查询,以及非关系型的那些

查询对数据库下达的四件事:取值、写入、修改、删除。

让数据库做事的语句叫查询。取值、写入、修改、删除都靠这些语句下达。

名字里带 SQL 的产品全都说这套语句。PostgreSQL 就是其中之一,在氛围编程项目里经常遇到。语句长相大体相似,学会一种在别的产品上也通用。

如今直接在代码里写查询的情况少了。中间替你生成查询的工具已经很成熟,在上一篇讲的后端代码里把数据形态定义好,查询就由它来写。

也有非关系型的种类。把每一项整个当作一份文档来存的文档型,适合形态经常变的数据。只存「什么与什么相连」的图型也有。不过网页服务的默认依然是关系型。下一篇看不放进这些表里的东西,图片和视频放在哪里。

查询长什么样
SELECT title FROM books WHERE id = 7;

INSERT INTO loans (member_id, book_id) VALUES (1, 7);

UPDATE members SET name = '金敏秀' WHERE id = 1;

DELETE FROM loans WHERE id = 3;