本着锻炼自己的意图,我在课余时间抽空完成了伯克利大学的数据库大作业——实现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(即where子句)以及Join操作的性能将得到很大的优化。
课题四:实现事务。这一部分主要实现数据库对事务的支持,包括在Page粒度下利用2PL协议以及NO STEAL/FORCE缓存管理策略实现事务的ACID特性,以及基于超时法或事务等待图法的死锁检测和解除。由于采用NO STEAL/FORCE,基于日记的undo和redo功能被省略了。
之所以想推荐给大家,是因为我觉得这门课不仅能学到不少东西,而且课程的门槛一点不高,下面我分几个方面说一下。
https://sites.google.com/site/cs186fall2013/homeworks
这是课程的主页,几乎整个过程都是在其指导下完成
http://coding-geek.com/how-databases-work/
这是一篇简单介绍了关系数据库原理的文章,写的非常好,看完可以对数据库有个整体的了解,对相关的协议或算法的概念和术语不至于太陌生。也可以选择看国内的翻译版,见第8点
http://blog.csdn.net/ghsau/article/details/43762027
这是Join算法的优化,建议在第2个课题实现到join操作时看
http://blog.itpub.net/30206145/viewspace-1651583/
这是Join优化器的内容,建议在第3个课题看,可以了解到基于成本的优化(CBO)和left-deep-tree等概念
http://www.mathcs.emory.edu/~cheung/Courses/554/Syllabus/5-query-opt/left-deep-trees.html
介绍left-deep-tree的,第3课题看
http://www.mathcs.emory.edu/~cheung/Courses/554/Syllabus/5-query-opt/best-left-deep-tree.html
同上
http://www.mathcs.emory.edu/~cheung/Courses/554/Syllabus/5-query-opt/dyn-prog-join3.html
介绍动态规划实现的优化器如何工作
http://blog.csdn.net/ylforever/article/details/51048945
这是对第2点中文章的事务部分的翻译,建议开始课程前看或在第4个课题看
建议找一本介绍数据库原理的书籍系统了解事务部分的概念,重点掌握**事务的ACID特性,读写锁的优先级,2PL协议。**我是直接拿我们学校发的课本《数据库系统概论 第5版 王珊等著》看了下第10、11章就直接去coding了,加上在第8点的文章中了解到了不少概念,例如NO STEAL/FORCE,所以也没再遇到什么问题
最后,贴一下我完成之后放在github的地址: https://github.com/iamxpy/SimpleDB ,欢迎大家一齐学习交流~~