主题
关系型和非关系型数据库
更新: 10/9/2025字数: 0 字 时长: 0 分钟
一、关系型数据库(Relational Database,RDBMS)
关系型数据库是基于表格结构存储数据,每条数据称为一条记录(Row),每个字段称为列(Column),表之间通过主键、外键建立关系。
特点
| 特点 | 说明 |
|---|---|
| 结构化数据 | 数据存储在表中,字段类型固定 |
| 强一致性 | 支持 ACID(原子性、Consistency、一致性、Isolation、隔离性、Durability、持久性) |
| 复杂查询 | 支持 SQL 语句,多表关联、聚合函数等 |
| 模式固定 | 数据库表的列结构需提前定义(Schema) |
常见数据库
- MySQL
- PostgreSQL
- Oracle
- SQL Server
使用场景
- 金融系统(银行、交易)
- 企业 ERP / CRM 系统
- 高一致性要求的业务
简单示例:MySQL 用户表
sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);关系型数据库适合结构化、强一致性数据,方便复杂查询和事务处理。
二、非关系型数据库(NoSQL)
非关系型数据库(NoSQL)是一类非表格结构的数据库,通常用于存储非结构化或半结构化数据,支持高性能、高扩展性需求。
特点
| 特点 | 说明 |
|---|---|
| 灵活数据模型 | 可存储 JSON、键值对、文档、图等形式 |
| 高扩展性 | 水平扩展(Sharding)容易 |
| 弱一致性 | 通常遵循 BASE 原则(基本可用、柔性状态、最终一致性) |
| 性能优先 | 适合海量数据快速读写 |
类型
| 类型 | 说明 | 常见数据库 |
|---|---|---|
| 键值(Key-Value) | 以 key 存取 value | Redis、Memcached |
| 文档(Document) | JSON/ BSON 形式存储 | MongoDB、CouchDB |
| 列族(Column-Family) | 面向列存储 | HBase、Cassandra |
| 图数据库(Graph) | 节点和边存储 | Neo4j、JanusGraph |
使用场景
- 高并发读写缓存(Redis)
- 社交关系数据(图数据库)
- 日志存储 / 大数据分析(HBase、Cassandra)
- 灵活文档存储(MongoDB)
简单示例:MongoDB 用户文档
json
{
"_id": "64f1a2b5c3d4e5f6",
"username": "alice",
"email": "alice@example.com",
"created_at": "2025-10-09T10:00:00Z"
}非关系型数据库适合高并发、海量数据、灵活结构的场景,牺牲部分一致性来换取性能和扩展性。
三、关系型 vs 非关系型数据库对比
| 特性 | 关系型 (RDBMS) | 非关系型 (NoSQL) |
|---|---|---|
| 数据结构 | 表格(行列) | 键值、文档、列族、图 |
| 模式 | 固定 Schema | 灵活,可变字段 |
| 一致性 | 强一致性 ACID | 弱一致性 BASE |
| 扩展性 | 垂直扩展为主 | 水平扩展方便 |
| 查询语言 | SQL | 不同类型数据库有不同 API |
| 性能 | 复杂查询强 | 高并发、大数据场景快 |
| 典型场景 | 金融、ERP | 缓存、日志、大数据、社交关系 |
四、怎么理解主键和外键
4.1 主键(Primary Key)
主键是用来唯一标识表中每一行记录的字段。每个表只能有一个主键,主键值必须是唯一的且不能为 NULL。它确保表中的每一条记录都有唯一标识。
例子:在学生表中,Student_ID 可以作为主键,因为每个学生的学号都是唯一的。
4.2 外键(Foreign Key)
外键是一个表中的字段,它指向另一个表的主键,用来建立两个表之间的联系。外键确保数据的完整性和一致性,外键列的值必须在目标表的主键列中存在。
例子:在成绩表中,Student_ID 可以作为外键,指向学生表中的 Student_ID,表示成绩记录属于哪个学生。
4.3 例子:
假设我们有两个表:
- 学生表(
students):
| 学号(Student_ID) | 姓名(Name) | 年龄(Age) |
|---|---|---|
| 1001 | 张三 | 20 |
| 1002 | 李四 | 22 |
| 1003 | 王五 | 21 |
- 成绩表(
grades):
| 学号(Student_ID) | 课程(Course) | 成绩(Grade) |
|---|---|---|
| 1001 | 数学 | 90 |
| 1002 | 英语 | 85 |
| 1001 | 物理 | 88 |
在这个例子中,grades 表中的 Student_ID 是外键,它引用了 students 表中的 Student_ID 主键。这样,我们就能知道每一条成绩记录对应的是哪个学生。外键确保了成绩表中每个学生的学号必须存在于学生表中,从而保证数据的关联性和完整性。
五、实体,属性,关系简述
在数据库建模中,实体(Entity)属性(Attribute)和关系(Relationship)是三个基本概念,它们用来描述现实世界中的数据和数据之间的关系。
5.1 实体(Entity)
实体表示现实世界中的一个对象或事物,它可以是具体的也可以是抽象的,通常指的是我们需要存储数据的对象。
- 例子:学生、课程、员工、订单等。
- 实体通常被表示为表格中的一行。
5.2 属性(Attribute)
属性是描述实体特征的字段或数据项。每个实体通常有多个属性,用于详细描述该实体的特征。
- 例子:对于一个“学生”实体,属性可以是
Student_ID(学号)、Name(姓名)、Age(年龄)等。
5.3 关系(Relationship)
关系表示不同实体之间的联系或互动。在数据库中,关系通常表示表与表之间的关联。
- 例子:学生与课程之间的关系,可以是“选修”关系,表示哪个学生选了哪些课程。
- 关系在数据库中通过外键来实现。
总结:
- 实体:表示现实世界中的事物(例如:学生、课程)。
- 属性:描述实体的特征(例如:学生的姓名、年龄)。
- 关系:描述不同实体之间的联系(例如:学生选修课程)。