【MyDB】6-TabelManager 字段与表管理 之1-TBM实现思路概览

【MyDB】6-TabelManager 字段与表管理 之1-TBM实现思路概览

[!tip]

代码均位于:https://github.com/xianghua-2/MYDB/tree/master/src/main/java/top/xianghua/mydb/server/tbm

前言

现在进入了MyDB的表管理部分。可以说表管理是最上层的抽象。

从上往下思考:当客户端命令行输入SQL语句时,服务端需要完成的事情

1.解析SQL语句(Parser,Tokenizer)

2.执行SQL语句(DDL,DML语句)

因此,TBM也将重点围绕这两部分展开。

解析SQL语句需要靠Parser类以及Tokenizer类。

执行则放在Table以及TableManager中。

回想一下mysql数据库,数据库中的表包含字段以及具体的记录。因此对表的管理也主要围绕这几个方面。

1.DDL(Data Definition Language)数据定义语句,主要进行定义/改变表的结构。

MyDB中实现了对表的创建与删除。没有实现对表结构的修改

2.DML(Data Manipulation Language)语句,数据操纵语言。主要对数据进行增加/删除/修改操作。常用语句关键字为INSERT,UPDATE,DELETE。

最后我们需要考虑数据库表的存储

数据库中的表会以链表的形式存储。那么需要插入新表,使用头插式的方法。

SQL语句解析

代码位于parser/Parser.java, parser/Tokenizer.java

Parser依赖于Tokenizer.,实现对SQL语句的解析。

Parser

传入SQL语句的字节数组,之后得到SQL语句的解析结果。

eg:select * from tb_user where id = 1, 该SQL语句就会被解析为select语句,

解析结果包括tablename和where子句

那SQL是如何不断的得到下一个token呢,也就是例子中的select, * ,tb_user这些token呢?这就依赖于Tokenizer方法

Tokenizer

对外提供peek()和pop()方法,Parser调用peek()方法,即可得到当前语句的token,调用pop()则可消费当前的token

SQL语句执行

所有SQL语句执行相关的表管理部分均位于tbm文件夹下

核心思路是,Booter记录数据库表的元数据,也就是首张表的uid

之后TableManagerImpl通过实现TableManager接口,并且调用table类来对表进行增删改查的操作。

在这中间会依赖于Field类(表的字段信息),FieldCalRes类,字段计算结果

代码位于

tbm/BeginRes 存放 开启事务后,返回的结果(xid,byte[] data)

tbm/Booter 存放数据库表的启动信息,因为是链表式存储,因此要存储首张表的uid

tbm/Field 表的字段信息(字段类型,字段名,是否是索引,属于哪张表)。eg:tb_user(long id,string name),那么field就会记录fieldtype: long,fieldname: id,isIndex true

tbm/FieldCalRes 字段计算结果,包括left和right

tbm/Table 表的具体操作,包括创建,删除,插入,开启事务等

tbm/TableManager 表管理接口,初始化TableManager

tbm/TableManagerImpl 表管理接口实现类。上层通过调用该类实现对表的操作。而该实现类则是依赖于Table来管理表

参考

MYDB 9. 字段与表管理 | 信也のブログ (shinya.click)

字段与表管理 | EasyDB (blockcloth.cn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值