数据库学习-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,对数据库的结构已经有了一个认识了,虽然很多地方的效率都可以优化,但我已经建立了基本的知识框架了,后面就是对这个框架做一些修修补补的工作了,不得不感叹,实践永远是学习效率最高的方式。

posted @ 2021-01-20 15:15  十月sy  阅读(653)  评论(0)    收藏  举报