Skip to content

bosswnx/miniob-2023

MiniOB 概述

MiniOB 是 OceanBase 团队基于华中科技大学数据库课程原型,联合多所高校重新开发的、专为零基础的同学设计的数据库入门学习项目。我们的目标是为在校学生、数据库从业者、爱好者或对基础技术感兴趣的人提供一个友好的数据库学习项目。

MiniOB 整体代码简洁,容易上手,设计了一系列由浅入深的题目,帮助同学们从零基础入门,迅速了解数据库并深入学习数据库内核。MiniOB 简化了许多模块,例如不考虑并发操作、安全特性和复杂的事务管理等功能,以便更好地学习数据库实现原理。我们期望通过 MiniOB 的训练,同学们能够熟练掌握数据库内核模块的功能和协同关系,并具备一定的工程编码能力,例如内存管理、网络通信和磁盘 I/O 处理等, 这将有助于同学在未来的面试和工作中脱颖而出。

代码配套文档和相关代码注释已经生成文档,并通过 GitHub Pages 发布。您可以直接访问:MiniOB GitHub Pages.

快速上手

为了帮助开发者更好地上手并学习 MiniOB,建议阅读以下内容:

  1. MiniOB 框架介绍
  2. 如何编译 MiniOB 源码
  3. 如何运行 MiniOB
  4. 使用 GitPod 开发 MiniOB
  5. doxygen 代码文档

为了帮助大家更好地学习数据库基础知识,OceanBase社区提供了一系列教程。更多文档请参考 MiniOB GitHub Pages。建议学习:

  1. 《从0到1数据库内核实战教程》 视频教程
  2. 《从0到1数据库内核实战教程》 基础讲义
  3. 《数据库管理系统实现》 华中科技大学实现教材

系统架构

MiniOB 整体架构如下图所示: 架构

其中:

  • 网络模块:负责与客户端交互,收发客户端请求与应答;

  • SQL解析:将用户输入的SQL语句解析成语法树;

  • 执行计划缓存:执行计划缓存模块会将该 SQL第一次生成的执行计划缓存在内存中,后续的执行可以反复执行这个计划,避免了重复查询优化的过程(未实现)。

  • 语义解析模块:将生成的语法树,转换成数据库内部数据结构(部分实现);

  • 查询缓存:将执行的查询结果缓存在内存中,下次查询时,可以直接返回(未实现);

  • 查询优化:根据一定规则和统计数据,调整/重写语法树。(部分实现);

  • 计划执行:根据语法树描述,执行并生成结果;

  • 会话管理:管理用户连接、调整某个连接的参数;

  • 元数据管理:记录当前的数据库、表、字段和索引元数据信息;

  • 客户端:作为测试工具,接收用户请求,向服务端发起请求。

2022 OceanBase 数据库大赛是由中国计算机学会(CCF)数据库专业委员会指导,OceanBase 与蚂蚁技术研究院学术合作团队联合举办的数据库内核实战赛事。本次大赛主要面向全国爱好数据库的高校学生,以“竞技、交流、成长”为宗旨,搭建基于赛事的技术交流平台,促进高校创新人才培养机制,不仅帮助学生从0开始系统化学习数据库理论知识,提升学生数据库实践能力,更能帮助学生走向企业积累经验,促进国内数据库人才的发展,碰撞出创新的火花。

OceanBase 初赛基于一套适合初学者实践的数据库实训平台 MiniOB,代码量少,易于上手学习,包含了数据库的各个关键模块,是一个系统性的数据库学习平台。基于该平台设置了一系列由浅入深的题目,以帮助同学们更好"零"基础入门。

2023 OceanBase 数据库大赛正在火热进行, 更多详情, 请参考 OceanBase 大赛

1. 大赛手把手入门教程

大赛入门教程

2. 大赛赛题

赛题介绍

3. 提交测试

题目完成并通过自测后,大家可以在 MiniOB 训练营 上提交代码进行测试。

在提交前, 请参考并学习 训练营使用说明

4. 大赛FAQ

大赛 FAQ

在线开发平台

本仓库基于 Gitpod 建立了快速在线开发平台。点击下面的按钮即可一键体验(建议使用 Chrome 浏览器)。

Open in Gitpod

首次进入 Gitpod 时需要安装一些依赖。安装完成后,终端界面会显示 "Dependency installed successfully"。运行 bash build.sh --make -j4 命令即可编译 MiniOB。

Contributing

OceanBase 社区热情欢迎每一位对数据库技术热爱的开发者,期待与您携手开启思维碰撞之旅。无论是文档格式调整或文字修正、问题修复还是增加新功能,都是参与和贡献 OceanBase 社区的方式之一。现在就开始您的首次贡献吧!更多详情,请参考 社区贡献.

