如果你在构建你的第一个真实应用,你很快就会遇到这个问题:“我应该使用 SQL 还是 NoSQL?”

听起来很吓人,但一旦你掌握了核心概念,其实很简单。让我们来拆解一下。

数据库到底是什么?

数据库只是一个用来存储应用数据的地方,这样数据才不会在你关闭浏览器时消失。可以把它想象成一个非常有条理的文件柜。如何组织这个文件柜,正是 SQL 和 NoSQL 分道扬镳的地方。

SQL 数据库:结构化且严格

SQL 数据库(如 PostgreSQL、MySQL 或 SQLite)将数据存储在中——行和列,就像电子表格一样。每一行都遵循相同的结构,表之间可以相互关联。

示例:一个简单的 usersorders 结构。

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INT REFERENCES users(id),
  item VARCHAR(100),
  price DECIMAL
);

Enter fullscreen mode Exit fullscreen mode

想要获取特定用户的所有订单?只需一个简洁的查询:

SELECT orders.item, orders.price
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.email = '[email protected]';

Enter fullscreen mode Exit fullscreen mode

这个 JOIN 是 SQL 的超能力。数据之间的关系由数据库本身强制执行,跨表查询也很直观。

NoSQL 数据库:灵活且快速

NoSQL 数据库(如 MongoDB、Firebase 或 Redis)不会强制将数据放入严格的表中。最常见的类型——文档数据库——将数据存储为类似 JSON 的对象,每个文档可以与下一个不同。

示例:在 MongoDB 中相同的“带订单的用户”概念。

{
  "_id": "0001",
  "name": "Jane",
  "email": "[email protected]",
  "orders": [
    { "item": "Keyboard", "price": 45 },
    { "item": "Mouse", "price": 20 }
  ]
}

Enter fullscreen mode Exit fullscreen mode

Jane 的所有信息都存在于一个文档中。无需连接——直接获取即可。

真正的差异

SQL NoSQL
Structure Fixed tables, rows & columns Flexible documents/objects
Schema Defined upfront Can change anytime
Relationships Strong, via joins Usually nested or duplicated
Scaling Mostly vertical (bigger server) Built for horizontal scaling
Good for Transactions, complex queries Fast iteration, huge write volume

那么你应该使用哪一个?

老实说,这取决于你在构建什么。

  • 正在构建涉及金钱、库存或任何需要严格一致性的东西(银行、电商结账)?选择 SQL。
  • 正在构建数据形状经常变化、需要快速处理大量读/写操作的东西(聊天应用、活动动态、内容平台)?NoSQL 更合适。

这里是大多数教程跳过的部分:你不必只选其中一个。许多真实的生产应用同时使用两者——SQL 用于核心事务数据,而像 Redis 这样的东西用于缓存,或 MongoDB 用于日志和分析。这种混合有时被称为多语言持久化,比人们想象的更常见。

总结

SQL vs NoSQL 并不是真正的对抗——而是结构与灵活性之间的权衡。一旦你理解了每种数据库的真正擅长之处,选择通常会根据你正在构建的内容自然而然地做出。