1. 关系型数据库(RDBMS)
(1)核心特性
- 结构化数据:数据以表(Table)形式存储,遵循严格的模式(Schema)。
- SQL语言:通过结构化查询语言(SQL)进行数据操作。
- ACID事务:
- 原子性(Atomicity):事务要么全部完成,要么全部回滚。
- 一致性(Consistency):事务保持数据库从一个有效状态到另一个有效状态。
- 隔离性(Isolation):并发事务互不干扰。
- 持久性(Durability):事务提交后数据永久保存。
(2)主流数据库对比
数据库 | 特点 | 适用场景 |
---|---|---|
MySQL | 开源、易用、高性能,适合Web应用 | 中小型Web应用、电商平台 |
PostgreSQL | 功能强大、支持JSON和扩展类型 | 复杂业务系统、GIS地理数据 |
Oracle | 企业级、高可用性、收费 | 金融、电信等大型企业系统 |
(3)关键操作示例
-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE
);
-- 插入数据
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
-- 查询(带JOIN)
SELECT u.name, o.order_id
FROM users u JOIN orders o ON u.id = o.user_id;
2. NoSQL数据库
(1)核心特性
- 非结构化/半结构化数据:灵活的数据模型(键值、文档、列族等)。
- 高扩展性:支持水平扩展(分片)。
- 最终一致性:牺牲强一致性以换取高可用性(CAP定理)。
(2)主流NoSQL数据库
类型 | 数据库 | 数据模型 | 适用场景 |
---|---|---|---|
文档型 | MongoDB | JSON文档(BSON) | 内容管理、实时分析(灵活模式变更) |
键值型 | Redis | Key-Value | 缓存、会话存储(高速读写) |
列族型 | Cassandra | 列族(宽表) | 时序数据、大规模日志(高写入吞吐) |
图数据库 | Neo4j | 节点+边 | 社交网络、推荐系统(关系密集型) |
(3)操作示例
MongoDB(文档型):
// 插入文档
db.users.insertOne({
name: "Bob",
age: 30,
hobbies: ["coding", "hiking"]
});
// 查询
db.users.find({ age: { $gt: 25 } });
Redis(键值型):
# 设置键值
SET user:1 "Alice"
# 获取值
GET user:1
3. 数据库范式(Normalization)
(1)目的
减少数据冗余,避免更新异常(插入/删除/修改异常)。
(2)核心范式
范式 | 规则 | 示例问题与解决 |
---|---|---|
1NF | 每个字段不可再分(原子性) | 将“地址”拆分为省/市/街道字段。 |
2NF | 满足1NF,且非主键字段完全依赖主键 | 订单表中,商品名称应依赖订单ID+商品ID,而非仅订单ID。 |
3NF | 满足2NF,且消除传递依赖(非主键字段不依赖其他非主键字段) | 学生表中,学院电话应移至学院表,避免依赖学生ID。 |
BCNF | 满足3NF,且所有依赖的决定因素必须包含候选键 | 解决主键复合时的复杂依赖关系。 |
(3)反范式化(Denormalization)
- 场景:为提升查询性能(如报表系统),允许冗余数据。
- 权衡:牺牲写入效率换取读取效率。
关键问题与解决方案
问题 | 解决方案 | 示例 |
---|---|---|
高并发写入瓶颈 | 分库分表(如MySQL分片)+ NoSQL辅助 | 用户表按ID哈希分片,日志用MongoDB存储 |
复杂查询性能低 | 反范式化设计或使用列式数据库(如ClickHouse) | 订单统计表冗余用户姓名 |
数据一致性要求高 | 使用关系型数据库+分布式事务(如XA协议) | 银行转账需强一致性 |
现代演进方向
- NewSQL:结合SQL和NoSQL优势(如Google Spanner、TiDB)。
- 多模型数据库:单数据库支持多种数据模型(如PostgreSQL支持JSON和图查询)。
- 云原生数据库:自动扩缩容+Serverless(如AWS Aurora、Snowflake)。
总结
- 关系型数据库:适合强一致性、复杂查询的场景(如金融系统)。
- NoSQL数据库:适合高扩展性、灵活模式的场景(如社交网络)。
- 数据库范式:设计时优先满足3NF,必要时反范式化优化性能。
掌握这些知识能帮助您根据业务需求合理选型与设计数据库(如电商系统用MySQL存订单,Redis存购物车缓存)。