首页
/ CS 自学指南 · Stanford CS346:用 RedBase 组件化地实现一个关系型数据库

CS 自学指南 · Stanford CS346:用 RedBase 组件化地实现一个关系型数据库

2026-09-06 17:57:16作者:凌朦慧Richard

Stanford CS346 是一门以“从零实现数据库”为核心训练方式的课程,其配套项目 RedBase 将完整的关系型数据库拆分为记录管理、索引、系统管理、查询语言与扩展五个高度结构化的组件,分别对应 4 个需要亲手完善的 Lab。本篇指南将带你梳理 RedBase 的项目结构、各组件与真实数据库架构层的映射关系,以及它在本仓库数据库学习路线中“接棒 CMU 15-445”的定位与扩展课题选择策略,帮助你在约 150 学时的投入后具备自底向上构建一个可运行数据库系统的能力。

课程定位:一门“实现型”数据库课

cs-self-learning 自学指南的“数据库系统”模块中,CS346 被安排在 CMU 15-445 之后,作为数据库实现方向的延续。课程的基本信息如下(继承自 CS346 课程文档):

项目 内容
所属大学 Stanford
先修要求
编程语言 C++
课程难度 🌟🌟🌟🌟🌟
预计学时 150 小时
课程教材
课程作业 4 Projects + 1 Extension

需要特别注意两个特点:

  • 课程没有教材。这门课的教学载体就是 RedBase 项目本身——课程代码仓库(由 junkumar 维护的 RedBase 仓库)加上课程官网(Stanford CS346 2015 版页面)构成全部学习资料,学习过程以“阅读项目骨架 + 按 Lab 实现缺失部分”为主线。
  • RedBase 本身是一个“半成品”数据库。它在仓库中以高度结构化的方式预置了接口与框架代码,五个组件(见下节)分别留给学生去完善,这也是四个 Lab 的划分依据。

RedBase 的整体结构:五个组件对应数据库的五个层次

RedBase 是整个项目的灵魂与主体。它被设计成一个简易但完整的关系型数据库,可以拆分为以下五个部分——前四个部分对应必须完成的 4 个 Lab,第五个部分对应 1 个开放的 Extension:

  1. The record management component(记录管理组件):实现记录管理功能,即数据库的存储层——数据如何组织成记录、如何在文件与页面(page)粒度上读写与寻址。
  2. The index component(索引组件):实现 B+ 索引管理,为记录提供基于键的快速查找路径,是主存之外磁盘存储访问的核心加速结构。
  3. The System Management Component(系统管理组件):实现 DDL 语句、命令行工具、数据加载命令与元数据管理——相当于数据库的“数据字典 + 管理控制台”层。
  4. The Query Language Component(查询语言组件):实现 RQL(Redbase Query Language),需要覆盖 selectinsertdeleteupdate 四类语句,把上层语句翻译为对存储层与索引层的调用。
  5. Extension Component(扩展组件):在完成上述基本功能组件之后,再自选一个方向做扩展,可选实现包括 Blob 类型、网络模块、连接(Join)算法、CBO 优化器、OLAP、事务等。

从组件划分方式可以看出,RedBase 有意按数据库系统架构的自然分层来切分工作量:记录管理是最底层的存储引擎,索引建立在其之上,系统管理组件维护表结构与元数据并对外提供命令行入口,查询语言组件位于最上层完成解析与执行,扩展组件则允许学生向架构的任意深度继续延伸。这种分层使得每个 Lab 的输入输出边界都比较清晰:底层组件先落地,上层组件在后续 Lab 中逐步“点亮”整个系统。

记录管理组件:一切的地基

记录管理组件要求你实现记录的存储与访问。按照通用数据库系统的组织方式,这意味着要处理记录在存储页(page)中的布局、定长/变长数据的组织、以及按记录标识进行定位等操作。它是整个 RedBase 最基础的部件——后续的 B+ 索引、RQL 的 select/delete 最终都要落到记录管理提供的读写上。

