上一篇
非关系型数据库操作如何快速入门?, 教程有哪些?
- 云服务器
- 2026-07-23
- 6
非关系型数据库
非关系型数据库(NoSQL)是为应对大规模数据、高并发访问及灵活数据模型而设计的数据库系统,与传统关系型数据库不同,它通常不强制使用固定的表结构,支持水平扩展,并针对特定场景(如键值存储、文档存储、列存储、图存储)进行优化。


常见非关系型数据库类型
文档型数据库
- 数据模型:以JSON、BSON等文档格式存储,文档内部结构灵活。
- 主要操作:插入、查询、更新、删除文档,支持嵌套字段和数组索引。
- 代表产品:MongoDB、Couchbase。
键值型数据库
- 数据模型:简单的键值对,值可以是字符串、列表、集合、哈希等。
- 主要操作:基于键的快速读写,支持过期时间、原子操作等。
- 代表产品:Redis、DynamoDB、Riak。
列族型数据库
- 数据模型:按列族组织数据,每行可以包含多个列,列族内列可动态添加。
- 主要操作:按行键和列族进行读写,擅长聚合查询和宽表场景。
- 代表产品:Cassandra、HBase。
图数据库
- 数据模型:由节点、边和属性构成,用于表达复杂关系。
- 主要操作:创建节点、关系,使用图遍历查询(如最短路径、关联深度)。
- 代表产品:Neo4j、JanusGraph。
常用操作示例
MongoDB(文档型)
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 插入 | db.collection.insertOne({ name: "Alice", age: 30 }) | 插入单个文档 |
| 查询 | db.collection.find({ age: { $gt: 25 } }) | 查询年龄大于25的文档 |
| 更新 | db.collection.updateOne({ name: "Alice" }, { $set: { age: 31 } }) | 更新匹配的第一个文档 |
| 删除 | db.collection.deleteOne({ name: "Alice" }) | 删除匹配的第一个文档 |
Redis(键值型)
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 设置 | SET user:1 "Alice" | 设置键值对 |
| 获取 | GET user:1 | 获取对应值 |
| 过期 | EXPIRE user:1 60 | 设置60秒后过期 |
| 列表操作 | LPUSH mylist "value" | 向列表左侧插入元素 |
Cassandra(列族型)
| 操作 | CQL示例 | 说明 |
|---|---|---|
| 建表 | CREATE TABLE users (id UUID PRIMARY KEY, name text, age int); | 创建列族表 |
| 插入 | INSERT INTO users (id, name, age) VALUES (uuid(), 'Bob', 25); | 插入一行 |
| 查询 | SELECT FROM users WHERE age > 20 ALLOW FILTERING; | 按条件过滤查询 |
| 删除 | DELETE FROM users WHERE id = ?; | 删除指定行 |
Neo4j(图数据库)
| 操作 | Cypher示例 | 说明 |
|---|---|---|
| 创建节点 | CREATE (p:Person {name: "Alice", age: 30}) | 创建标签为Person的节点 |
| 创建关系 | MATCH (a:Person {name: "Alice"}), (b:Person {name: "Bob"}) CREATE (a)-[:KNOWS]->(b) | 创建两人之间的关系 |
| 查询关系 | MATCH (a:Person)-[:KNOWS]->(b) RETURN a.name, b.name | 查询所有认识关系 |
| 路径查询 | MATCH (a:Person {name: "Alice"})-[:KNOWS1..3]->(b) RETURN b.name | 查找Alice三度关系内的朋友 |
非关系型数据库操作对比
| 类型 | 读写性能 | 数据一致性 | 扩展性 | 适合场景 |
|---|---|---|---|---|
| 文档型 | 高(索引支持) | 最终一致性/强一致性可选 | 水平扩展 | 内容管理、日志、实时分析 |
| 键值型 | 极高(单键操作) | 最终一致性 | 易水平扩展 | 缓存、会话管理、计数器 |
| 列族型 | 高(列族聚合) | 最终一致性 | 强水平扩展 | 时序数据、大数据分析、推荐系统 |
| 图数据库 | 关系遍历快 | 事务支持(ACID部分) | 扩展较复杂 | 社交网络、推荐引擎、知识图谱 |
操作注意事项
- 索引优化:文档型数据库如MongoDB,需合理创建索引(单字段、复合、文本索引)以提升查询性能。
- 数据分片:键值型和列族型数据库通常支持自动分片,需根据访问模式设计分区键,避免热点。
- 事务支持:传统NoSQL弱化事务,但MongoDB 4.0+支持多文档事务,Redis 6.0+支持Lua脚本事务,图数据库Neo4j支持完整ACID。
- 备份与恢复:不同数据库有各自工具,如MongoDB的mongodump/mongorestore,Redis的RDB/AOF持久化,Cassandra的snapshot。
相关问题与解答
问题1:非关系型数据库能否完全替代关系型数据库?
解答:不能完全替代,关系型数据库在强事务一致性、复杂多表关联查询、标准化数据完整性方面仍有优势,非关系型数据库更适合处理海量数据、高并发、灵活数据模型和快速迭代的场景,实际应用中常采用混合架构(如使用MySQL存储核心业务数据,Redis做缓存,MongoDB存储日志或文档)。

问题2:在非关系型数据库中如何实现类似SQL的关联查询(Join)?
解答:不同NoSQL数据库提供不同方式:
- 文档型(MongoDB):使用聚合框架中的$lookup阶段实现类似左外连接,也可通过应用层多次查询手动组合。
- 键值型:通常不支持关联,需要应用层将关联数据合并存储或通过管道(如Redis的Lua脚本)处理。
- 列族型(Cassandra):强烈建议反范式化设计,将关联数据事先存入同一张表或使用物化视图,避免join。
- 图数据库:关联是核心能力,通过Cypher的MATCH语句直接表达节点间关系,性能远优于关系型数据库的join。