数据库是什么?
数据库是存储在计算机上、经过组织的数据集合,让程序能够快速、安全地查找、添加、修改和删除数据。它由一种叫作数据库管理系统(DBMS)的软件来管理,比如 PostgreSQL、MySQL、SQLite 或 MongoDB。
更新于 2026年9月24日
当你登录一个网站时,网站需要在几百万个账号中找到你的账号,核对密码并加载你的设置,而这一切都要在几毫秒内完成。它不会打开一个文本文件逐行读取,而是向数据库发送 SELECT * FROM users WHERE email = 'ana@example.com' 这样的请求,数据库借助索引直接跳到正确的那一行,就像书末的索引一样。
数据库是如何工作的
两个部分协同工作。数据库是数据本身,按照固定的结构组织。数据库管理系统(DBMS)是把这些数据存进文件、保证数据一致并响应请求的程序。PostgreSQL、MySQL 和 SQLite 都是 DBMS;而你的客户名单就是数据库。
在关系型数据库中,数据存放在表里。每张表有列(姓名、国家、积分)和行(每个用户一行)。一个请求会经过以下步骤:
- 你的程序发送一条查询,通常用 SQL(结构化查询语言)编写。
- DBMS 解析这条查询,并规划如何作答:需要读取哪些表,能否借助索引跳过大部分行。
- 它以固定大小的页从磁盘读取数据(SQLite 默认每页 4,096 字节,PostgreSQL 为 8 KB),并把常用的页保留在内存中。
- 它对行进行筛选、排序和合并,然后返回结果。
Python 自带 SQLite,所以你可以直接在这里运行一个真正的数据库:
Kenji 340
Omar 340
Ana 120
users: 4 average points: 222.5
程序从来没有说明要怎么搜索。它只描述想要的结果,由 DBMS 决定如何得到它。这就是查询数据库和对列表写循环之间最主要的区别。
数据库的类型
| 类型 | 数据的存储形式 | 示例 | 典型用途 |
|---|---|---|---|
| 关系型(SQL) | 由行和列组成、通过键相互关联的表 | PostgreSQL、MySQL、SQLite、Oracle、SQL Server | 用户、订单、支付:大多数应用 |
| 文档型 | 类似 JSON 的文档 | MongoDB、Firestore、CouchDB | 字段因记录而异的数据 |
| 键值型 | 通过一个键查找的值 | Redis、DynamoDB | 缓存、会话、计数器 |
| 宽列型 | 列可灵活变化、分布在多台服务器上的行 | Cassandra、HBase | 极高的写入量 |
| 图数据库 | 节点以及节点之间的关系 | Neo4j | 社交网络、推荐系统 |
| 时序数据库 | 按时间索引的测量值 | InfluxDB、TimescaleDB | 监控指标、传感器读数 |
| 向量数据库 | 数字列表(嵌入向量) | pgvector、Pinecone、Milvus | AI 功能中的相似度搜索 |
所有非关系型的数据库常被统称为 NoSQL。关系型数据库仍然是大多数应用的默认选择,因为表、约束和 SQL 能很好地解决各种各样的问题。很多产品还会把不同类型结合起来:PostgreSQL 可以存储 JSON 文档,pgvector 又为它加上了向量搜索。
事务:要么全部成功,要么全部不做
把钱从 Ana 转给 Ben 需要两处修改:给 Ben 加钱,从 Ana 扣钱。如果程序在两步之间崩溃,钱就会凭空多出来。事务把多处修改打包在一起,要么全部保存,要么一个都不保存。在下面的例子中,第二处修改违反了一条规则(余额不能低于零),所以数据库把第一处修改也撤销了:
transfer 30 done
{'ana': 20, 'ben': 30}
transfer 40 failed: CHECK constraint failed: balance >= 0
{'ana': 20, 'ben': 30}
给 Ben 加上的 40 又被收了回去,所以总数仍然对得上。关系型数据库为事务承诺了四个特性,合称 ACID:原子性(要么全做,要么全不做)、一致性(CHECK 之类的规则始终成立)、隔离性(两个用户同时执行事务时,看不到对方做到一半的修改)和持久性(修改一旦保存,即使崩溃或断电也不会丢失)。
数据库、电子表格和文件的区别
| 文本或 CSV 文件 | 电子表格 | 数据库 | |
|---|---|---|---|
| 数据规模 | 取决于程序能加载多少 | Excel 每个工作表 1,048,576 行 | 数十亿行 |
| 多人同时写入 | 不支持 | 有限支持 | 支持,依靠锁和事务 |
| 查找一条记录 | 读取整个文件 | 筛选或搜索 | 通过索引查找 |
| 数据规则 | 没有 | 可选的数据验证 | 类型、约束、外键 |
| 查询数据 | 自己写代码 | 公式 | SQL 或查询 API |
电子表格很适合一个人查看几千行数据。一旦有多个程序或用户同时写入数据,或者数据必须遵守规则,数据库才是合适的工具。
数据库如何保护数据
DBMS 在改动数据文件之前,会先把每一处修改写入日志(预写式日志),所以崩溃之后可以重放或撤销未完成的工作。PostgreSQL 可以为每个 8 KB 的页存储一个校验和,当故障硬盘返回损坏的数据时报告校验失败。用户和权限决定谁可以读取或修改哪些表,复制机制则在其他服务器上保留数据副本。程序还必须以参数的形式传入用户输入,就像上面的 ? 占位符那样,绝不能把它直接拼接进 SQL 文本,否则就会遭到 SQL 注入攻击。
常见误解
- “SQL 就是数据库。” SQL 是一种语言。PostgreSQL、MySQL 和 SQLite 是能理解这种语言的数据库。
- “NoSQL 就是完全不用 SQL。” 这个词通常被理解为“不仅仅是 SQL”,而且有几种 NoSQL 数据库的查询语言看起来很像 SQL,比如 Cassandra 的 CQL。
- “数据库一定是一台大服务器。” SQLite 只是一个文件,程序直接打开它即可,根本不需要服务器。每部 Android 和 iOS 手机里都运行着它。
- “数据放进数据库就永远安全了。” 数据库能防范崩溃,却防不了有人误执行
DELETE。备份仍然必不可少。
下一步学什么
SQL 课程从第一条 SELECT 开始教你写查询。SQLite 文档介绍了接下来的内容:SQLite 是什么、创建表、索引以及防止 SQL 注入。想了解数据在磁盘上是如何排布的,可以阅读字节是什么;校验和则解释了如何发现损坏的页。
常见问题
用简单的话说,数据库是什么?
数据库是程序存放信息的地方,让它之后能快速找回这些信息。可以把它想象成一个带有完美索引的文件柜:你要“上周的所有订单”,即使有几百万条记录,也能在几毫秒内拿到答案。
数据库有哪些例子?
你手机里的联系人就存储在数据库中:Android 和 iOS 都自带 SQLite。银行把客户账户保存在 Oracle 或 PostgreSQL 这样的数据库里,维基百科则把文章存储在 MariaDB 中。网店把商品、顾客和订单保存在相互关联的表里。
数据库有哪四种类型?
并没有官方规定的四种。最常被提到的四种是:关系型数据库(表和 SQL)、文档数据库(类似 JSON 的记录)、键值存储(通过键查找值)和图数据库(节点和关系)。较老的教材还会列出层次型数据库和网状数据库。
最常用的 5 种数据库是哪些?
多年来,Oracle、MySQL、Microsoft SQL Server、PostgreSQL 和 MongoDB 一直占据 DB-Engines 流行度排行榜的前五名。在开发者中,自 2023 年起 PostgreSQL 一直是 Stack Overflow 开发者调查中使用最多的数据库;而 SQLite 是部署最广泛的数据库,因为手机和浏览器里都内置了它。
数据库和 DBMS 有什么区别?
数据库是数据本身,以表或文档的形式组织起来。DBMS 是把这些数据存到磁盘上并响应数据请求的软件,比如 PostgreSQL 或 MySQL。人们经常把两者都叫作“数据库”。
使用数据库必须学 SQL 吗?
对于关系型数据库来说,是的:你要用 SQL 来创建表、查询数据,而它的基础只需几天就能学会。很多程序会使用替你生成 SQL 的库,但懂 SQL 能让你更容易理解这个库在做什么,以及某个查询为什么慢。