License

MiniOB 采用 木兰宽松许可证,第2版, 可以自由拷贝和使用源码, 当做修改或分发时, 请遵守 木兰宽松许可证,第2版.

社区组织

开发流程

这里针对OB大赛做一个简单的流程建议。

分支

在仓库创建出来的时候,就会有一个默认分支,一般是 main。大赛后台测试,每次会拉取默认分支进行编译测试。

因此,建议将 main 作为“稳定”分支,就是所有的修改,都测试完成后,再 merge 到 main

后续,所有的默认分支都称为 main

如果是团队开发,建议创建一个 dev 分支,作为团队共同开发的分支,大家修改的新功能,先 merge 到 dev,在 dev 测试通过后,再 merge 到 main

对于团队中的成员,可以开启一个自己的分支,或者以功能名称命名的分支,比如 feature/update

流程

对于团队

  1. 创建主分支 main

  2. 创建开发分支 dev

团队准备提交代码到主分支时,执行:

# 切换到开发分支
git checkout develop
# 拉取最新代码
git pull
# 执行一系列测试,没有问题的时候
# 切换到主分支,并更新到最新
git checkout main
git pull
# 合并开发分支
git merge develop
# 推送到远程仓库,这时官方测试人员,就可以拉到最新的代码
git push

对于个人

  1. 拉取团队仓库代码(git clone)
  2. 切换到 dev 分支(git checkout develop)
  3. 创建新分支,用于开发新的功能,比如 git checkout -b feature/update
  4. 功能开发完成,测试通过后,提交代码到本地仓库 git add . && git commit -m 'your commit message'
  5. 同步代码到开发分支develop
# 切换到develop分支
git checkout develop 

# 同步远程分支代码
git pull

# 合并 feature/update 到develop
git merge feature/update

# 合并完成后,推送到远程仓库
git push

# 然后删除自己的feature分支
git branch -d feature/update

常用命令

查看当前分支

git branch  # 查看本地分支

git branch -a # 查看所有分支,包括远程分支

如何创建分支

git checkout -b 'your branch name'

git branch -d 'your branch name'  # 删除一个分支

如何切换分支

git checkout 'branch name'

如何提交代码

# 添加想要提交的文件或文件夹
git add 'the files or directories you want to commit' 
# 这一步也可以用 git add . 添加当前目录

# 提交到本地仓库
# -m 中是提交代码的消息,建议写有意义的信息,方便后面查找
git commit -m 'commit message'

如何推送代码到远程仓库

git push
# 可以将多次提交,一次性push到远程仓库
如何合并代码
# 假设当前处于分支 develop 下
git merge feature/update
# 会将 feature/update 分支的修改,merge 到 develop 分支

如何临时修改另一个分支的代码

# 有时候,正在开发一个新功能时,突然来了一个紧急BUG,这时候需要切换到另一个分支去开发
# 这时可以先把当前的代码提交上去,然后切换分支。或者也可以这样:
git stash # 将当前的修改保存起来

git checkout main # 切换到主分支,或者修复BUG的分支

git checkout -b fix/xxx  # 创建一个新分支,用于修复问题

# 修改完成后,merge到main分支
# 然后,继续我们的功能开发
git checkout feature/update # 假设我们最开始就是在这个分支上
git stash pop

# stash 还有很多好玩的功能,大家可以探索一下

开发流程

对于每一道题,从当前 main 分支新建一个分支 feat/<name> 来进行开发:

# 切换到 main 分支
git checkout main
# 同步 main 分支最新代码
git pull
# 新建分支,<name> 是题目的英文名
git checkout -b feat/<name>

feat 还可以用下列单词替换:

  • feat:新功能(feature)。

  • fix/to:修复bug。

  • docs:文档(documentation)。

  • style:格式(不影响代码运行的变动)。

  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)。

  • perf:优化相关,比如提升性能、体验。

  • test:增加测试。

  • chore:构建过程或辅助工具的变动。

进行第一次提测前,需要将分支推送到 github 上:

git push origin <branch-name>

进行提测。若通过提测,则在 github 上提交 pr 来进行分支合并。

当开发到一半需要和 main 同步(一般见于遇到 bug 被其他人修复),使用 rebase 来同步而不是 merge

# 首先确保自己在需要被同步的分支上,例如自己的开发分支
git checkout <branch-name>
# 使用 rebase 同步 main 分支
git rebase main

git commit message 可参考 commit 规范:https://zhuanlan.zhihu.com/p/182553920 合并时候的 commit message 需要遵守 commit 规范:https://zhuanlan.zhihu.com/p/182553920