2000 行代码,带你写一个自己的 SQL 数据库
本文作者:Auxten | 山景智能科技在 C 被当做“高级语言”,雷布斯和小马哥还在写代码的年代,数据库还不是一个成熟的事物。
和许多技能从简单到复杂的发展进程不太一样,数据库首先成熟并被大规模使用的是 RDBMS(关系型数据管理系统),后来才渐渐兴起了实现相对简单,以 Redis 为代表的 KV 型的数据库。
数据库从后端的技能上看是一个算法、数据布局、系统工程、性能优化的交汇点。
笔者一直对数据库领域充满了爱好,前前后后主导和到场了许多数据库及相干系统的开发。这三年的主要业余时间都在研究数据库,由于大多数数据库项目都汗青久长,代码量根本都在50万行以上,阅读起来让人颇感头疼。咬牙坚持了两年,有了一点点心得。
因此决定写一个代码量只管少,但又能有现代数据库的根本架构的项目,于是花了一周时间写了“GO SQL DB”。
“Go SQL DB” 是一个研究目的的支持SQL查询的关系型数据库。主要目的是为了向数据库爱好者展示一个关系型数据库的根本原理和关键设计。
因此,为了便于明白,采取了许多取巧但不是很严谨的设计,代码量控制在了 2000 行左右(包含了 400 多行的单位测试代码)。
https://p9.pstatp.com/large/pgc-image/1e918134322e4382a6bf034d849b830c
特性列表
[*]纯 Golang 实现,不依赖任何第三方包。仅在单位测试中引入了 goconvey
[*]单位测试覆盖率≈ 73.5%
存储引擎
[*]基于 B+Tree 的数据检索布局
[*]基于 4KB 分页的磁盘持久化引擎
[*]接近 POD(Plain Old Data)的序列化 & 反序列化
SQL Parser
[*]Tokenizer 基于 text/scanner 实现
[*]支持简单的 SELECT、INSERT 语法
[*]SELECT 支持数值类型的 WHERE
[*]支持 LIMIT,但暂不支持 ORDER BY
[*]假如你想要了解可以生产可用的 SQL Parser 是如何实现的,请参考我从 CrockroachDB 剥离的 SQL-2011 标准支持的 SQL Parser
执行筹划 Planner
[*]基于火山模子(Volcano Model)的 Select 实现
[*]基于 HTTP 的查询和插入接口
实现的局限
[*]暂时没有实现 DDL,仅有固定的 Schemastruct Row { Id uint32 Sex byte Age uint8 Username byte Email byte Phone byte }
[*]SQL 语法的有限支持,拜见单测用例
Tokenizer 由于是基于 Golang 语言自己的一个取巧实现,对于一些字符串里的特殊字符支持会出现问题,可以通过加 “ 解决
传送门
GitHub地址:
https://github.com/auxten/go-sqldb
SQL-2011 SQL Parser:
https://github.com/auxten/postgresql-parser
基于火山模子(Volcano Model)的 Select 实现:
https://github.com/auxten/go-sqldb/blob/main/planner/select.go
单测用例:
https://github.com/auxten/go-sqldb/blob/main/parser/parser_test.go
特殊感谢
[*]Marshal/Unmarshal Code generation:https://github.com/andyleap/gencode/
[*]Document-oriented, embedded SQL database: genji:https://github.com/genjidb/genji
[*]CockroachDB:https://github.com/cockroachdb/cockroach
[*]Let’s Build a Simple Database:https://cstack.github.io/db_tutorial/
SQL数据库的汗青
最后说一下SQL数据库的汗青吧。
上世纪 60 年代,由于 IT 技能尚未普及,硬件本领也左支右绌。程序员面临的业务逻辑还不是很复杂,但更可怕的是当时没有 Google,更没有 GitHub、Stack Overflow。即使是构建一个最简单的增删改查系统也需要自己手动调用操作系统反人类的 API,应用各种数据布局、算法去完成数据的存储和检索。
和许多技能从简单到复杂的发展进程不太一样,数据库首先成熟并被大规模使用的是 RDBMS(关系型数据管理系统),后来才渐渐兴起了实现相对简单,以 Redis 为代表的 KV 型的数据库。
关系型数据库的大规模应用和 SQL 被普遍认可成为了关系型数据库的标准查询语言有很大的关系:
SQL 编程语言最初是 IBM 研究人员 Raymond Boyce 和 Donald Chamberlin 在 1970 年代开发 “System R” 的过程中落地的。SQL 当时被称为 SEQUEL(这也是SQL普遍读法的由来)后来由于注册商标的问题,才改名为 SQL。SQL 的发明很大程度上是参考了 Edgar Frank Codd 于 1970 年发布论文《A Relational Model of Data for Large Shared Data Banks》。
https://p1.pstatp.com/large/pgc-image/18e14270dcea4d01a47fcc8773145be2
1977 年,32 岁的程序员 Larry 从在 IBM 工作的好基友 Oates 那里拿到一本内部期刊《IBM Research Journal》,从上面读到了 System R 的一些消息。由于技能人员对技能的敏感性,他们觉得这玩意儿肯定会大火,于是三个 30 多岁的程序员决定去创业,于是自己凑钱创建了一个软件开发公司。公司名也是取得相当直白:SDL(Software Development Labs,”软件开发实验室”)。随着 IBM System R 的推出市场,SQL 语言迅速普及,Larry 原来只是想开发一个兼容 System R 的数据库系统,跟在 IBM 背面喝点汤。
但 System R 竟然把返回的 Error Codes 当成了机密保护了起来。不让我加入,那我就跟你打,于是 Larry 把公司名改成 “Relational Software, Inc” 准备跟 IBM 死磕。1 年后,他们开发出了数据库产品的第一个版本并把它定名为 “Oracle”,更让大家开心的是他们乐成的把产品卖给了美国水师和中央谍报局等政府部门。于是大家买了个蛋糕给公司过了一个一周岁的生日,留下了这张照片:
https://p3.pstatp.com/large/pgc-image/1c68caeca58c407bb55272c9ac09f068
1979 年,RSI 公司发布了 Oracle v2 和一个自己的 SQL 版本……
7 年之后 Oracle 上市,程序员 Larry 和 Oates 走上人生巅峰,持剑少年变恶龙……
System R 把 Error Codes 作为机密保护起来的做法像极了日后 Oracle 收购 Sun MicroSystems 获得了 Java 的版权后把 Java 的函数接口申请专利的做法。
Oracle 上市的同年,SQL 正式被 ANSI(American National Standards Institute)定为标准,第二年 SQL 成为了 ISO 标准,编号:ISO/IEC 9075。今后分别在:1989, 1992, 1996, 1999, 2003, 2006, 2008, 2011, 2016 年不断增补,就有了后世经常提到的 SQL-89、SQL-92、SQL:2011 等叫法。
关于山景智能
山景智能是一家AI赋能的企业业务超自动化解决方案提供商,是国内企业业务超自动化的领军者。
山景致力于推动企业业务超自动化,对准中国中大型企业业务端场景,基于云原生架构,融合业务驱动+AI增强型数据管理、自动机器学习、模子可解释、零代码敏捷开发等创新技能,面向企业提供“数据+AI+业务”端到端的超自动化平台及解决方案,帮助企业实现数字化转型,提升构造运营效率,提升企业业务价值。
公司官网:www.senses-ai.com
— 完 —
页:
[1]