数据库系统概述

数据库系统(Database Management System, DBMS)是用于存储、管理和处理大规模数据的软件系统。

数据库系统的组成

应用程序 ←→ DBMS ←→ 数据库
              ↓
         数据库管理员(DBA)

数据模型

层次模型

树形结构,IBM的IMS系统采用此模型。

网状模型

图结构,允许一个节点有多个父节点。

关系模型

二维表(Relation)为核心的数据模型。

student_idnameagemajor
001张三20CS
002李四21Math
003王五19Physics

SQL基础

DDL(数据定义语言)

-- 创建表
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    major VARCHAR(50)
);
 
-- 修改表结构
ALTER TABLE students ADD COLUMN email VARCHAR(100);
ALTER TABLE students DROP COLUMN age;
 
-- 删除表
DROP TABLE students;

DML(数据操作语言)

-- 插入数据
INSERT INTO students (student_id, name, major) 
VALUES (1, '张三', 'CS');
 
-- 查询数据
SELECT name, major FROM students WHERE major = 'CS';
 
-- 更新数据
UPDATE students SET name = '李四' WHERE student_id = 2;
 
-- 删除数据
DELETE FROM students WHERE student_id = 3;

DCL(数据控制语言)

-- 授权
GRANT SELECT, INSERT ON students TO user1;
 
-- 撤销权限
REVOKE INSERT ON students FROM user1;

关系代数

基本运算

运算符号说明
选择筛选行
投影筛选列
行合并
行相减
笛卡尔积行组合
连接条件连接

示例

选择年龄大于20的学生:

投影学生的姓名和专业:

索引

B+树索引

B+树是数据库最常用的索引结构:

// B+树节点结构(简化)
struct BPlusNode {
    bool is_leaf;
    vector<int> keys;
    vector<BPlusNode*> children;  // 或叶子节点的指针
    BPlusNode* next;  // 叶子节点链表指针
    
    // 对于叶子节点,还存储数据指针
    vector<void*> values;
};

索引类型

类型特点适用场景
主键索引唯一非空主键查询
唯一索引唯一唯一性约束
普通索引可重复加速查询
全文索引文本搜索文章内容
组合索引多列多列查询

事务

ACID特性

特性说明
Atomicity(原子性)事务要么全做,要么全不做
Consistency(一致性)事务执行前后数据库状态一致
Isolation(隔离性)并发事务相互隔离
Durability(持久性)事务提交后永久生效

并发控制

锁机制

// 简化的锁管理器
class LockManager {
    unordered_map<string, vector<string>> table_locks;  // 表级锁
    unordered_map<string, vector<string>> row_locks;     // 行级锁
    
public:
    void lock_shared(int transaction_id, const string& table) {
        table_locks[table].push_back("S" + to_string(transaction_id));
    }
    
    void lock_exclusive(int transaction_id, const string& table) {
        table_locks[table].push_back("X" + to_string(transaction_id));
    }
    
    bool can_lock(const string& table, const string& lock_type) {
        // 检查是否有冲突锁
        for (const auto& lock : table_locks[table]) {
            if (lock[0] == 'X' || lock_type[0] == 'X') return false;
        }
        return true;
    }
};

MVCC(多版本并发控制)

struct Version {
    int version_id;
    int transaction_id;
    string data;
    bool committed;
    Version* next;
};
 
class MVCCStore {
    unordered_map<string, Version*> versions;  // key -> 版本链
    
public:
    string read(const string& key, int transaction_id) {
        Version* v = versions[key];
        while (v) {
            if (v->committed && v->transaction_id < transaction_id) {
                return v->data;
            }
            v = v->next;
        }
        return "";  // 未找到
    }
    
    void write(const string& key, const string& data, int transaction_id) {
        Version* new_v = new Version{version_id++, transaction_id, 
                                     data, false, versions[key]};
        versions[key] = new_v;
    }
};

规范化

范式级别

范式要求
1NF字段不可再分
2NF消除部分依赖
3NF消除传递依赖
BCNF消除主键依赖

示例

不符合2NF的表:

students_courses (student_id, course_id, student_name, course_name, grade)
                              ↑ 部分依赖     ↑ 部分依赖

分解为:

students (student_id, student_name)
courses (course_id, course_name)  
student_courses (student_id, course_id, grade)

查询优化

查询执行计划

EXPLAIN SELECT * FROM students WHERE major = 'CS';

优化器策略

  1. 选择操作尽早执行:减少中间结果
  2. 投影操作尽早执行:减少列数
  3. 利用索引:加速查找
  4. 避免笛卡尔积:使用连接条件

参考