数据库学习-mit6.830 lab1
mit6.830 lab1
由于一直对数据库比较陌生,还是下决心好好学习一下,在网上找了一下lab,最终还是觉得mit的比较好,毕竟有写好的测试用例,心里更有底一点
背景
第一眼看了lab,发现用的是java,迅速关闭网页,准备看有没有别的课程(java完全不会),然而看了一圈发现好像数据库相关的lab全都差不多,都是java实现一个simpleDB,只能硬着头皮上了
环境搭建
由于完全没接触过java,心里还是挺没底的,不过好在mit的readme写的还是比较详细的,不过我懒得下载eclipse,就用了vscode的java插件,其实主要也是用智能提示和代码跳转,由于我是用的vscode 的remote插件连的linux服务器,貌似需要在本地和服务器都下载java的插件,然后下载openjdk11,配好环境变量,然后安装一个ant,用于构建的,我用的ubuntu系统,直接sudo apt install 就完事了,到这里基本就准备的差不多了。
课程说明仓库
https://github.com/MIT-DB-Class/course-info-2018
代码仓库
https://github.com/MIT-DB-Class/simple-db-hw
首先是让你用git下载代码,由于我们不是mit的学生,所以fork一份到自己的github,然后把origin配置到自己fork的仓库就好了,后面提交那些就不用管了。
lab1
1. 介绍ant,开发环境等等
这个lab用的ant构建代码,(我之前只听过maven和gradle,但也不会用),看了一下介绍,还算比较简单,和make的功能差不多,然后用junit框架写测试用例,大概用了一下,还是挺方便的,然而要是让我自己写测试用例就很吃力了。
之后就对这个lab整体做了一个介绍,然后建议你先看完整个readme再写代码,我浏览了一下后面的内容,好吧,看完也不知道怎么写代码。
2. exercises
exercise 1:
让实现tuple和tupledesc,说实话,我看到这里就蒙了,这就直接写代码了,我完全没搞懂是要干什么,然后就去看别人的博客,看数据库的一些常用关键词,比如tuple,就是一行;tupledesc,是tuple描述符,其实就是表头;field,就是一个数据格子;
https://zhuanlan.zhihu.com/p/58595037
https://blog.csdn.net/hjw199666/article/details/103824797
https://blog.csdn.net/hjw199666/article/details/103486328
然后结合着几篇博客的翻译,解释,还有框架图,大概知道了是要干什么,最主要的就是确定一个类的数据结构,只要知道这个类包含哪些东西,那些逻辑实现就不难了,不过由于不会java,还是半抄半写完成了exercise1,其实java和c++整体还是比较类似的,感觉比c++还要更工程化一点。
tupledesc包含了一些tditem,就是表头的字段,包含了这一列的类型和属性名,
tuple 包含了一个tupledesc(第一感觉是好浪费啊,但我还不清楚是不是每个tuple都要存一个tupledesc实体),一个recordid,还有一个field数组
整体不难,主要就是熟悉一下java语言,另外就是熟悉一下数据库的基本结构
exercise 2:
实现catalog
catalog是数据库的目录,在simpleDB里,一个数据库只有一个catalog,也就说catalog里面存了所有的表,所以可以用一个数组存所有的表,但为了提高效率,也可以用哈希,
一个表包括了一个DbFile,一个表名,一个主键名,最核心的自然是这个DbFile了,后面会有实现
exercise 3:
实现 bufferpool
bufferpool是一个缓存池,用来缓存Page,Page就是物理页,默认大小4096,一个表至少占一个Page,也可以占多个,申请页的时候就需要向bufferpool申请,这里我们只需要完成构造函数和getPage函数,getPage完成的就是获取一个物理页,当缓存中有,直接返回,如果没有,就从DbFile读出来(暂时还没实现这个方法),缓存进去,显然,这个后续可以用LRU优化,这里就先简单实现一下功能。
exercise 4:
实现两个id类,还有一个HeapPage
两个id类比较简单,HeapPage中大部分在lab1中也不需要实现,主要是理解它的核心思想
HeapPage是Page的一个实现,原理是用bitmap管理所有的tuple,我们主要是生成一个迭代器,也就是遍历整个bitmap,有效的就塞进一个数组,返回这个数组的迭代器
exercise 5:
实现HeapFile
HeapFile是DbFile的一个实现,这里我们要完成构造函数中用到的计算一个page里能放几个tuple,需要的bitmap的大小的函数;
还有就是完成exercise3里调用的那个readPage方法;
然后就是实现一个迭代器,把HeapPage中的迭代器组合起来,让用户能够在一个表里从头迭代到尾。
exercise 6:
实现一个SeqScan 操作符
操作符是基于迭代器实现的(很好理解,就像c++的stl一样),这个SeqScan就是一个遍历操作,可以说是最简单的操作了,就是把在这个类中放一个HeapFile的迭代器,包装一下就好了。
最后还有一个查询操作,就相当于自己写一个测试用例,完整遍历操作,动手做一下,还是蛮有成就感的。
总结
做完这个lab,对数据库的结构已经有了一个认识了,虽然很多地方的效率都可以优化,但我已经建立了基本的知识框架了,后面就是对这个框架做一些修修补补的工作了,不得不感叹,实践永远是学习效率最高的方式。

浙公网安备 33010602011771号