跳转至

01-数据库基础概念

数据库基础概念

数据库世界的入门指南 目标:建立数据库的整体认知,理解核心概念


📋 本章概览

预计学习时间:2-3小时 前置章节:无(本章为入门) 实践要求:阅读完本章后,能回答文末的自测问题

本章内容: 1. 什么是数据库? 2. 关系型 vs 非关系型数据库 3. 数据库核心概念 4. 常见数据库类型 5. 数据库在AI项目中的作用


1. 什么是数据库?

1.1 从一个例子开始

想象你在做一个图像分类项目:

Python
# ❌ 没有数据库的做法
# 把所有图片路径和标签存在Python列表里
images = [
    {"path": "/data/cat_001.jpg", "label": "cat", "size": 1024},
    {"path": "/data/dog_001.jpg", "label": "dog", "size": 2048},
    # ... 100万个条目
]

# 问题1:程序关闭后数据丢失
# 问题2:查找特定标签的图片要遍历整个列表 - 慢!
# 问题3:多个程序无法同时访问
# 问题4:数据量大了内存装不下
Python
# ✅ 使用数据库的做法
import sqlite3

# 连接数据库(数据持久化存储)
conn = sqlite3.connect('image_dataset.db')

# 查询特定标签的图片(毫秒级响应)
cursor = conn.execute(
    "SELECT path FROM images WHERE label = 'cat' LIMIT 1000"
)
results = cursor.fetchall()

# 优势:
# 1. 数据持久化 - 程序关闭后数据还在
# 2. 高效查询 - 索引让查询速度提升1000倍
# 3. 并发访问 - 多个程序可以同时读写
# 4. 大数据量 - 支持TB级数据存储

1.2 数据库的定义

数据库(Database) 是按照数据结构来组织、存储和管理数据的仓库。

数据库管理系统(DBMS) 是管理数据库的软件,提供: - 数据定义:创建、修改、删除数据结构 - 数据操作:增删改查(CRUD) - 数据控制:权限管理、并发控制、备份恢复

1.3 为什么需要数据库?

需求 文件存储 数据库
数据持久化 ✅ 可以 ✅ 可以
高效查询 ❌ 遍历文件 ✅ 索引优化
大数据量 ❌ 性能下降 ✅ TB级支持
并发访问 ❌ 文件锁冲突 ✅ 事务管理
数据一致性 ❌ 容易出错 ✅ ACID保证
权限控制 ❌ 系统级 ✅ 细粒度控制

AI场景中的数据库价值

Python
# 场景1:训练数据管理
# 百万级训练样本,需要按标签、批次、质量筛选
db.query("SELECT * FROM training_data WHERE label='positive' AND quality_score > 0.8")

# 场景2:实验追踪
# 记录每次实验的超参数、指标、模型文件路径
db.execute("""
    INSERT INTO experiments
    (model_name, lr, batch_size, accuracy, model_path)
    VALUES ('ResNet50', 0.001, 32, 0.95, '/models/exp_001.pth')
""")

# 场景3:模型服务
# 缓存预测结果,避免重复计算
cached_result = db.query("SELECT result FROM predictions WHERE input_hash = ?", (hash,))


2. 关系型 vs 非关系型数据库

2.1 关系型数据库(RDBMS)

核心思想:数据以表(Table)的形式组织,表与表之间通过关系连接。

代表产品:MySQL、PostgreSQL、Oracle、SQL Server、SQLite

Text Only
┌─────────────────────────────────────────────────────────────┐
│                      用户表 (users)                          │
├──────────┬──────────┬──────────┬──────────┬─────────────────┤
│  id (PK) │   name   │   email  │   age    │   created_at    │
├──────────┼──────────┼──────────┼──────────┼─────────────────┤
│    1     │   张三   │ z@email  │    25    │  2024-01-01     │
│    2     │   李四   │ l@email  │    30    │  2024-01-02     │
└──────────┴──────────┴──────────┴──────────┴─────────────────┘
                              │ 一对多关系
┌─────────────────────────────────────────────────────────────┐
│                    订单表 (orders)                           │
├──────────┬──────────┬──────────┬──────────┬─────────────────┤
│  id (PK) │ user_id  │  amount  │  status  │   created_at    │
│          │  (FK)    │          │          │                 │
├──────────┼──────────┼──────────┼──────────┼─────────────────┤
│   101    │    1     │  199.00  │  paid    │  2024-01-05     │
│   102    │    1     │  299.00  │ pending  │  2024-01-06     │
│   103    │    2     │   99.00  │  paid    │  2024-01-07     │
└──────────┴──────────┴──────────┴──────────┴─────────────────┘

