数据库系统概述
数据库(Database, DB)是持久化存储和管理数据的系统——相比文件系统,它提供了高效查询、并发控制、故障恢复、数据一致性等能力
📱 你的微信聊天记录存在哪里?
想想这个问题——你和室友的几千条微信聊天记录、朋友圈照片、微信支付的每一笔账单,它们都存在哪里?
你可能会说:“存在手机里啊。”
但再想深一层:你换手机时,聊天记录是怎么”跟”过来的?为什么你发了一条朋友圈,所有好友都能立刻看到?为什么微信支付转账时,不会出现”你的钱扣了但对方没收到”的情况?
答案就是——数据库(Database)。
微信的后台有一大堆数据库在为你服务:聊天记录存一个库,朋友圈存一个库,支付记录存一个更特殊的库。它们做的事情本质上就是一件事——可靠地存数据,高效地取数据。
📁 如果不用数据库——用文件行不行?
最直接的方案:把数据存到文件里。
你自己写个 Python 脚本,把聊天记录存成 chat.txt:
张三, 2026-06-13, 今晚吃啥?
李四, 2026-06-13, 去食堂吧
张三, 2026-06-13, 行
刚开始用着还行,但很快你就会遇到几个让人崩溃的问题:
问题一:查数据太慢
想找你和室友聊过的所有”食堂”相关消息——你得把文件从头到尾读一遍。消息少还好,当文件变成几千万行时(微信的用户量级),一次搜索可能等好几分钟。
问题二:多人同时写会打架
你和室友同时往聊天文件里写消息:
- 你读到了文件末尾,准备写”行”
- 室友也在同一时刻读到了末尾,准备写”没问题”
- 你写完了,室友盖掉了你的内容 → 消息丢了
这就是并发写入冲突——两个程序同时修改一个文件时,后写的会把先写的覆盖掉。
问题三:写到一半断电了
你在写一条重要的聊天记录,写到一半手机没电关机了——重启后发现文件损坏了,里面有一半数据是乱码。
问题四:数据没有一致性保障
你用 Excel 管理课表:
学号 姓名 课程 成绩
001 张三 数据结构 85
001 张三 操作系统 92
002 李四 数据结构 78
注意——张三的名字在每个选课记录里都存了一遍。如果张三改名字了,你得把所有包含张三的行都找出来改一遍。改漏了,数据就不一致了。
🏫 类比:文件柜 vs 档案管理系统
文件系统就像宿舍里每个人自己的一堆笔记本——各自写各自的,互不通气,你要找信息得自己翻遍所有本子。
数据库就像学校的教务管理系统——你只要说”查张三的成绩”,系统就在海量数据中瞬间找到,而且保证不管多少人同时查,信息都是准确一致的。
🏗️ 数据库是怎么解决这些问题的?
数据库(Database)是一个专门的软件系统,它把”存数据”这件看似简单的事做到了极致。核心思路是:
- 数据按结构组织——不是随便往文件里塞,而是按”表”的方式组织(下一节详述)
- 查询通过索引加速——像书的目录一样,不需要从头翻到尾
- 并发用锁和版本控制——多人同时写数据也不会冲突
- 崩溃有日志保护——写到一半断电,重启后能恢复
- 一致性用约束保证——数据不会出现自相矛盾
管理数据库的软件叫做数据库管理系统(Database Management System, DBMS)——简称”数据库软件”。我们平常说的”MySQL”、“PostgreSQL”、“SQLite”都属于 DBMS。
📊 核心概念——先认识四个
这一节只介绍四个最核心的概念,其他的在后面慢慢展开:
1. 表(Table)
数据库把数据组织成”表”——和 Excel 表格非常像:
┌──────┬────────┬────┬───────────┐
│ 学号 │ 姓名 │ 年龄 │ 班级 │
├──────┼────────┼────┼───────────┤
│ 001 │ 张三 │ 20 │ 计科1班 │
│ 002 │ 李四 │ 21 │ 计科2班 │
│ 003 │ 王五 │ 19 │ 计科1班 │
└──────┴────────┴────┴───────────┘
- 行(Row)」也叫「记录(Record)」——一行就是一条完整的数据。比如上面的一行就是”一个学生的全部信息”。
- 列(Column)」也叫「字段(Field)」——一列就是数据的一个属性。学号、姓名、年龄各是一列。
2. 主键(Primary Key)
每一行数据需要一个唯一标识——就像每个人有身份证号一样。
在上面的学生表中,“学号”就是主键:每个学生有唯一的学号,不会出现两个学号相同的学生。
如果没有主键会怎样?想象学校里有两个人同名同姓都叫”张三”——想查其中一个人的成绩时,数据库不知道该返回谁的数据。
3. 索引(Index)
索引是用来加速查询的数据结构。它和书的目录的原理完全一样:
你要在一本《计算机组成原理》里找到”流水线”这个词的讲解位置——没有目录的话你得翻遍整本书;有目录的话你直接翻到对应页码。
数据库的索引也类似:没有索引时查一个学生信息可能要扫描整个表(几百万行),有索引时瞬间定位到目标行。
索引的具体原理后面会专门讲(B+ 树索引和哈希索引),现在你只需要知道它是”加速工具”就够了。
4. 外键(Foreign Key)
外键用来表达表之间的关联。比如”成绩表”里想引用”学生表”中的某个学生——就在成绩表里存这个学生的学号。
学生表:学号(主键)│姓名│年龄
↑
成绩表:成绩ID│学号(外键)│课程│分数
这样就不需要在成绩表里重复存一遍学生姓名了。外键就是”引用另一张表的某一行”的机制。
🌲 数据库的主要类型
数据库不只一种。根据数据组织方式的不同,分为几种主要类型:
| 类型 | 数据模型 | 就像 | 代表产品 |
|---|---|---|---|
| 关系型(Relational) | 表(行列结构) | Excel 表格集合 | MySQL, PostgreSQL, SQLite |
| 文档型(Document) | JSON 文档 | 每个人的档案袋 | MongoDB |
| 键值型(Key-Value) | 键→值映射 | 字典/储物柜 | Redis, DynamoDB |
| 列族型(Wide-Column) | 列族 | 电子表格按列拆分存储 | Cassandra |
| 图数据库(Graph) | 节点+边 | 社交网络关系图 | Neo4j |
本书主要聚焦在关系型数据库——这是最经典、最广泛应用的类型。学完关系型数据库后,在最后一节会专门介绍其他类型(NoSQL 数据库概述)。
💡 一个常见的困惑:“关系型”(Relational)这个”关系”是什么意思?它来自数学上的”关系”(Relation)概念——简单理解就是”表”。所以关系型数据库 = 基于”表”来组织数据的数据库。后面的关系模型会深入讲解这一点。
💭 数据库在计算机体系中的位置
到现在为止,你已经学习了:
- 文件系统——操作系统管理磁盘数据的方式
- 各种硬件(磁盘、内存)
数据库建立在文件系统之上,但是做了文件系统不做的事情:
应用程序
↓ (发送 SQL 查询)
数据库管理系统(DBMS)
↓ (读写文件、管理索引、控制并发、记录日志)
操作系统文件系统
↓ (物理读写)
磁盘 / SSD
没有数据库的话,每个应用程序都要自己处理并发控制、崩溃恢复、查询优化等问题——工作量巨大而且容易出错。数据库把这些功能统一做好,所有应用程序直接”拿来用”。
📝 小结
今天要记住的关键概念:
| 概念 | 一句话 |
|---|---|
| 数据库(Database) | 存储和管理数据的系统,解决文件系统的四大问题 |
| 表(Table) | 数据按行列组织的基本单位 |
| 行(Row) | 一条完整的记录 |
| 列(Column) | 数据的一个属性/字段 |
| 主键(Primary Key) | 唯一标识每一行的”身份证号” |
| 索引(Index) | 加速查询的”目录” |
| 外键(Foreign Key) | 引用其他表某行的”指针” |
为什么先学这个? 了解数据库要解决什么问题、基本概念后,下一步开始学习如何”设计”数据库——实体关系模型(ER)教你用图形化的方式画出数据的结构,是数据库设计的第一步。