【MyDB】6-TabelManager 字段与表管理 之1-TBM实现思路概览
【MyDB】6-TabelManager 字段与表管理 之1-TBM实现思路概览
- 前言
- SQL语句解析
- Parser
- Tokenizer
- SQL语句执行
- 参考
[!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)