PK = Primary Key (主键)  - 唯一标识每条记录
FK = Foreign Key (外键)  - 建立表之间的关联

优点: - ✅ 数据结构清晰,易于理解 - ✅ 支持复杂查询(JOIN、子查询) - ✅ 事务支持,保证数据一致性 - ✅ 成熟稳定,社区活跃

缺点: - ❌ 水平扩展困难(分库分表复杂) - ❌ 不适合存储非结构化数据 - ❌ 高并发写入性能有限

2.2 非关系型数据库(NoSQL)

核心思想:不强制使用表结构,根据数据特点选择不同的存储模型。

主要类型

文档型数据库(Document Store)

代表:MongoDB

存储JSON-like的文档,适合存储复杂、多变的数据结构。

JavaScript
// MongoDB 文档示例
{
    "_id": ObjectId("..."),
    "name": "张三",
    "email": "zhangsan@example.com",
    "tags": ["AI", "Python", "Deep Learning"],  // 数组
    "profile": {                               // 嵌套对象
        "age": 25,
        "city": "北京",
        "skills": ["PyTorch", "TensorFlow"]
    },
    "experiments": [                           // 嵌套数组
        {"id": "exp001", "accuracy": 0.95},
        {"id": "exp002", "accuracy": 0.96}
    ]
}

适用场景: - 数据结构经常变化 - 需要存储嵌套数据 - 内容管理系统 - AI实验元数据存储

键值型数据库(Key-Value Store)

代表:Redis、Memcached

简单的键值对存储,速度极快。

Python
# Redis 示例
SET user:1:name "张三"           # 设置键值
GET user:1:name                  # 获取值 → "张三"
SETEX session:abc 3600 "data"    # 设置带过期时间的键(缓存)

# 适用场景:
# - 缓存热点数据
# - 会话存储
# - 实时排行榜
# - 模型预测结果缓存

适用场景: - 缓存 - 会话管理 - 实时数据处理 - 模型推理结果缓存

列族型数据库(Column Family)

代表:Cassandra、HBase

按列存储,适合海量数据和高并发写入。

Text Only
行键        │ 列族: 用户属性              │ 列族: 行为数据
────────────┼─────────────────────────────┼─────────────────────
user_001    │ name: 张三, age: 25         │ click: 100, buy: 5
user_002    │ name: 李四, age: 30         │ click: 200, buy: 10

适用场景: - 时序数据(日志、传感器数据) - 海量数据存储(PB级) - 高并发写入

图数据库(Graph Database)

代表:Neo4j

存储实体和关系,适合复杂关系查询。

Cypher
// Neo4j 查询示例:找到张三的朋友的朋友
MATCH (zhangsan:Person {name: "张三"})-[:FRIEND]->()-[:FRIEND]->(fof)
RETURN fof.name

适用场景: - 社交网络 - 知识图谱 - 推荐系统

2.3 SQL vs NoSQL 对比

特性 SQL (关系型) NoSQL (非关系型)
数据模型 固定的表结构 灵活的结构
Schema 预定义,严格 动态,灵活
查询语言 SQL 各产品不同
事务支持 完整的ACID 最终一致性
扩展性 垂直扩展为主 水平扩展容易
适用数据 结构化数据 非结构化/半结构化
最佳场景 复杂查询、事务 大数据、高并发

2.4 如何选择?

选择关系型数据库(SQL): - 数据结构清晰、固定 - 需要复杂查询和事务 - 数据一致性要求高 - 典型场景:金融系统、ERP、传统Web应用

选择非关系型数据库(NoSQL): - 数据结构多变 - 需要高并发读写 - 海量数据存储 - 典型场景:实时系统、缓存、日志、AI应用

AI项目中的选择建议

Text Only
训练数据管理      →  PostgreSQL/MySQL(结构化)
实验追踪元数据    →  MongoDB(灵活结构)
模型预测缓存      →  Redis(高速缓存)
特征存储         →  Cassandra/Redis(高并发)
向量检索         →  Pinecone/Milvus(专用向量DB)


3. 数据库核心概念

3.1 表(Table)

表是关系型数据库中存储数据的基本单位,由行(Row)列(Column)组成。

Text Only
表名:students(学生表)

┌────────┬──────────┬────────┬────────────┐
│   id   │   name   │  age   │   major    │  ← 列(Column)= 字段
├────────┼──────────┼────────┼────────────┤
│   1    │   张三   │   20   │  Computer  │  ← 行(Row)= 记录
│   2    │   李四   │   22   │    Math    │
│   3    │   王五   │   21   │  Physics   │
└────────┴──────────┴────────┴────────────┘

