数据持久化与数据库
7.1 数据存储演进
Tip
理解数据持久化的核心概念,学会根据数据的重要性选择正确的存储方式。
1. 为什么要学这个?
你做了一个记账App。用户兴致勃勃地记了一笔:"早餐 10元"。
他刷新页面,数据没了。
他问你:"我的记录呢?" 你解释:"服务器重启了一下,内存清空了。"
用户直接卸载了你的App——数据丢失,比功能不好用更致命。
2. 核心概念
📝 核心比喻:将数据存储比作**"记事情"**的三种境界。
2.1 内存 (Memory) —— 黑板
- 实质:程序的变量 (
const data = [])。 - 特点:读写极快,但依赖通电。
- 结局:老师一来(服务器重启),黑板擦一抹全没了。
2.2 文件 (File) —— 笔记本
- 实质:JSON 文本文件 (
data.json)。 - 特点:断电数据还在(持久化)。
- 缺陷:
- 💥 并发冲突:两个人同时拿一支笔在一张纸上写字,字会重叠。
- 🐢 查询极慢:想找"去年3月"的一条记录,得从第一页翻到最后一页。
2.3 数据库 (Database) —— 智能档案柜
- 实质:PostgreSQL / MySQL。
- 能力:
- 🚦 并发控制:像交警指挥交通,1000个人同时写也不会乱。
- ⚡ 极速索引:像字典目录,百万条数据也能毫秒级查到。
技术定义:持久化 (Persistence) 是指将数据从易失性存储(内存)转移到非易失性存储(硬盘)的过程。数据库是专门为数据持久化和高效查询设计的系统。
技术演进图
graph TD
subgraph Level1 [Level 1: 内存变量]
A["const users = []"] --> B[速度最快]
A --> C[断电即空]
end
subgraph Level2 [Level 2: JSON文件]
D["users.json"] --> E[数据持久]
D --> F[并发冲突]
D --> G[查询慢]
end
subgraph Level3 [Level 3: 数据库]
H[PostgreSQL] --> I[数据持久]
H --> J[高并发]
H --> K[查询快]
end
style Level1 fill:#ffebee
style Level2 fill:#fff3e0
style Level3 fill:#e8f5e9
3. 适用场景
| 🏷️ 存储方式 | 🎯 什么时候用 | 🏢 典型例子 |
|---|---|---|
| 内存 | 临时数据,丢了也不心疼 | 验证码、当前登录状态 |
| 文件 | 个人配置,没人跟你抢着写 | VS Code配置、以太坊钱包Keystore |
| 数据库 | 生产环境,数据是资产 | 用户信息、订单、文章 |
4. 避坑指南
| ❌ 不要这样做 | ✅ 应该这样做 | 💡 为什么 |
|---|---|---|
把用户数据存在users.json里 |
使用 PostgreSQL/MySQL | 文件锁会导致并发写入失败,数据丢失 |
| 在循环里频繁读写文件 | 使用数据库的批量插入 | 磁盘IO极其昂贵,文件操作没有Buffer缓冲优化 |
| 以为数据库不会坏 | 每日自动备份 | 硬盘有寿命,人为操作有失误 |
5. 真实案例
Story
1998年,玩具总动员2的删除灾难
皮克斯的一位动画师误运行了删除命令 rm -rf *。几秒钟内,90%的电影源文件(胡迪、巴斯光年的3D模型)从服务器上消失了。更绝望的是,公司的备份磁带系统正好坏了。就在项目面临夭折时,技术总监 Galyn Susman 想起:她为了在家照顾宝宝,在家里电脑上拷贝了一份完整项目文件。这台普通的家用电脑,拯救了价值数亿美元的电影。
Vibe心法:数据是公司的命根子——永远要有备份,永远不要相信单一的存储系统。
6. 本章小结
- 💾 内存不可靠:永远假设服务器下一秒就会崩。
- 🔒 文件有瓶颈:JSON 文件只适合个人玩具项目。
- 🛡️ 敬畏数据:代码可以重写,数据丢了就是公司倒闭。