文章摘要
文章核心内容:数据库本质上是文件系统,对于早期或小型应用而言,直接使用自定义文件存储可能比使用数据库更简单高效。作者通过构建不同技术栈的HTTP服务器进行性能测试,比较了直接读取文件与使用数据库两种方案的差异,指出应根据应用规模选择合适的存储方案。
文章总结
标题:你真的需要数据库吗?
文章核心内容:
- 数据库本质剖析
- 所有数据库本质上都是文件操作(如SQLite是单个文件,PostgreSQL是目录文件)
- 关键区别在于使用数据库管理的文件还是自主管理文件
- 三种数据存储方案对比实验 实验环境:
- 测试平台:Apple M1 Mac mini
- 数据集:10k/100k/1M条记录
- 测试工具:wrk(4线程/50并发连接)
方案对比: (1) 线性扫描文件(O(n)复杂度) - 性能随数据量线性下降 - 1M记录时:Go 23次/秒,Bun平均响应超1秒
(2) 内存哈希表(O(1)复杂度) - 性能天花板:Rust达169k次/秒 - Bun(JavaScript)表现优于Go(106k vs 97k次/秒)
(3) 磁盘二分搜索(O(log n)复杂度) - 性能稳定:40k次/秒(1M记录时仅下降15%) - 意外超越SQLite 1.7倍性能
- 实际应用场景分析
- 日均活跃用户(DAU)与系统负载关系:
- 10万DAU约产生30次/秒峰值请求
- SQLite可支持9000万DAU
- 真实案例:Instagram 4亿DAU仍使用PostgreSQL
需要数据库的五大场景 (1) 数据量超过单机内存容量 (2) 需要多字段查询 (3) 需要表连接操作 (4) 多进程并发写入 (5) 需要跨实体原子操作
实践建议
- 早期项目可优先考虑文件存储
- JSONL格式便于后期迁移
- 提供完整测试代码包下载(含Go/Bun/Rust实现)
关键结论: 大多数应用在早期阶段并不需要传统数据库,简单的文件存储方案即可满足数百万DAU的需求。当出现多维度查询、分布式写入等复杂需求时,才是引入数据库的合适时机。
(注:原文中的代码片段、图片链接和具体性能数据表格因技术细节较多未完全呈现,核心结论和对比数据已完整保留)
评论总结
以下是评论内容的总结:
支持使用文件系统替代数据库的观点
简单场景适用:对于小型应用或静态数据,JSON/CSV等文件格式足够且高效。
- "a jsonl file and a single go binary will literally outlive most startup runways" (vovanidze)
- "Total hosting costs are £0 ($0) other than the domain name" (Joeboy)
性能优势:现代NVMe硬盘和OS缓存使文件I/O速度接近内存,数据库可能过度设计。
- "disk io today is basically ram speeds from 10 years ago" (vovanidze)
- "The evolution of hardware made this hack keep its performance well past what I had expected" (forinti)
支持使用数据库的观点
功能完备性:数据库提供事务、并发控制、查询等关键功能,避免重复造轮子。
- "concurrency, access controls, backups, transactions... are not just 'nice to have'" (MattRogish)
- "You need databases if you need any kind of atomicity" (ozgrakkurt)
长期维护成本:随着应用复杂度增加,文件系统方案可能难以维护。
- "I've spent a lot less time chasing down data corruption bugs since changing philosophy" (freedomben)
- "If your app is meaningfully successful... it will break in spectacular ways" (MattRogish)
中间立场
按需选择:应根据具体场景(数据规模、访问模式等)选择方案。
- "The real question isn't 'do you need a database' but 'do you need state'" (kabir_daki)
- "sqlite + in-memory cache is my winning combo" (koliber)
SQLite折中方案:在简单和功能之间取得平衡,适合多数场景。
- "just start with SQLite... should be just about everybody" (MattRogish)
- "SQLite would be just fine nowadays" (forinti)
其他观点
- 教育意义:手动实现存储有助于理解数据库原理,但不适合生产环境。
- "Writing your own storage is a great way to understand how databases work" (ktzar)
- 历史视角:类似NoSQL运动的讨论,技术选择需考虑时代背景。
- "Isn't this the same case the NoSQL movement made" (fifilura)