术语对照: | 术语 | 说明 | 类比 | |-----|------|------| | 表(Table) | 数据的集合 | Excel工作表 | | 行(Row) | 一条记录 | Excel的一行 | | 列(Column) | 一个字段 | Excel的一列 | | 字段(Field) | 列的另一种说法 | - | | 记录(Record) | 行的另一种说法 | - |

3.2 主键(Primary Key)

主键是表中唯一标识每条记录的字段。

主键的特点: - ✅ 唯一性:每条记录的主键值都不同 - ✅ 非空性:主键不能为空 - ✅ 不可重复:不能有两条记录有相同的主键

SQL
-- 创建表时定义主键
CREATE TABLE students (
    id INT PRIMARY KEY,        -- id 是主键
    name VARCHAR(50),
    age INT
);

-- 主键示例
id: 1, 2, 3, 4, 5...  每个学生的id都不同

主键的选择策略

Python
# 策略1:自然主键(使用业务字段)
# 优点:有意义
# 缺点:可能变化(如身份证号升级)
PRIMARY KEY (id_card_number)

# 策略2:代理主键(自增数字)- 推荐
# 优点:简单、稳定、性能高
PRIMARY KEY (id AUTO_INCREMENT)

# 策略3:UUID
# 优点:全局唯一,适合分布式
# 缺点:占用空间大,性能稍差
PRIMARY KEY (uuid VARCHAR(36))

3.3 外键(Foreign Key)

外键用于建立表与表之间的关系。

SQL
-- 学生表
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 成绩表
CREATE TABLE scores (
    score_id INT PRIMARY KEY,
    student_id INT,                          -- 外键
    subject VARCHAR(50),
    score DECIMAL(5,2),
    FOREIGN KEY (student_id) REFERENCES students(student_id)
    -- 表示:scores表的student_id必须存在于students表中
);

外键的作用: 1. 保证数据一致性:不能删除有成绩的学生 2. 建立关联:通过外键可以JOIN查询关联数据 3. 级联操作:删除学生时自动删除其成绩

3.4 索引(Index)

索引是加速数据查询的数据结构,类似书的目录。

Text Only
没有索引的查询(全表扫描):
查找 age = 20 的学生
→ 检查第1行:age=20?否
→ 检查第2行:age=20?否
→ 检查第3行:age=20?是 ✓
→ 检查第4行:age=20?否
→ ... 检查100万行

有索引的查询:
查找 age = 20 的学生
→ 查索引:age=20 在第3行
→ 直接定位到第3行 ✓

索引的优缺点: - ✅ 优点:查询速度提升10-1000倍 - ❌ 缺点:占用存储空间,降低写入速度

什么时候创建索引: - 频繁作为查询条件的字段 - 经常用于JOIN的字段 - 经常用于排序的字段

SQL
-- 创建索引
CREATE INDEX idx_age ON students(age);  -- INDEX索引加速查询

-- 创建联合索引
CREATE INDEX idx_name_age ON students(name, age);

3.5 数据库Schema

Schema是数据库的结构定义,包括: - 有哪些表 - 每个表有哪些字段 - 字段的数据类型 - 约束条件(主键、外键、唯一性等)

SQL
-- 一个完整的Schema示例
CREATE DATABASE school;

USE school;

CREATE TABLE students (
    student_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,    -- 唯一约束
    age INT CHECK (age >= 0),     -- 检查约束
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE courses (
    course_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    credits INT
);

CREATE TABLE enrollments (
    enrollment_id INT PRIMARY KEY AUTO_INCREMENT,
    student_id INT,
    course_id INT,
    grade DECIMAL(4,2),
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id),
    UNIQUE(student_id, course_id)  -- 一个学生不能重复选同一门课
);

4. 常见数据库产品

4.1 关系型数据库

数据库 特点 适用场景 学习建议
MySQL 开源、流行、社区大 Web应用、中小型项目 ⭐ 首选学习
PostgreSQL 功能强大、标准兼容 复杂查询、GIS、AI项目 ⭐ 进阶学习
SQLite 嵌入式、零配置 本地开发、测试、小型应用 ⭐ 快速上手
Oracle 企业级、商业软件 大型企业、金融 按需学习
SQL Server 微软生态 Windows环境、企业应用 按需学习

4.2 非关系型数据库

数据库 类型 特点 适用场景
MongoDB 文档型 灵活Schema、JSON存储 内容管理、AI元数据
Redis 键值型 内存存储、极速读写 缓存、会话、实时系统
Cassandra 列族型 分布式、高可用 时序数据、大数据
Neo4j 图数据库 关系查询高效 社交网络、知识图谱
Elasticsearch 搜索引擎 全文检索、分析 日志分析、搜索

