-
Notifications
You must be signed in to change notification settings - Fork 4
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
类型记录长度小时后面通过""
进行补充完整,这种方式会消耗空间,但是处理方式上会简单一些,因此我们采取这种方式
数据库管理系统原理及实现 中国人民大学信息学院 2017级硕士研究生
- Getting Started
- User Manual
- Report
- Exp1: Storage Manage
- Exp2: B+ Tree Index
- Exp3: SPJ Algorithm
- Exp4: Query Execution
- Exp5: Query Optimization
- Update
- Query-analysis, 2018.01.05
- QT-integration, 2018.01.06
- Storage-update, 2018.01.08
- PPT-update, 2018.01.13
- FAQ