元组可以直接添加进数据库吗_MIT 6.830 Database System 数据库系统 Lab 1 实验报告

e2bdf0bbad1b227f2c0404d8a1881eaf.png

前言:

MIT 6.830的数据库系统课程一直在网络上被大家所推崇,自己也是早早的Mark下来,囤在收藏夹里吃灰。疫情期间公司要求在家隔离14天才能返工,于是无聊之际阴差阳错打开了6.830的课程页面,开启了自己的数据库学习之旅。

自己在完成6.830课程的每个Lab之后会做一个小结,写一份实验报告,希望借着报告的形式,回顾并加强自己的理解,同时也做到抛砖引玉的作用。若是能给同样学习6.830数据库系统课程的大家提供一点点的帮助,那更是求之不得。

另笔者只是一个工作三年的初级工程师,数据库领域又是一门需要花一辈子深挖的领域,一定有理解有偏差或错误的地方,还请大家狠狠的拍砖并毫不留情的加以嘲讽,以激励我继续前行……

Lab1的记录

Lab1开始于2020-02-10,结束于2020-02-17,花了8天时间完成,中间有几天效率不够高(跑去看HBO的切尔诺贝利去了),若是全力以赴的话,想来一周应该是可以做完的。

Lab1主要是对数据库的简单认识,暂时没有深入涉及到特定的领域。试玩了一下Ant(玩不惯……),一开始没把JUnit搞起来,单测的调试全靠打日志加猜,比较费劲。后面在IDEA里顺利的把JUnit和单步调试环境搭好了,效率大大的提升,有种势如破竹的感觉~

Lab1实验讲义​github.com

练习部分:

Lab1一共有6个练习,分别是

  1. Tuple TupleDesc
  2. Catalog
  3. BufferPool
  4. HeapPage HeapPageID RecordId
  5. HeapFile
  6. SeqScan

Exercise 1:Tuple和TupleDesc直接无脑写就完事了~

Exercise 2:Catalog相当于数据库的元数据信息,Table啥的信息都存在里面,顺便说一下,实验里一个file对应一个table。

Exercise 3、BufferPool的readPage还是有点兜兜转转的,一开始绕进去了。所有的读Page操作都要走BufferPool.readPage(),缓存中(BufferPool)有的话直接返回,缓存中没有的话,由BufferPool调用HeapFile.readPage()去磁盘读Page,读到后缓存在BufferPool中并返回该Page。这里后续的实验还会加上BufferPool满时的页置换策略。

Exercise 4、HeapPage HeapPageID和RecordId部分:这块有点难度,实验中Page在table/file中是连续分布的,有个number代表他的位置编号,有个tableId变量代表他属于哪个table。 HeapPage是重难点,主要要理清HeapPage中各个字段的存储结构和分布,有个BitMap变量来表示各个位置有没有被使用。HeapPage中tuple数组来存储真正的一行一行数据,除此之外还有一个heapPageId和tupleDesc字段。

一个HeapPage能存多少行Tuple,取决于他要保存的一个个元组有多长且都是什么元素,元组数量的计算:floor((BufferPool.getPageSize()*8) / (tuple size * 8 + 1))。 以byte为单位的header数组的长度是:ceiling(no. tuple slots / 8) (这块还是推荐自己在纸上画个图搞清楚)。最后要注意实验中位图标记slot是否被使用的位运算是从右往左进行的,如0000—>0011这样。

Exercise 5、HeapFile 这块较难,一个HeapFile就是一张表/一个文件。HeapFile.readPage方法是核心,该方法只会被BufferPool调用(一开始犯了错误),方法根据传入的pageId从磁盘中读取一个page。 还有就是HeapFile的迭代挺难,HeapFileIterator相当于是对整个表中所有的元组进行了迭代操作,需要复写接口的next, hasNext, open三个方法,这块当时花了很长时间构思编写和调试,而且挺容易出错(主要是自己之前也没怎么玩过Java的Iterator,遇到循环从来就是丢个for上去)。基本思路是对File中的每个Page进行元组迭代,需要自己维护currentPage和游标。

同时文件读写这块也容易出错(也是之前没怎么玩过的。。。),fileInputStream.read会自动滑游标,不用手动干预,有一个疑惑就是skip方法的时间复杂度是多少。。。有时间可以考虑重构一下这块代码。

PS:HeapFile和BufferPool两个类中会有代码的互相调用。

Exercise 6、SeqScan这块在Exercise 5部分HeapFile的迭代写好的情况下,直接包装一下就好。但我一开始没写好,就把自己给坑了。。。(dbFileIterator应该保存一个作为字段的,不能每个方法里都new一个新的。)

测试部分:

系统测试(SystemTest)还是很给力的,能发现各种逻辑Bug和设计失误。幸好可以IDEA单步调试,不然会疯。一开始readPage方法读后续的第二个第三个页的时候有Bug,调了好长时间。。。同时BufferPool缓存的测试也限定了只有HeapFile.readPage可以从磁盘读取文件Page。

最后:

1、Iterator得深入挖掘一下,本实验还挺重视迭代的

2、FileInputStream得挖掘一下,文件操作不熟。File.Skip到底复杂度几何?

3、小本本上得梳理一下代码逻辑和设计架构。

4、祝自己后续试验顺利。。。

时间线:

  • 2020-02-10 开始Lab1实验
  • 2020-02-17 完成Lab1实验
  • 2020-02-20 编写Lab1实验报告
  • 2020-07-10 修改并发布实验报告

其他Lab实验报告的链接:

LiangZhang:MIT 6.830 Database System 数据库系统 Lab 1 实验报告​zhuanlan.zhihu.com
3281e02222320bf729eec50e8146501d.png
LiangZhang:MIT 6.830 Database System 数据库系统 Lab 2 实验报告​zhuanlan.zhihu.com
3281e02222320bf729eec50e8146501d.png
LiangZhang:MIT 6.830 Database System 数据库系统 Lab 3 实验报告​zhuanlan.zhihu.com
3281e02222320bf729eec50e8146501d.png
LiangZhang:MIT 6.830 Database System 数据库系统 Lab 4 实验报告​zhuanlan.zhihu.com
3281e02222320bf729eec50e8146501d.png
LiangZhang:MIT 6.830 Database System 数据库系统 Lab 5 实验报告​zhuanlan.zhihu.com
3281e02222320bf729eec50e8146501d.png
LiangZhang:MIT 6.830 Database System 数据库系统 Lab 6 实验报告​zhuanlan.zhihu.com
3281e02222320bf729eec50e8146501d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值