4.3 AI专用数据库

数据库 类型 特点 适用场景
Pinecone 向量数据库 托管服务、易用 语义搜索、推荐
Milvus 向量数据库 开源、高性能 大规模向量检索
Weaviate 向量数据库 支持多种模型 AI原生应用
Chroma 向量数据库 轻量、易集成 LLM应用、RAG

5. 数据库在AI项目中的作用

5.1 训练数据管理

Python
# ❌ 传统做法:文件系统
# data/
#   train/
#     cat/
#       cat_001.jpg
#       cat_002.jpg
#     dog/
#       dog_001.jpg

# 问题:
# - 如何快速筛选高质量样本?
# - 如何记录数据增强历史?
# - 如何管理多版本数据集?

# ✅ 数据库做法
# 使用数据库存储元数据,文件系统存储实际数据

# 查询高质量训练样本
SELECT image_path, label
FROM training_samples
WHERE quality_score > 0.8
  AND augmented = FALSE
  AND dataset_version = 'v2.0'
LIMIT 10000;

5.2 实验追踪

Python
# 使用数据库存储实验信息
import sqlite3
import json
from datetime import datetime

def log_experiment(config, metrics, model_path):
    conn = sqlite3.connect('experiments.db')

    conn.execute("""
        INSERT INTO experiments
        (model_name, config, accuracy, loss, model_path, created_at)
        VALUES (?, ?, ?, ?, ?, ?)
    """, (
        config['model_name'],
        json.dumps(config),
        metrics['accuracy'],
        metrics['loss'],
        model_path,
        datetime.now()
    ))

    conn.commit()
    conn.close()

# 查询最佳实验
# SELECT * FROM experiments WHERE model_name = 'ResNet50' ORDER BY accuracy DESC LIMIT 5

5.3 模型服务

Python
# 预测结果缓存
import redis
import hashlib

redis_client = redis.Redis(host='localhost', port=6379)

def predict_with_cache(model, input_data):
    # 计算输入的哈希值
    input_hash = hashlib.md5(str(input_data).encode()).hexdigest()

    # 先查缓存
    cached = redis_client.get(f"pred:{input_hash}")
    if cached:
        return json.loads(cached)  # 缓存命中,直接返回

    # 缓存未命中,执行预测
    result = model.predict(input_data)

    # 存入缓存(设置1小时过期)
    redis_client.setex(
        f"pred:{input_hash}",
        3600,
        json.dumps(result)  # json.dumps将Python对象转为JSON字符串
    )

    return result

5.4 特征存储(Feature Store)

Python
# 特征存储架构
#
# 离线特征(批量计算,存储在数据仓库)
# - 用户历史行为统计
# - 商品属性特征
#
# 在线特征(实时计算,存储在Redis)
# - 用户实时点击
# - 当前会话特征

# 从特征存储获取特征
features = feature_store.get_features(
    entity_type="user",
    entity_id=user_id,
    feature_names=["avg_purchase_amount", "last_visit_category", "total_orders"]
)

# 用于模型推理
prediction = model.predict(features)

🎯 本章自测

完成以下问题,检验你的理解:

概念理解

  1. 什么是数据库?它和文件存储有什么区别?
  2. 关系型数据库和非关系型数据库的主要区别是什么?
  3. 主键和外键分别有什么作用?
  4. 索引的作用是什么?有什么代价?

场景分析

  1. 以下场景应该选择什么类型的数据库?
  2. 电商网站的订单系统
  3. AI实验的元数据管理
  4. 模型预测结果缓存
  5. 实时推荐系统的用户行为日志

  6. 设计一个学生选课系统的数据库,需要哪些表?表之间的关系是什么?

实践准备

  1. 在你的电脑上安装MySQL或PostgreSQL,尝试连接数据库。
  2. 使用DBeaver或命令行客户端,查看数据库中有哪些默认数据库。

📚 扩展阅读

推荐资源

下一步

完成本章后,继续学习 第02章:SQL核心语法,开始编写你的第一条SQL语句!


本章完 | 预计学习时间:2-3小时


📚 参考文献

核心论文

关系型数据库

  1. A Relational Model of Data for Large Shared Data Banks - Codd, 1970
  2. 关系型数据库的奠基之作

  3. The Transaction Concept: Virtues and Limitations - Gray, 1981

  4. 事务处理的经典论文

  5. Access Path Selection in a Relational Database Management System - Selinger et al., 1979

  6. 查询优化的经典算法

  7. A History and Evaluation of System R - Chamberlin et al., 1981

  8. System R的历史与评估

  9. The Design of XFS - Sweeney et al., 2000

  10. XFS文件系统设计

