非关系型数据库简述
在现代软件开发中,数据库几乎是所有应用系统的重要组成部分。传统的关系型数据库,例如 MySQL、PostgreSQL 和 Oracle,已经发展了几十年,并且在绝大多数业务系统中都有广泛应用。
但随着互联网应用规模不断扩大,数据类型也变得越来越复杂。除了传统的用户信息、订单信息之外,一个系统可能还需要存储日志、聊天记录、缓存、用户行为、图片元数据以及大规模设备数据等。
面对这些场景,传统关系型数据库并不一定是最合适的选择。
于是,非关系型数据库,也就是通常所说的 NoSQL 数据库,逐渐成为现代系统架构中的重要组成部分。
什么是非关系型数据库
非关系型数据库是一类不以传统二维表关系模型作为主要数据组织方式的数据库。
NoSQL 一般被理解为:
Not Only SQL
也就是“不仅仅是 SQL”。
这个名称并不是说非关系型数据库完全不能使用 SQL,也不是意味着 SQL 已经过时,而是表示数据库的数据组织方式不再局限于传统的关系模型。
关系型数据库通常使用类似下面这样的表结构:
User
----------------
id
name
age
email
每条记录都必须按照预先定义好的字段进行存储。
而在一些非关系型数据库中,一条用户数据可能直接保存成一个类似 JSON 的文档:
{
"id": 1001,
"name": "张三",
"age": 20,
"email": "zhangsan@example.com"
}
甚至不同的用户记录还可以拥有不同的字段。
例如:
{
"id": 1002,
"name": "李四",
"age": 25,
"hobbies": ["摄影", "编程"]
}
这种更加灵活的数据结构,就是很多 NoSQL 数据库的重要特点。
为什么会出现 NoSQL
早期的软件系统规模通常比较小,关系型数据库完全可以满足大部分需求。
但随着互联网的发展,一些大型网站开始面对新的问题。
例如一个大型社交平台每天可能产生:
- 数亿条用户动态;
- 数十亿条访问日志;
- 大量聊天消息;
- 用户行为记录;
- 缓存数据;
- 推荐系统产生的数据。
这些数据不仅数量巨大,而且增长速度非常快。
传统关系型数据库虽然也可以通过分库分表、读写分离等方式进行扩展,但系统复杂度会逐渐增加。
相比之下,一些 NoSQL 数据库从设计之初就更加注重:
- 大规模数据存储;
- 分布式部署;
- 高并发访问;
- 横向扩展;
- 灵活的数据结构。
因此 NoSQL 数据库开始被大量应用于互联网系统。
NoSQL 并不是一种数据库
需要注意的是,NoSQL 并不是某一种具体的数据库技术。
它更像是一个数据库类别。
根据数据组织方式的不同,NoSQL 数据库通常可以分为几种类型。
键值数据库
键值数据库可以认为是最简单的一类 NoSQL 数据库。
它的数据结构类似程序中的 Map 或 Dictionary:
key -> value
例如:
user:1001 -> 张三
或者:
token:abcd1234 -> user:1001
读取数据时,只需要根据 key 找到对应的 value。
这种结构非常简单,因此查询速度通常非常快。
最典型的键值数据库就是 Redis。
例如:
SET username "zhangsan"
读取:
GET username
Redis 经常用于:
- 数据缓存;
- 登录 Session;
- 验证码;
- 分布式锁;
- 排行榜;
- 计数器。
因此在现代后端系统中,Redis 几乎已经成为非常常见的基础组件。
文档数据库
文档数据库使用类似 JSON 的结构保存数据。
其中最有代表性的数据库就是 MongoDB。
例如一条商品数据可以保存为:
{
"name": "笔记本电脑",
"price": 5999,
"brand": "Example",
"specification": {
"cpu": "8 Core",
"memory": "16GB",
"storage": "1TB"
}
}
相比传统关系型数据库,文档数据库可以直接保存比较复杂的嵌套结构。
如果使用关系型数据库保存这些信息,可能需要建立多个表:
product
product_specification
product_category
然后通过外键进行关联。
而文档数据库则可以直接把相关数据保存到一个文档中。
因此它比较适合数据结构经常变化或者存在大量嵌套信息的场景。
列式数据库
还有一类数据库采用面向列族的数据组织方式。
比较典型的有:
- Cassandra;
- HBase。
这类数据库通常用于处理非常大规模的数据。
例如:
用户访问日志
设备监控数据
互联网行为数据
它们通常可以运行在由大量服务器组成的集群中,并通过增加服务器不断扩展存储和处理能力。
因此在大数据系统中比较常见。
图数据库
图数据库则主要用于处理复杂关系数据。
例如一个社交网络中可能存在:
张三 -> 关注 -> 李四
李四 -> 关注 -> 王五
张三 -> 好友 -> 王五
如果使用传统关系型数据库,需要通过大量 JOIN 操作查询这些关系。
而图数据库会直接将数据表示为:
节点 + 边
例如:
张三 ----朋友---- 李四
|
关注
|
王五
比较有代表性的图数据库是 Neo4j。
图数据库经常用于:
- 社交网络;
- 知识图谱;
- 推荐系统;
- 风控系统;
- 路径分析。
NoSQL 的主要特点
数据结构更加灵活
传统关系型数据库通常需要提前设计表结构。
例如:
CREATE TABLE user (
id INT,
name VARCHAR(50),
age INT
);
如果后续需要增加字段,通常需要修改数据库结构。
而一些 NoSQL 数据库允许不同记录拥有不同字段,因此对数据结构变化的适应能力更强。
这对于快速迭代的互联网应用非常方便。
更容易进行横向扩展
数据库扩展通常可以分为两种方式。
一种是纵向扩展:
更好的 CPU
更大的内存
更快的硬盘
也就是不断升级服务器。
另一种是横向扩展:
服务器 A
服务器 B
服务器 C
服务器 D
通过增加更多机器来提高系统能力。
很多 NoSQL 数据库从设计时就考虑了分布式架构,因此通常更加适合横向扩展。
适合高并发访问
很多 NoSQL 数据库的数据模型非常简单。
例如 Redis 根据 key 直接访问数据:
key -> value
因此不需要执行复杂的表关联操作。
在一些高并发场景中,可以获得非常高的访问性能。
通常更加偏向分布式系统
很多 NoSQL 数据库天然支持:
数据分片
数据复制
节点扩展
故障转移
例如一个数据库集群中可能包含:
Node1
Node2
Node3
Node4
数据会分布在多个节点中。
即使其中某个节点发生故障,系统仍然可以继续工作。
NoSQL 与关系型数据库的区别
关系型数据库和非关系型数据库并不是简单的“新技术取代旧技术”。
它们适合解决不同的问题。
| 对比 | 关系型数据库 | 非关系型数据库 |
|---|---|---|
| 数据结构 | 二维表 | 键值、文档、图等 |
| Schema | 通常固定 | 通常更加灵活 |
| 查询方式 | SQL | 根据数据库不同而不同 |
| 事务能力 | 通常较强 | 根据数据库类型不同 |
| 数据关系 | JOIN、外键 | 通常弱化复杂关系 |
| 扩展方式 | 传统上偏纵向扩展 | 通常更适合横向扩展 |
| 常见用途 | 订单、支付、业务系统 | 缓存、日志、海量数据 |
因此并不能简单认为:
NoSQL 比 MySQL 更先进
更准确的说法应该是:
不同数据库解决不同类型的问题。
一个常见的实际架构
在真实项目中,很少会只使用一种数据库。
例如一个电商网站可能采用:
MySQL
↓
用户、订单、商品
Redis
↓
缓存、Session、验证码
Elasticsearch
↓
商品搜索
MongoDB
↓
部分灵活结构的数据
也就是说:
关系型数据库 + NoSQL
往往才是现代系统中更加常见的数据库架构。
例如用户下订单时,订单数据需要高度可靠,就可以存储在 MySQL 中。
而热门商品信息可能被大量用户重复访问,因此可以缓存到 Redis。
这样下一次用户访问时,就不需要每次都查询 MySQL。
整体流程类似:
用户请求
↓
Redis
↓
是否存在缓存?
↓
存在 → 直接返回
↓
不存在
↓
MySQL
↓
查询数据
↓
写入 Redis
↓
返回结果
这种设计既能保证核心数据的可靠性,又能够提高系统访问性能。
NoSQL 是否可以完全替代关系型数据库
通常不可以,也没有必要。
NoSQL 的出现,并不是为了完全淘汰关系型数据库。
比如:
- 银行转账;
- 商品订单;
- 财务数据;
- 库存数据。
这些业务通常具有复杂的数据关系,并且对事务和一致性要求很高。
关系型数据库在这些场景中仍然非常合适。
而:
- 缓存;
- 日志;
- 用户行为;
- 搜索;
- 社交关系;
- 大规模设备数据。
这些场景可能更加适合使用某种 NoSQL 数据库。
因此数据库选型的核心并不是:
“哪个数据库最好?”
而应该是:
“哪个数据库最适合当前的数据和业务。”
总结
非关系型数据库是传统关系型数据库之外的一类数据库技术,它并不局限于二维表的数据组织方式,而是根据不同需求发展出了键值、文档、列族和图等多种数据模型。
像 Redis、MongoDB、Cassandra 和 Neo4j,虽然都属于 NoSQL 数据库,但它们实际上解决的是完全不同的问题。
NoSQL 最重要的特点通常包括数据结构灵活、容易进行横向扩展,并且比较适合高并发和大规模数据场景。
不过,在现代系统中,关系型数据库和非关系型数据库并不是互相替代的关系。
更多时候,它们会同时存在于一个系统中:
MySQL + Redis + Elasticsearch + MongoDB
不同数据库负责不同的数据和业务。
因此,真正需要理解的并不是“应该选择 SQL 还是 NoSQL”,而是根据数据结构、访问方式、一致性要求和系统规模,选择最合适的数据库技术。
- 点赞
- 收藏
- 关注作者
评论(0)