数据持久化与数据库
7.2 关系型数据库基础
Tip
理解关系型数据库(RDBMS)的基本结构,学会用"表格"思维来组织数据。
1. 为什么要学这个?
你用 Excel 记录客户信息。一开始只有100人,很爽。
后来变成了10万人。你打开文件要卡5分钟。
更要是命的是,张三在第一行填了"13800000000",李四在第1000行也填了一模一样的手机号。你的 Excel 没有任何提示。当你给客户发短信时,张三收到了两条。
学会数据库,就像给你的数据装上了智能防撞系统,任何重复、错误的数据在录入的瞬间就会被拦截。
2. 核心概念
📝 核心比喻:关系型数据库 = "严谨版"的超级 Excel。
2.1 基础结构 (Structure)
想象一个 data.xlsx 文件:
- Table (表):就是 Excel 里的 Sheet 工作表。
- 例如:一张名为
Users的 Sheet。
- 例如:一张名为
- Column (列/字段):就是第一行的 表头 (Header)。
- 它定了规矩:这一列只能填什么。比如
age列只能填数字,填"十八岁"就会报错。
- 它定了规矩:这一列只能填什么。比如
- Row (行/记录):就是实实在在的 填入数据。
- 一行代表一个真实用户。
2.2 关键约束 (Constraint)
Excel 允许你随便写,数据库不行:
- Primary Key (主键):数据的 身份证号。
- 通常叫
id。绝对唯一,绝对不能为空。张三和李四可以同名,但 ID 绝对不同。
- 通常叫
- Foreign Key (外键):表与表之间的 连接线。
- 比如"订单表"里有一列
user_id,它指向"用户表"的id。 - 这就是 "关系型" (Relational) 的由来——数据不是孤立的,是互相关联的。
- 比如"订单表"里有一列
技术定义:关系型数据库 (RDBMS) 是基于关系模型来组织数据的数据库。通过Schema (模式) 定义表结构,通过 SQL 语言进行操作。
关系结构图
erDiagram
User ||--o{ Post : "作者 (写了)"
User {
int id PK "主键 (身份证)"
string email "邮箱 (唯一)"
string name "姓名"
}
Post {
int id PK "主键"
string title "标题"
int author_id FK "外键 (指向User)"
}
3. 对照理解
| 🏷️ 概念 | 📊 对应 Excel | 📝 例子 |
|---|---|---|
| Database | 整个 .xlsx 文件 |
你的电商系统数据库 |
| Table | Sheet1 工作表 |
用户表 (Users) |
| Column | 表头 (A列, B列...) | 姓名, 手机号, 余额 |
| Row | 第2行, 第3行... | 张三, 138xxx, 100元 |
| Schema | 数据验证规则 | "手机号"列不允许重复 |
4. 避坑指南
| ❌ 不要这样做 | ✅ 应该这样做 | 💡 为什么 |
|---|---|---|
| 用"姓名"做主键 | 必须有一个 id 字段 |
名字会重复,身份证号(ID)才不会。一旦重名,系统就分不清谁是谁了。 |
| 时间存成字符串 "2024-01-01" | 使用 Timestamp 类型 |
字符串没法计算"3天前"。用专业的时间类型才能做日期运算。 |
以为 NULL 就是 0 |
理解 NULL 是"未知" |
0 是一个数字,NULL 是"这里什么都没有"。填错了会导致统计数据偏差。 |
5. 真实案例
Story
2020年,英国防疫表格溢出事故
2020年10月,英国公共卫生部 (PHE) 发现新冠确诊病例统计少了 16,000 例。原因令人窒息:他们竟然用 Excel (.xls 老格式) 来汇总全国数据。老版 Excel 最大只支持 65,536 行。当确诊病例超过这个数时,多出来的数据直接被截断丢弃了,没有任何报错。这导致1.6万名确诊者没有被及时追踪隔离。
Vibe心法:不仅要选对工具,还要懂工具的极限——Excel 的上限是行数,数据库的下限是规范。
6. 本章小结
- 📏 无规矩不成方圆:数据库强制要求定义每一列的类型,防止垃圾数据混入。
- 🔑 身份证不能丢:每一行数据都必须有唯一的
id(主键)。 - 🔗 万物皆有关联:通过外键 (Foreign Key) 把用户、订单、文章连成一张大网。