NoSQL数据库

  1. Dynamo: Amazon's Highly Available Key-value Store - DeCandia et al., 2007
  2. Dynamo论文,NoSQL的奠基之作

  3. Bigtable: A Distributed Storage System for Structured Data - Chang et al., 2006

  4. Bigtable论文

  5. The Chubby Lock Service for Loosely-Coupled Distributed Systems - Burrows, 2006

  6. Chubby锁服务

  7. Cassandra: A Decentralized Structured Storage System - Lakshman & Malik, 2010

  8. Cassandra论文

  9. MongoDB: A Modern Database - Chodor et al., 2018

    • MongoDB论文

向量数据库

  1. Faiss: A Library for Efficient Similarity Search and Clustering of Dense Vectors - Johnson et al., 2017

    • Faiss论文
  2. Pinecone: A Vector Database for Machine Learning - Pinecone团队

    • 向量数据库综述
  3. Milvus: A Purpose-Built Vector Database for Large-Scale Vector Similarity Search - Wang et al., 2020

    • Milvus论文

索引与优化

  1. The Art of Computer Programming, Volume 3: Sorting and Searching - Knuth, 1998

    • 排序和搜索的权威教材
  2. The B-Tree: An Efficient Multi-User Search Tree - Bayer & McCreight, 1970

    • B-Tree论文

技术博客

中文博客

英文博客

开源项目

关系型数据库

  • MySQL - 开源关系型数据库
  • PostgreSQL - 开源对象关系型数据库
  • SQLite - 嵌入式关系型数据库
  • MariaDB - MySQL的开源分支
  • TiDB - 分布式关系型数据库

NoSQL数据库

向量数据库

  • Faiss - Facebook相似性搜索库
  • Milvus - 开源向量数据库
  • Chroma - 开源向量数据库
  • Qdrant - 高性能向量数据库
  • Weaviate - AI原生向量数据库

数据库工具

参考书籍

中文书籍

  1. 《数据库系统概念》- Abraham Silberschatz、Henry F. Korth、S. Sudarshan 著,机械工业出版社
  2. 数据库领域的经典教材

  3. 《SQL必知必会》- Ben Forta 著,人民邮电出版社

  4. SQL入门经典教材

  5. 《高性能MySQL》- [美] Baron Schwartz 等著,电子工业出版社

  6. MySQL性能优化权威指南

  7. 《PostgreSQL实战》- 谭峰 著,机械工业出版社

  8. PostgreSQL实践指南

  9. 《MongoDB权威指南》- Kristina Chodorow 著,人民邮电出版社

  10. MongoDB权威指南

  11. 《Redis设计与实现》- 黄健宏 著,机械工业出版社

  12. Redis源码分析

  13. 《数据库索引设计与优化》- [美] Tapio Lahdenmäki 著,电子工业出版社

  14. 索引设计权威指南

  15. 《深入理解计算机系统》- Randal E. Bryant、David R. O'Hallaron 著,机械工业出版社

  16. 系统级理解数据库

英文书籍

  1. "Database System Concepts" - Abraham Silberschatz, Henry F. Korth, S. Sudarshan
  2. McGraw-Hill,数据库领域的经典教材

  3. "SQL for Smarties" - Robert J. Muller

  4. Morgan Kaufmann,SQL高级技巧

  5. "High Performance MySQL" - Baron Schwartz, Peter Zaitsev, Vadim Tkachenko

  6. O'Reilly,MySQL性能优化权威指南

  7. "PostgreSQL: Up and Running" - Regina Obe, Leo Hsu

  8. O'Reilly,PostgreSQL实践指南

  9. "MongoDB: The Definitive Guide" - Kristina Chodorow

  10. O'Reilly,MongoDB权威指南

  11. "Redis in Action" - Josiah L. Carlson

  12. Manning,Redis实践指南

  13. "Designing Data-Intensive Applications" - Martin Kleppmann

  14. O'Reilly,数据密集型应用设计

  15. "Seven Databases in Seven Weeks" - Eric Redmond, Jim R. Wilson

  16. Pragmatic Bookshelf,多数据库对比

在线课程

B站推荐

💡 以下为推荐的搜索关键词,请在B站直接搜索获取最新内容。

推荐搜索关键词: - "MySQL 入门教程 2024"、"SQL 基础语法" - "PostgreSQL 教程"、"Redis 入门到精通" - "数据库原理 讲解"、"事务与索引 详解" - "MongoDB 教程"、"数据库面试题"

英文课程

社区资源

中文社区

英文社区

论坛与问答

邮件列表与Slack