Skip to content

Storage update

Youxian Tao edited this page Jan 13, 2018 · 3 revisions

原来的方法

在数据存储组织时候,原来考虑的是将表各个部分的字段当做字符串处理更方便,
因为之前使用mysql中也有看到int类型是有指定长度的(不知道是不是理解错了,int类型的数据也会有上限),
因此在存储时候将各个部分都当成变长记录来进行存储,这是一种;或者,将各个部分当做定长记录来进行存储。
  • 前者在进行update操作时候只能通过设置标识位的方式来改变,同时在尾部重新插入一条元组记录
  • 后者则可以完成上述的操作方法,也可以直接在原来的记录上直接覆盖原来的记录,因为定长记录保证一定大于任何一条记录的长度

系统更新

上述问题在描述时候为了简单,没有顾虑到实验一中各个类型数据存储时候的需求,因此特意在此处做出更新说明方法,代码部分也根据此处方法进行了补充修改,可以参考类型转换方法类DataUtil.h,将文件中的一行记录读取之后,如a|b|c,其中a部分为int(或者float、double等),整条记录解析为vector<std::string> line,将line[i]都可以转成cha*,再通过atoi转化成int类型(atof转成floa/double,atoll转成long,date类型则可以直接转成YYYYMMDD的格式),然后通过memcpy直接将此int类型的a数据写入,长度为sizeof(int),然后再将其他部分的字符串类型数据写入,长度为strlen(b)或者strlen(c),整个记录的偏移量为sizeof(int)+strlen(b)+strlen(c),因为在Relation表中记录了各个表字段的类型,因此这部分在系统上的修改也不会太复杂。 同理,在读出该元组信息,也是类似,通过偏移量直接读出,然后根据各个字段部分进行解析。

  • 变长记录方式:在每一个tuple解析时记录每个字段部分的长度,落盘时候按照定长来写数据;在读取出来的时候也是按照当前的每个tuple的各字段信息来进行读取,时间消耗,空间也会消耗一点用于每个字段长度
  • 定长记录方式:在建立表时候记录各个字段占用的最大长度,int类型等记录其sizeof(int),在char类型记录长度小时后面通过""进行补充完整,这种方式会消耗空间,但是处理方式上会简单一些,因此我们采取这种方式
Clone this wiki locally