索引组件:B+ 树索引管理

第二个 Lab 聚焦 B+ 索引。B+ 树是关系型数据库中最典型的主索引结构:内部节点只负责引导方向,数据全部落在有序排列的叶子层,天然支持等值查找与范围扫描。实现它需要覆盖插入、分裂、查找等核心路径,正好与 CMU 15-445 中 B+ 树 Project 的训练目标呼应——如果你已经做过 15-445 的 B+ 树,这里的实现会显著轻松,可以把精力留给 RedBase 特有的工程组织方式。

系统管理组件:DDL、元数据与命令行

第三个组件覆盖数据库的“管理面”:

  • DDL 语句CREATE/DROP 一类表结构变更语句,意味着要维护表定义、列定义等结构信息;
  • 元数据管理:即数据字典——表的 schema 从哪里来、如何持久化与读取,由这个组件统一维护;
  • 数据加载命令:把外部数据批量装载进数据库的入口;
  • 命令行工具:RedBase 对外交互的界面,也是你调试前两个组件时最直接的观测手段——做完记录管理与索引之后,可以通过命令行工具验证自己的实现是否可用。

查询语言组件:RQL 与四类语句

查询语言组件要求实现 RQL(Redbase Query Language),范围限定为 selectinsertdeleteupdate 四类语句。这部分的工作是把语句解析为内部表示,再驱动记录管理组件与索引组件完成执行。值得注意的定位差异是:RedBase 的查询语言是一个简化的私有语言(RQL),而不是完整 SQL,解析与执行链路比真实 SQL 引擎短得多,但“解析 → 内部表示 → 执行”这条主线与真实数据库一致,适合作为第一次接触查询层实现的练手对象。

为什么推荐把它放在 CMU 15-445 之后学

CS346 文档给出的定位很明确:RedBase 适合在学完 CMU 15-445 后继续学习数据库系统中的其他组件。理由有三点:

  1. 代码量不多,可以方便地按需扩展。RedBase 的骨架代码规模克制,留白即 Lab 边界,扩展一个功能时不容易被庞大的既有实现淹没。
  2. C++ 全栈练习。RedBase 完全由 C++ 编写,与 15-445 的 bustub 同属 C++ 项目,在连续做两个 C++ 数据库项目的过程中,现代 C++(C++11 及以后特性)、内存管理、构建与测试的工程习惯会得到持续打磨。
  3. 补上 15-445 未覆盖的组件。对照本仓库内几门数据库实现课的训练范围,可以很直观地看到各课在数据库架构图谱上的“领地”:
课程 语言 重点实现内容
CMU 15-445 C++ Buffer Pool Manager(内存管理)、B+ 树(存储引擎)、Query Executors & Optimizer(算子与优化器)、Concurrency Control(并发控制)
Caltech CS122 Java SQL 层:SQL 解析与 Translate、Join 计划节点、统计信息与代价估计、谓词选择性,外加 B+ 树与 WAL 相关实验
UCB CS186 Java 支持 SQL 并发查询、B+ 树 Index 和故障恢复的完整关系型数据库
Stanford CS346(RedBase) C++ 记录管理、B+ 索引、DDL 与元数据、RQL 查询语言、自由扩展(事务/优化器/OLAP 等)

从这张对照可以推断:15-445 主攻“执行引擎 + 并发”深水区,CS122 主攻“SQL 解析与代价优化”,而 CS346 的四个 Lab 恰好补上记录存储、元数据/DDL、查询语言这几块,并额外用一个 Extension 把选择权交还给你。三者的组合,正好拼出一个覆盖存储、索引、执行、优化、管理各层的关系型数据库全貌。如果你希望再往后走一步,本仓库还有 CMU 15-799 这类数据库专题课程可以衔接。

四个 Lab 的推进方式与扩展课题选择

