伯克利大学数据库作业实现SimpleDB

本着锻炼自己的意图,我在课余时间抽空完成了伯克利大学的数据库大作业——实现SimpleDB。这篇博文只是分享一下心得,将这门课程介绍并推荐给更多朋友。更多细节可以到课程主页查看 https://sites.google.com/site/cs186fall2013/homeworks

课程内容

课程分为四个部分,分别实现四个在数据库中比较核心的部分:

课题一:实现数据管理。这一部分主要是实现SimpleDB对数据的管理,当然,需要在指导下先搭建好开发环境并了解SimpleDB的整体框架。更具体来说,需要实现存储、访问与管理物理层面的数据(二进制文件),以及将其映射为逻辑层面的数据(关系表)。在这一课题的最后,还要求实现SimpleDB中最基本的操作——SeqScan,因此完成这一章后,就可以扫描全表了。

课题二:实现操作符。这一部分主要是实现一系列操作符,包括insert、delete、select、join、group by、order by等。其中,join的高效率实现是一个难点(学习一下常见的算法即可,文末有推荐文章),其他操作符都比较简单。而且group by与order by功能被简化了,也省去了一部分工作量。而在课题最后,则要实现课题一未完成的一个功能——缓存管理。在这里,将要学习并实现缓存机制,包括缓存替换策略(LRU等)。

课题三:实现查询优化。这一部分主要是实现基于代价的优化器,重难点是利用left-deep-tree和动态规划的思想实现Join操作的优化器。完成后,Filter(即select…where…)以及Join操作的性能将得到很大的优化。

课题四:实现事务。这一部分主要实现数据库对事务的支持,包括在Page粒度下利用2PL协议以及NO STEAL/FORCE缓存管理策略实现事务的ACID特性,以及基于超时法或事务等待图法的死锁检测和解除。由于采用NO STEAL/FORCE,基于日记的undo和redo功能被省略了。

课程优点

  • 整个项目的整体逻辑代码已经由伯克利大学和斯坦福大学的教授实现,我们只需要着眼于具体功能的实现
  • 知识的范围与难度掌握的非常合理,在现代数据库中重要的内容几乎都覆盖到了,而且难点虽然有挑战性,但经过仔细思考都可以解决,写完真的过瘾。经过这一番对数据库的探索,能让自己对数据库的理解有非常大的提高
  • 课程的讲解细致,还有不少实现方面的提示。这是课程门槛低的一个很大原因,简直就像教授手把手教你实现。
  • 课程配套了比较完整的单元测试。每个课题都配套了几乎所有功能的单元测试,在实现了操作符之后还提供了数据文件,可以用来测试数据库的整体性能。这些测试对我们能正确实现有非常大的帮助。

课程要求

之所以想推荐给大家,是因为我觉得这门课不仅能学到不少东西,而且课程的门槛一点不高,下面我分几个方面说一下。

  • 数据库理论:你一定想不到这门课对数据库理论的门槛有多低。我在开始写的时候,只了解SQL的基本使用(实现Join的时候不太清楚还要去查一下什么意思那种),而剩下的知识,包括缓存替换算法LRU,Join算法的优化,基于代价的优化器,以及2PL、锁的特性以及粒度、死锁检测等等知识,大部分都可以在写的过程中直接谷歌得到详细介绍,少部分,也就是事务那一课题,我觉得概念比较系统而且有难度,所以去看了一下书的相关内容。我在后面会说明我在整个过程参考了哪些文章以及看了什么书。
  • Java要求:课程需要使用Java代码完成, 因此需要有一些Java基础。而为了实现事务,Java的并发部分也需要了解,需要掌握线程的同步与通信,包括synchronize和volatile关键字等的使用。另外,需要知道Ant或Maven等Java生态下的构建工具的基本使用。课程带着我们操作的是Ant,出于习惯我改成Maven了。
  • 时间要求:根据我的经历,只要有一定的java基础,不到两个月就可以实现整个课程(我写的时候中间隔了个暑假,去干别的了,所以算起来也就总共花了一个多月)。而课程要求的时间加起来是56天,也差不多。

参考的网址与书籍

  1. https://sites.google.com/site/cs186fall2013/homeworks
    这是课程的主页,几乎整个过程都是在其指导下完成

  2. http://coding-geek.com/how-databases-work/
    这是一篇简单介绍了关系数据库原理的文章,写的非常好,看完可以对数据库有个整体的了解,对相关的协议或算法的概念和术语不至于太陌生。也可以选择看国内的翻译版,见第8点

  3. http://blog.csdn.net/ghsau/article/details/43762027
    这是Join算法的优化,建议在第2个课题实现到join操作时看

  4. http://blog.itpub.net/30206145/viewspace-1651583/
    这是Join优化器的内容,建议在第3个课题看,可以了解到基于成本的优化(CBO)和left-deep-tree等概念

  5. http://www.mathcs.emory.edu/~cheung/Courses/554/Syllabus/5-query-opt/left-deep-trees.html
    介绍left-deep-tree的,第3课题看

  6. http://www.mathcs.emory.edu/~cheung/Courses/554/Syllabus/5-query-opt/best-left-deep-tree.html
    同上

  7. http://www.mathcs.emory.edu/~cheung/Courses/554/Syllabus/5-query-opt/dyn-prog-join3.html
    介绍动态规划实现的优化器如何工作

  8. http://blog.csdn.net/ylforever/article/details/51048945
    这是对第2点中文章的事务部分的翻译,建议开始课程前看或在第4个课题看

  9. 最后,建议找一本介绍数据库原理的书籍系统了解事务部分的概念,重点掌握事务的ACID特性,读写锁的优先级,2PL协议。我是直接拿我们学校发的课本《数据库系统概论 第5版 王珊等著》看了下第10、11章就直接去码代码了,加上在第8点的文章中了解到了不少概念,例如NO STEAL/FORCE,所以也没再遇到什么问题

最后,贴一下我完成之后放在github的地址: https://github.com/iamxpy/SimpleDB ,欢迎大家一齐学习交流~~