你为什么为你的应用选择那个数据库?

发布: (2025年12月12日 GMT+8 07:51)
7 min read
原文: Dev.to

Source: Dev.to

一段关于简历驱动开发(Resume‑Driven Development)、“Google Scale” 幻想以及为什么我们最终总是使用 Postgres 的自白。

你倒了一杯新鲜的咖啡,砸响指关节,键入 mkdir my-next-billion-dollar-idea,然后……你僵住了。

你撞上了 持久化之墙。是时候选数据库了。说实话,在系统设计面试中给出的答案往往并不是你为副项目挑选数据库的 真实 原因。

如果我们百分之百诚实,大多数架构决策文档会写成:“我们选择 MongoDB 是因为首席开发者害怕 JOIN 语句”,或者 “我们选择 Cassandra 是因为想要有 Netflix 的感觉”。

但你必须做出实际的选择。下面我们来探讨挑选数据库的混乱决策树、我们自欺的谎言,以及如何在不掉眼泪的情况下选对数据库。

糟糕数据库决策的三大骑士

1. “Google Scale” 幻想

你正在为你的猫构建一个待办事项应用。现实中你只会有三个用户:你、你的伴侣以及你创建的测试账号。但你仍会这样想:

“但是分片怎么办?如果我的猫成了网红,我需要在 AWS us‑east‑1 的三个可用区都有写入可用性怎么办?”

现实检查: 你没有大数据,只有小数据。你的数据可以放进 RAM,甚至可以放进一个文本文件。不要为五年后可能出现的问题去优化,而是为下周二的交付去优化。

2. 简历驱动开发(RDD)

你在 Hacker News 上看到一个新的向量数据库。它是用 Rust 写的,logo 是一只酷炫的几何狐狸。你根本不知道向量嵌入是什么,但你知道如果把它写进简历,招聘者可能会误给你 20 万美元的报价。

现实检查: 无聊的技术能赚钱,刺激的技术会导致宕机。

3. “无模式” 陷阱

“我不想定义模式,我想快速迭代,打破常规。”

于是你选了文档存储。六个月后,你的数据库里 user_id 在一半文档里是字符串,另一半是整数,而在那个你疲惫的星期二创建的文档里则是 null

现实检查: 你始终拥有模式。要么由数据库强制(好),要么由一堆 if (typeof x === 'undefined') 语句在业务代码中强制(坏)。

实际菜单:给迷茫者的指南

1. 关系型数据库(SQL)

竞争者:PostgreSQL、MySQL、MariaDB

氛围: 那个负责的老大哥,按时报税。

何时使用: 95 % 的情况。如果你的数据有关系(例如 Users → Orders → Items),就用 SQL。它保证 ACID 合规并强制结构。

人们回避的原因: 必须学习 SQL。

你应该使用的理由: SQL 是数据的通用语言。它会在宇宙热寂之前一直存在。

小技巧: 直接用 PostgreSQL。它已经支持 JSON Blob,所以基本上是“穿着风衣的关系型数据库 + NoSQL”。

2. 文档存储(NoSQL)

竞争者:MongoDB、Firestore、DynamoDB

氛围: 混乱的艺术家阁楼。把所有东西都扔进一堆,之后再整理。

何时使用:

  • 原型开发,数据结构频繁变化。
  • 数据真正以文档为中心(例如一篇博客文章把评论和标签都放在同一个对象里)。
  • 读取密集型工作负载,只想拿到 ID 并立即得到一个巨大的 JSON Blob。

警告: 在非关系型数据库里存放关系型数据是地狱循环,只适合喜欢在业务代码里写嵌套循环的人。

3. 键值存储

竞争者:Redis、Memcached

氛围: 咖啡因滴注下的肾上腺素狂热者。

何时使用: 缓存、会话管理、排行榜。

不要把它当作: 主要的数据真相源。如果服务器重启导致 Redis 实例丢失——而你的用户账户正存放在那里……恭喜,你已经没有用户了。

4. 图数据库

竞争者:Neo4j、Amazon Neptune

氛围: 那块贴满红线的阴谋论布告板。

何时使用:数据之间的关系 比数据本身更重要时——社交网络、欺诈检测环、推荐引擎。

数学原理: 如果你的 SQL 查询包含 14 条 JOIN,且执行时间达到 20 秒,你可能需要图数据库。

最终裁决

怎么选?下面是一个简易算法,帮你省去数周的调研时间:

  • 你需要为 AI 应用在向量空间进行复杂搜索吗? 使用向量数据库(Pinecone、Weaviate 或 pgvector)。
  • 你的数据本身就是社交图谱吗? 使用图数据库。
  • 你有每秒 5000 万次写入来自 IoT 传感器吗? 使用时序数据库。
  • 除此之外的所有情况? 使用关系型数据库。

“那到底选哪款关系型数据库?” 我听到你的提问。

选你最会部署的那一款。如果你对任何一种都不熟悉,就选 Postgres,每月 15 美元买个托管实例,然后去实现你的真实功能。

用户并不在乎你用了什么数据库,他们在乎登录按钮能正常工作。

Back to Blog

相关文章

阅读更多 »

我正在尝试理解的

背景 我是一名中级软件工程师,职业生涯起步于构建网页应用,主要使用 Ruby on Rails。随着时间的推移,我也使用了其他…

类似Cassandra的分布式数据库

本学期,我在 Python 中构建了一个类似 Cassandra 的分布式数据库。在本文中,我深入探讨了 Cassandra 的分布式特性及其实现……