Lab 推进顺序:自底向上

四个 Lab 与四个基本组件一一对应。从组件依赖关系看,自然的推进顺序是记录管理 → 索引 → 系统管理 → 查询语言:先把存储层做实,再在其上建索引,随后用 DDL 与命令行把表结构和数据装载进来,最后让 RQL 四类语句跑通端到端查询。这样的顺序与 RedBase“高度结构化”的项目设计一致——每个 Lab 的产物都是下一个 Lab 的依赖,做完一个 Lab,系统就能多“点亮”一层可观测的功能。

实操建议:

  • 全程使用 C++(项目本身完全由 C++ 编写,建议以现代 C++ 标准开发,并配合 CMake 等构建工具组织编译——本仓库的 CMake 指南 可作为构建环境搭建的参考);
  • 每完成一个组件,用系统管理组件的命令行工具做冒烟验证(建表、装载数据、按索引查找记录),尽早暴露底层错误,避免问题堆积到查询语言层;
  • 150 小时是整门课的预计总学时,包含阅读、实现与调试,可按“四个 Lab 为主、Extension 为次”做粗粒度的时间预算,把余量留给 B+ 树分裂与 RQL 执行这类最容易反复调试的部分。

Extension 选择:按你想深入的方向做

第五个部分(Extension Component)要求在基本功能之外自选实现一个扩展,文档列出的可选项包括:Blob 类型、网络模块、连接(Join)算法、CBO 优化器、OLAP、事务等。不同选项对应不同的成长方向:

  • 事务(Transactions):补齐并发与恢复方向的能力,与 15-445 的 Concurrency Control Project 形成呼应,是系统完备性收益最大的一项;
  • CBO 优化器 / Join 算法:向查询优化方向延伸,与 CS122 的统计信息与代价估计训练衔接紧密,适合想深耕查询引擎的同学;
  • Blob 类型:扩展存储层对非结构化/大对象数据的支持,训练的是类型系统与存储布局设计;
  • 网络模块:把单进程数据库升级为客户端-服务端架构,引入网络编程视角;
  • OLAP:面向分析型负载做扩展,打开分析型数据库的入口。

选择建议:如果目标是“做出一个尽量完整的数据库”,优先事务;如果目标是“向优化器方向转型”,优先 CBO/Join;如果想拓宽数据类型与存储设计能力,选 Blob。

课程资源清单

以下内容完整继承自 CS346 文档 的课程资源小节,供检索与准备环境时使用(按指南要求,正文不直接给出外部网址,请按名称自行检索):

  • 课程网站:Stanford CS346 2015 版课程主页(CS346, Database System Implementation),包含讲义、Lab 说明等全部教学资料;
  • 课程代码:junkumar 维护的 RedBase 仓库(junkumar/redbase),克隆到本地后即可按 Lab 逐步补全四个组件;
  • 课程教材:无——本项目制课程以代码仓库与 Lab 文档为学习材料;
  • 课程作业:4 Projects + 1 Extension,即前文所述的四个基本组件 Lab 加一个自由扩展。

小结

CS346 在数据库实现类课程中的独特价值,在于它用一套规模克制、结构高度清晰的 C++ 项目(RedBase),把“记录管理、B+ 索引、DDL 与元数据、查询语言”这四块在 CMU 15-445 之外的组件训练补齐,并留出一个 Extension 让学生自选纵深方向(事务、CBO 优化器、OLAP、Blob、网络等)。完成本课后,你获得的不仅是一个能跑 select/insert/delete/update 的迷你数据库,而是一张覆盖存储层到查询层的关系型数据库组件地图。建议把它与 CMU 15-445Caltech CS122 组合阅读与排期,在本指南的数据库系统模块中按“执行引擎 → SQL 层 → 存储与系统管理”的顺序推进,即可系统性地完成数据库实现方向的自学闭环。

登录后查看全文
热门项目推荐
相关项目推荐