Hacker News 中文摘要

RSS订阅

你真的需要数据库吗? -- Do you even need a database?

文章摘要

文章核心内容:数据库本质上是文件系统,对于早期或小型应用而言,直接使用自定义文件存储可能比使用数据库更简单高效。作者通过构建不同技术栈的HTTP服务器进行性能测试,比较了直接读取文件与使用数据库两种方案的差异,指出应根据应用规模选择合适的存储方案。

文章总结

标题:你真的需要数据库吗?

文章核心内容:

  1. 数据库本质剖析
  • 所有数据库本质上都是文件操作(如SQLite是单个文件,PostgreSQL是目录文件)
  • 关键区别在于使用数据库管理的文件还是自主管理文件
  1. 三种数据存储方案对比实验 实验环境:
  • 测试平台: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倍性能

  1. 实际应用场景分析
  • 日均活跃用户(DAU)与系统负载关系:
    • 10万DAU约产生30次/秒峰值请求
    • SQLite可支持9000万DAU
  • 真实案例:Instagram 4亿DAU仍使用PostgreSQL
  1. 需要数据库的五大场景 (1) 数据量超过单机内存容量 (2) 需要多字段查询 (3) 需要表连接操作 (4) 多进程并发写入 (5) 需要跨实体原子操作

  2. 实践建议

  • 早期项目可优先考虑文件存储
  • JSONL格式便于后期迁移
  • 提供完整测试代码包下载(含Go/Bun/Rust实现)

关键结论: 大多数应用在早期阶段并不需要传统数据库,简单的文件存储方案即可满足数百万DAU的需求。当出现多维度查询、分布式写入等复杂需求时,才是引入数据库的合适时机。

(注:原文中的代码片段、图片链接和具体性能数据表格因技术细节较多未完全呈现,核心结论和对比数据已完整保留)

评论总结

以下是评论内容的总结:

支持使用文件系统替代数据库的观点

  1. 简单场景适用:对于小型应用或静态数据,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)
  2. 性能优势:现代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)

支持使用数据库的观点

  1. 功能完备性:数据库提供事务、并发控制、查询等关键功能,避免重复造轮子。

    • "concurrency, access controls, backups, transactions... are not just 'nice to have'" (MattRogish)
    • "You need databases if you need any kind of atomicity" (ozgrakkurt)
  2. 长期维护成本:随着应用复杂度增加,文件系统方案可能难以维护。

    • "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)

中间立场

  1. 按需选择:应根据具体场景(数据规模、访问模式等)选择方案。

    • "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)
  2. 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)