RisingLight Tutorial

RisingLight 是一个 Rust 语言编写的单机分析型(OLAP)数据库系统。

在这个教程中,我们将会带领大家从零开始,一步一步地实现自己的数据库! 从一个最简单的 SQL 解析器开始,逐步实现查询引擎、存储引擎、优化器和事务,最终能够运行工业级的 TPC-H 基准测试。

除了标准教科书上的内容以外,你还可以体验到业界最前沿的流式计算引擎 lol。

为何要做这个教程

随着数据库系统技术的快速发展(云原生数据库,HTAP一体化和智能化运维等),工业界对于数据库内核开发人员的需求与日俱增。 对于尝试进入数据库系统领域的初学者,一个最大的挑战就是如何系统地了解数据库内核的并掌握数据库内核的开发能力。 然而大多数高校的计算机本科数据库课程只会涉及SQL和数据库应用的相关知识,市面上讲解工业级数据库的书籍和文章也不适合初学者入门。 虽然很多数据库系统课程有公开的课程项目,但这些项目往往是以“代码填空”的形式呈现给大家。 著名的美国理论物理学家Richard Feynman曾经说过:"What I cannot create, I do not understand"。 学习数据库系统内核的最佳方法无疑是自己从零实现一个迷你数据库系统,我们希望数据库系统领域的初学者,可以根据此教程实现自己的数据库系统 ,在了解数据库系统内核相关知识的同时提高自己的工程能力。并鼓励大家在未来为开源数据库系统(包括但不限于RisingLight和RisingWave)贡献自己的力量。

RisingLight 世界地图

如何学习本教程

正如你所见,整个 RisingLight 是一个广阔的开放世界! 在这里你可以按照自己的兴趣,选择任意一种可行的路径来完成这个数据库的开发。 当然如果你喜欢按部就班的节奏,我们也提供一条推荐的主线路径供大家参考。

RisingLight 根据数据库中的不同方向,分成了若干小世界。它们整体上相对独立,但相互之间又有千丝万缕的关联。 每个世界由很多小任务组成,在每个任务中我们会实现一个功能。而每个功能我们都会提供一系列的标准 SQL 语句作为测试,只要通过了全部测试就算完成了这个任务!

例如在第一个任务中,我们提供的测试语句是:

SELECT 'Hello, world!'

它的期望输出是:

Hello, world!

只要你的程序对于给定的输入,能够给出正确的输出,我们就认为你正确实现了这一功能。

这种方法叫做 端到端测试(End-to-End Testing)。你可以使用任何一种方法来通过测试,并且我们鼓励大家大开脑洞去尝试不同的实现方式。

当然,在没有任何提示的情况下独立完成整个系统的设计与实现是相当困难的,但这也是对能力提高非常有帮助的。 我们欢迎对自己能力有信心的大佬们来挑战这个 Hard 模式,收获更多经验值!

对于其他同学来说,我们会带领大家完成系统的整体设计,提示一些关键的实现细节,并提供必要的框架代码, 由同学们自行实现剩下的部分。这种是类似其它教程所采用的 Normal 模式

不过更为实际的情况是,在这个教程出来一段时间之后,社区中一定会涌现出大量的优秀作业供大家参考。 考虑到这点,我们干脆直接公开每个任务的完整代码,官方提供《RisingLight 源码解析》。 赶时间的朋友就不用亲自下场写代码了,直接来玩适合快速通关的 Easy 模式 吧。

以上三种模式,同学们可以根据自己的情况,选择适合自己的方式来完成每个任务。 需要提醒大家的是,付出和收获往往是成正比的,我们鼓励大家在力所能及的范围内去做更有挑战性的尝试。

为了这种难度的区别,每个任务的文档会分为以下几个部分:

  1. 背景知识:介绍完成任务所必须掌握的知识,提供参考资料
  2. 任务目标:描述任务需要完成的内容,需要通过的测试
  3. 整体设计:介绍代码框架和需要注意的细节
  4. 源码解析:详细介绍实现代码

如果你想挑战 Hard,那么看到 2 就可以开始动手了;如果你选择 Normal,那么还可以继续看完 3;而如果你是 Easy 玩家,那就看完全部文档吧!