# seandb **Repository Path**: seanzhaox/seandb ## Basic Information - **Project Name**: seandb - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-11-01 - **Last Updated**: 2022-02-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: Database, Java ## README # SeanDB 一套自制的数据库工具,用于作者的数据库架构和底层原理的学习。 ``` client -----+ | [sql] ^ | | connector failed | | sql-resolver ---> validator | <_____________| [entity] | data-processor | file ``` ## 1.0 版本简介 SeanDB 是我参照平时使用MySQL的经验,自己制作用来学习数据库架构和底层原理的一套DB。 预备先实现接收客户端的请求SQL, 解析, 校验然后操作文件进行基本的数据库操作,再逐渐增加索引,事务,连接池,权限等高级特性。 目前已经实现了基本的客户端请求处理流程,支持以下类型的SQL: ```sql SHOW DATABASES; USE [database]; CREATE DATABASE [database]; DROP DATABASE [database]; CREATE TABLE [database].[table] ( [column_name] [type]([length]) COMMENT ‘[comment]’, [column_name] [type]([length]) COMMENT ‘[comment]’, [column_name] [type]([length]) COMMENT ‘[comment]’ ... ); DROP TABLE [database].[table]; SELECT * FROM [database].[table] (WHERE [column_name] [=|>|>=|<|<=|] [value]); DELETE FROM [database].[table] (WHERE [column_name] [=|>|>=|<|<=|] [value]); INSERT INTO [database].[table] VALUES ([value], [value], [value]), ([value], [value], [value]), ([value], [value], [value]), ([value], [value], [value]) ... ; ``` 功能较少,同时代码风格及性能需求也惨不忍睹,甚至还有数不清的BUG. 实现过程中才发现自己的许多不足,将在后续版本逐渐完成。 1.x版本后续将优先实现以下功能: 1. 异常返回的封装,与打印。 2. SELECT 和 INSERT 支持 部分列。 3. 封装重复代码。 ```sql 4. SHOW CREATE TABLE [table_name]; 5. SHOW TABLES LIKE '%[part_of_table]%'; 6. UPDATE TABLE [database].[table] SET [column_name] = [value], [column_name] = [value] WHERE [column_name] [=|>|>=|<|<=|] [value]; 7. ALTER TABLE [database].[table] ADD COLUNM [column_name] [type]([length]) COMMENT ‘[comment]’; 8. ALTER TABLE [database].[table] DROP COLUNM [column_name]; ``` 9. 增加数字类型, 日期类型 10. 将数据库底层操作封装为InputStream 和OutputStream. ### 1.1 版本简介 本次版本将异常返回进行了封装。本来想增加返回信息的格式化,但目前客户端和服务端交互是解析后的字符串格式。 如果增加了格式化,客户端展示虽会得到优化,但解析起来将会更加困难。 后续将格式化放在客户端进行,客户端和服务端应该约定一套交互类型,方便客户端解析后得到原始的数据。 另外反省了一下, 现在的SQL解释器太粗糙,在这个基础上解析SQL越多越灵活,代码越复杂且容易出错。 应该补习编译原理再对Resolver模块进行重构,这段时间先找点其它的优化点做下吧。 ### 1.2 版本简介 本次版本将数据对应文件存储的映射逻辑调整到各类serializer中, 并且将底层操作封装成为DBFileInputStream 和 DBFileOutputStream. 使用不同的存储格式可以达到减少部分字段的存储空间的作用. 由于调整后需要根据字段的类型进行相应存储工具的调用, 只能相应的调整了缓存中TABLES 和 COLUMNS 表的缓存方式. ### 1.3 版本简介 本次版本 1. 使用线程池管理了连接信息 2. 新增了SymbolTable和LexicalAnalyzer对SQL进行词法分析 3. 将原有ConditionChain 改造成了ConditionTree. 由于ConditionChain 只支持AND, 不支持OR. 所以新增了树状结构对复杂的条件表达进行封装. ConditionTree的根结点为常true结点, 没有实际含义. 每一层的不同分支间是OR的关系. 节点与其父节点以及其子节点是AND的关系. 编译原理确实有点难懂, 一下将整套逻辑搬过来有点难. 下个版本准备将词法分析和ConditionTree先引入目前的resolver. 然后更多地支持一些SQL. ### 1.4 版本简介 本次版本预计 1. 将语法分析和ConditionTree引入resolver。 1. 增加部分列查询。 2. 增加部分列插入。 3. 增加列的默认值。 4. 增加录入信息的校验。 5. 增加客户端与服务端的协议, 将格式化转换调整到客户端。