Chapter 1 无处不在的数据库:从手机APP到互联网巨头的“数据记忆体” / The Ubiquitous Database: The "Data Memory" Behind Mobile Apps and Internet Giants
早上7点,闹钟响起,你随手打开短视频APP刷10分钟醒神,系统精准推了你昨天看过的奶茶店测评;起床后打开外卖软件,首页自动弹出你常点的咖啡店优惠券;上班路上用打车软件叫车,行程记录自动同步到账户里;中午和同事拼单点外卖,订单详情、配送进度实时更新;晚上和朋友在社交软件聊今天看到的搞笑视频,聊天记录自动备份到云端,就算换手机也不会丢。这些你每天都会经历的、看似再普通不过的数字操作,背后都有一个共同的核心支撑:数据库(Database)。
根据2024年IDC发布的《全球数据圈报告》,全球每天产生的数据量超过2.5艾字节($2.5 \times 10^{18}$字节,相当于50万台256G手机的存储容量),其中90%以上的数据最终都会存储在各类数据库中[^1]。从你手机里的一条便签,到互联网巨头支撑双十一每秒数十万下单请求的分布式集群,数据库是数字世界最底层的“记忆体”,默默记录着所有的数字行为。
<!-- 标签:数据库入门 日常场景 存储对比 -->
1.1 你的24小时,都被数据库悄悄记着 / Your 24 Hours, Secretly Recorded by Databases
很多人对数据库的第一印象是“程序员用的高大上工具”,但实际上,你的数字生活早就和数据库深度绑定。我们可以把一天里的数据库交互拆解成几个典型场景:
1.1.1 内容消费场景:短视频、资讯、音乐的推荐逻辑
你刷短视频时觉得“算法太懂我”,本质上是数据库在支撑个性化推荐:APP会把你每一次点赞、收藏、评论、停留时长都写入用户行为数据库,推荐系统会实时查询这些数据,结合你的历史偏好,从内容库数据库里筛选出你最可能感兴趣的内容推送给你。如果没有数据库的高效存储和查询能力,你每次打开APP都要等几分钟才能加载出内容,更不用提“精准推荐”了。
```mermaid sequenceDiagram participant 用户 User participant APP客户端 APP Client participant 应用服务器 Application Server participant 数据库集群 Database Cluster 用户->>APP客户端: 打开短视频APP,滑动刷新 APP客户端->>应用服务器: 请求推荐内容,携带用户ID 应用服务器->>数据库集群: 1. 查询用户近7天的浏览/点赞/收藏记录<br>2. 查询内容库的标签、热度数据 数据库集群-->>应用服务器: 返回用户行为数据+候选内容列表 应用服务器->>应用服务器: 推荐算法排序,筛选Top20内容 应用服务器-->>APP客户端: 返回排序后的视频列表 APP客户端-->>用户: 展示短视频feed流 ```
这个流程里,数据库承担了两个核心角色:一是作为用户行为数据库,持久化存储你所有的操作记录;二是作为内容元数据库,存储所有视频的标签、分类、热度等基础信息。整个过程从你滑动刷新到内容展示,通常只需要几百毫秒,背后是数据库的索引(Index)和缓存机制在支撑——如果没有索引,数据库要从数百万条视频里找到匹配你偏好的内容,可能需要几分钟,完全无法满足实时消费的需求。
1.1.2 交易场景:订单、支付、物流的核心支撑
你在电商平台下单买一件衣服,背后至少会触发3次数据库写操作:扣减商品库存、生成订单记录、记录支付流水。如果数据库没有事务(Transaction)能力来保证这些操作的原子性,就可能出现“扣了库存但订单没生成”“付了钱但订单没更新”的诡异问题,甚至出现超卖:比如某件商品只剩最后1件,两个人同时下单,数据库如果没有加锁机制,可能会给两个人都显示下单成功,最后商家只能赔钱发货。
2022年某头部生鲜电商在618活动中,因为库存数据库的并发控制逻辑有漏洞,出现了超卖12万份鸡蛋的情况,最后平台不得不赔付近200万元才平息用户投诉。这个案例就是数据库能力不足带来的直接商业损失。
1.1.3 社交场景:聊天、好友、动态的存储逻辑
你发的每一条朋友圈、每一句聊天消息、每一个好友申请,都会先写入社交平台的数据库,再同步到你的其他设备。微信的聊天记录默认会存储在手机本地数据库里,就算你卸载APP重新安装,只要不手动清空,聊天记录依然存在——这就是本地数据库的持久化能力。而如果你开启了云备份,聊天记录还会同步到远程的分布式数据库里,就算手机丢了,换一台新设备登录账号,所有记录都能恢复。
<!-- 📱 电子版侧边栏:互动小测试 --> <!-- 你有没有遇到过APP删了之后重新下载,之前的浏览记录、收藏还在的情况? --> <!-- 这就是因为数据被存在了远程数据库里,和本地APP的存储是分开的。 --> <!-- 你可以试着回忆一下最近一次遇到的这种情况,想想背后的原因。 -->
很多人会好奇:我如果把APP删了,我在平台上的数据会不会一起被删掉?答案是:APP本地的存储数据会被删除,但存在远程数据库里的数据不会。除非你主动申请注销账号,或者平台因为违规被清退,否则你的所有行为数据都会永久存储在平台的数据库里。这也是现在隐私保护法规要求平台明确告知用户数据存储范围的原因。
1.2 你以为的“存数据”,和数据库完全是两回事 / What You Think "Storing Data" Is, Is Completely Different from a Database
很多人会觉得:“存数据还不简单?我用Excel、用txt文本文件就能存,为什么还要专门搞个数据库?” 这个疑问非常正常,我们可以用一个所有人都经历过的场景对比:用Excel记账 vs 用记账APP记账。
假设你用Excel记了3年的账,一共记录了1万条消费记录,现在你要找“2023年所有在奶茶店的消费,金额大于30元”的记录,你需要怎么做?你只能手动筛选年份,再筛选消费场景,再筛选金额,如果数据量再大一点,比如10万条,Excel可能直接卡死。但如果你用的是记账APP,只需要在搜索框里输入关键词,1秒就能得到结果——这就是数据库和普通文件存储的核心区别。
1.2.1 本地文件存储的天然缺陷
本地文件(比如txt、Excel、Word)的本质是“连续存储的字节流”,它天生就不适合做结构化数据的存储和查询,核心缺陷有4个: 1. 查询效率极低:要找一条数据,必须从头到尾遍历整个文件,数据量越大,查询越慢。1万条数据的txt文件查询可能需要1秒,1000万条就可能需要几分钟,完全无法满足互联网场景的需求。 2. 并发能力为零:如果两个人同时修改同一个Excel文件,后保存的人会直接覆盖前一个人的修改,没有任何冲突检测和解决机制。2021年某公司财务用Excel做工资表,两个同事同时修改,导致最后发工资的时候多发了20多万元,就是因为本地文件没有并发控制能力。 3. 数据一致性无保证:没有强制约束,你可以随便修改单元格的内容,甚至可以把“金额”列改成“备注”列,也不会有人提醒你。等你统计的时候才发现数据错了,已经没法挽回了。 4. 持久化能力弱:如果没有手动保存,断电或者程序崩溃,数据就会直接丢失。很多人写文档的时候忘了按Ctrl+S,关掉程序才发现内容没了,就是这个问题。
1.2.2 数据库如何解决这些痛点?
数据库本质上是“专门为结构化数据存储、查询、管理设计的软件系统”,它从底层设计上解决了本地文件的所有缺陷,核心能力可以用ACID四个特性概括[^2]:
- **A(Atomicity,原子性)**:多个操作要么全部成功,要么全部失败,不会出现“一半成功一半失败”的中间状态。比如你下单的时候,扣库存和生成订单要么都成功,要么都失败,不会出现“库存扣了但订单没生成”的情况。
- **C(Consistency,一致性)**:数据必须满足预先定义的规则,比如“订单金额必须大于0”“用户手机号必须是11位数字”,不符合规则的操作会被直接拒绝,从根源上避免脏数据。
- **I(Isolation,隔离性)**:多个用户同时操作数据的时候,互相之间不会干扰。比如两个人同时买最后一件商品,数据库会通过锁机制保证只有一个人能下单成功,不会出现超卖。
- **D(Durability,持久性)**:数据一旦写入成功,就算服务器断电、崩溃,数据也不会丢失。数据库会通过预写日志(WAL)等技术,先把操作记录写到磁盘里,再返回成功,就算中途断电,重启后也能通过日志恢复数据。
<!-- 📖 纸书小知识 --> <!-- 最早的数据库可以追溯到1960年代,当时美国航空航天局为了管理阿波罗登月计划的海量数据, --> <!-- 开发了世界上第一个网状数据库,那时候的数据库体积比现在的房子还大,只能存几MB的数据, --> <!-- 和现在动辄PB级的分布式数据库比起来,简直是天壤之别。 -->
除了ACID特性,数据库还通过索引技术把查询效率提升了几个数量级:你可以把索引理解成书的目录,要找某个内容,不用翻完整本书,直接查目录就能定位到页码。比如你要找手机号是138XXXX1234的用户,没有索引的话数据库要从100万条用户记录里一条条找,可能需要几秒;有了索引的话,只需要几次磁盘查找就能定位到,耗时不到1毫秒。
1.2.3 不同类型数据库的适用场景
很多人以为数据库就是MySQL,实际上现在数据库的种类非常多,不同场景会用不同类型的数据库: | 数据库类型 | 代表产品 | 适用场景 | 典型案例 | | --- | --- | --- | --- | | 关系型数据库(SQL) | MySQL、PostgreSQL | 存储结构化数据,需要强一致性 | 电商订单、用户信息、银行账户 | | 非关系型数据库(NoSQL) | MongoDB、Redis | 存储非结构化/半结构化数据,高并发读写 | 短视频评论、用户点赞、购物车 | | 分布式数据库 | TiDB、OceanBase | 海量数据存储,高并发、高可用需求 | 互联网巨头订单库、支付系统 | | 本地嵌入式数据库 | SQLite、Realm | 端侧存储,数据量小,不需要网络 | 手机便签、微信本地聊天记录 |
比如你刷短视频的评论,数量大、结构不统一(有文字、图片、表情),用MongoDB这种非关系型数据库存储更合适;而你的订单信息需要强一致性,不能出现错漏,所以用MySQL这种关系型数据库存储更安全。没有最好的数据库,只有最合适的数据库,这是数据库选型的核心原则。
1.3 数据库不是互联网巨头的专利:普通人的数据库使用指南 / Databases Are Not Exclusive to Internet Giants: A Guide for Ordinary Users
很多人会觉得:“我又不是程序员,也不是互联网公司的员工,学数据库有什么用?” 实际上,数据库早就从大厂的专属工具,变成了普通人也能用到的效率工具,甚至你已经在无意识中使用过数据库了。
1.3.1 个体开发者/创业者的数据库必修课
如果你是想做个小程序、小APP的个体开发者,或者想做副业的小微创业者,数据库是绕不开的基础工具。比如你想做一个记账小程序,首先就要设计数据库表:用户表存用户的账号信息,账单表存每一笔消费的金额、时间、分类,分类表存消费类别的名称、图标。如果一开始数据库设计不合理,比如把“消费金额”字段设置成了整数,后来发现需要支持小数,或者没有给“用户ID”加索引,用户量上来之后查询账单会变得极慢,这时候再改数据库结构,可能需要把所有历史数据重新迁移,耗时耗力还可能出错。
根据2023年微信小程序的开发者调研,超过60%的小程序开发者因为数据库设计不合理,在用户量破万之后遇到过性能问题,其中近30%的开发者因为不会优化数据库,最终放弃了项目。对于普通开发者来说,不需要掌握数据库的底层源码,只要懂基础的数据库设计原则,就能避免90%的常见问题。
1.3.2 产品/运营的数据库思维
就算你不是开发者,是产品经理或者运营,懂一点数据库也能帮你避免很多不合理的需求。比如运营要做一次618抽奖活动,要求“所有用户都可以参与,中奖名单实时公示”,如果你懂数据库,就会知道“实时公示中奖名单”需要每次查询都扫全表,用户量大的时候数据库会直接崩,正确的做法应该是“每小时更新一次中奖名单”,或者用缓存来扛查询压力。如果不懂数据库,提了不合理的需求,最后要么实现不了,要么花了大量成本优化,效果还不好。
再比如你做用户运营,需要统计“过去30天消费超过100元的用户数量”,如果数据库里没有给“消费金额”和“消费时间”建联合索引,这个统计查询可能需要跑几个小时,等数据出来活动都结束了。懂一点数据库的你,就会提前让开发给这两个字段加索引,查询时间会从几小时缩短到几毫秒。
1.3.3 普通用户的数据库隐私意识
作为普通用户,懂一点数据库的基本逻辑,也能帮你更好地保护自己的隐私。比如很多APP会要求你提供“通讯录权限”“短信权限”,本质上就是想把这些数据上传到他们的数据库里,用于用户画像或者商业分析。如果你知道这些数据会被永久存储在对方的数据库里,就算你卸载APP也不会被删除,就会更谨慎地授权这些敏感权限。
再比如你有时候会遇到“明明已经删除了账号,平台却还是给我发营销短信”的情况,就是因为平台并没有真的删除数据库里的你的数据,只是标记成了“已注销”,依然会用于商业分析。根据2024年工信部发布的《APP个人信息保护监管报告》,近40%的APP存在“注销账号后未彻底删除用户数据”的问题,懂一点数据库逻辑的你,就能更好地维护自己的合法权益。
1.4 本章小结:数据库是数字世界的“基础设施” / Chapter Summary: Databases Are the "Infrastructure" of the Digital World
本章我们从日常的数字场景切入,聊了数据库的核心作用、和本地文件存储的区别,以及普通人的数据库学习价值,可以总结成三个核心要点: 1. 数据库是数字世界的底层记忆体,你所有的数字行为——从刷短视频的浏览记录,到电商订单、聊天记录,最终都会存储在数据库里。 2. 数据库不是简单的“文件存储”,它通过索引、事务、ACID特性、并发控制等机制,解决了本地文件存储的所有痛点,是支撑现代数字系统稳定运行的核心基础设施。 3. 数据库不是程序员的专属工具,不管是开发者、产品运营,还是普通用户,懂一点数据库的基本逻辑,都能帮你提升效率、避免踩坑、保护隐私。
下一章我们会从数据库的起源讲起,看看在没有数据库的年代,人们是怎么存储和管理数据的,数据库又是怎么一步步从简单的文件系统,进化到现在支撑全球数字运行的复杂系统的。
---
[^1]: 数据来源:IDC《2024年全球数据圈报告》,1艾字节等于$10^{18}$字节,相当于50万台256G手机的存储容量。 [^2]: ACID是关系型数据库的核心特性,由计算机科学家Jim Gray在1980年代提出,是保证数据库事务正确执行的四大基本要素,目前被所有主流关系型数据库支持。
早上7点,闹钟响起,你随手打开短视频APP刷10分钟醒神,系统精准推了你昨天看过的奶茶店测评;起床后打开外卖软件,首页自动弹出你常点的咖啡店优惠券;上班路上用打车软件叫车,行程记录自动同步到账户里;中午和同事拼单点外卖,订单详情、配送进度实时更新;晚上和朋友在社交软件聊今天看到的搞笑视频,聊天记录自动备份到云端,就算换手机也不会丢。这些你每天都会经历的、看似再普通不过的数字操作,背后都有一个共同的核心支撑:数据库(Database)。
根据2024年IDC发布的《全球数据圈报告》,全球每天产生的数据量超过2.5艾字节($2.5 \times 10^{18}$字节,相当于50万台256G手机的存储容量),其中90%以上的数据最终都会存储在各类数据库中[^1]。从你手机里的一条便签,到互联网巨头支撑双十一每秒数十万下单请求的分布式集群,数据库是数字世界最底层的“记忆体”,默默记录着所有的数字行为。
<!-- 标签:数据库入门 日常场景 存储对比 -->
1.1 你的24小时,都被数据库悄悄记着 / Your 24 Hours, Secretly Recorded by Databases
很多人对数据库的第一印象是“程序员用的高大上工具”,但实际上,你的数字生活早就和数据库深度绑定。我们可以把一天里的数据库交互拆解成几个典型场景:
1.1.1 内容消费场景:短视频、资讯、音乐的推荐逻辑
你刷短视频时觉得“算法太懂我”,本质上是数据库在支撑个性化推荐:APP会把你每一次点赞、收藏、评论、停留时长都写入用户行为数据库,推荐系统会实时查询这些数据,结合你的历史偏好,从内容库数据库里筛选出你最可能感兴趣的内容推送给你。如果没有数据库的高效存储和查询能力,你每次打开APP都要等几分钟才能加载出内容,更不用提“精准推荐”了。
```mermaid sequenceDiagram participant 用户 User participant APP客户端 APP Client participant 应用服务器 Application Server participant 数据库集群 Database Cluster 用户->>APP客户端: 打开短视频APP,滑动刷新 APP客户端->>应用服务器: 请求推荐内容,携带用户ID 应用服务器->>数据库集群: 1. 查询用户近7天的浏览/点赞/收藏记录<br>2. 查询内容库的标签、热度数据 数据库集群-->>应用服务器: 返回用户行为数据+候选内容列表 应用服务器->>应用服务器: 推荐算法排序,筛选Top20内容 应用服务器-->>APP客户端: 返回排序后的视频列表 APP客户端-->>用户: 展示短视频feed流 ```
这个流程里,数据库承担了两个核心角色:一是作为用户行为数据库,持久化存储你所有的操作记录;二是作为内容元数据库,存储所有视频的标签、分类、热度等基础信息。整个过程从你滑动刷新到内容展示,通常只需要几百毫秒,背后是数据库的索引(Index)和缓存机制在支撑——如果没有索引,数据库要从数百万条视频里找到匹配你偏好的内容,可能需要几分钟,完全无法满足实时消费的需求。
1.1.2 交易场景:订单、支付、物流的核心支撑
你在电商平台下单买一件衣服,背后至少会触发3次数据库写操作:扣减商品库存、生成订单记录、记录支付流水。如果数据库没有事务(Transaction)能力来保证这些操作的原子性,就可能出现“扣了库存但订单没生成”“付了钱但订单没更新”的诡异问题,甚至出现超卖:比如某件商品只剩最后1件,两个人同时下单,数据库如果没有加锁机制,可能