百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

2000 行代码,带你写一个自己的 SQL 数据库

ccwgpt 2025-02-19 11:15 41 浏览 0 评论

本文作者:Auxten | 山景智能科技

在 C 被当做“高级语言”,雷布斯和小马哥还在写代码的年代,数据库还不是一个成熟的事物。

和很多技术从简单到复杂的发展历程不太一样,数据库首先成熟并被大规模使用的是 RDBMS(关系型数据管理系统),后来才逐渐兴起了实现相对简单,以 Redis 为代表的 KV 型的数据库。

数据库从后端的技术上看是一个算法、数据结构、系统工程、性能优化的交汇点。

笔者一直对数据库领域充满了兴趣,前前后后主导和参与了很多数据库及相关系统的开发。这三年的主要业余时间都在研究数据库,由于大多数数据库项目都历史悠久,代码量基本都在50万行以上,阅读起来让人颇感头疼。咬牙坚持了两年,有了一点点心得。

因此决定写一个代码量尽量少,但又能有现代数据库的基本架构的项目,于是花了一周时间写了“GO SQL DB”

“Go SQL DB” 是一个研究目的的支持SQL查询的关系型数据库。主要目标是为了向数据库爱好者展示一个关系型数据库的基本原理和关键设计。

因此,为了便于理解,采取了很多取巧但不是很严谨的设计,代码量控制在了 2000 行左右(包含了 400 多行的单元测试代码)。

特性列表

  1. 纯 Golang 实现,不依赖任何第三方包。仅在单元测试中引入了 goconvey
  2. 单元测试覆盖率≈ 73.5%

存储引擎

  1. 基于 B+Tree 的数据检索结构
  2. 基于 4KB 分页的磁盘持久化引擎
  3. 接近 POD(Plain Old Data)的序列化 & 反序列化

SQL Parser

  1. Tokenizer 基于 text/scanner 实现
  2. 支持简单的 SELECT、INSERT 语法
  3. SELECT 支持数值类型的 WHERE
  4. 支持 LIMIT,但暂不支持 ORDER BY
  5. 如果你想要了解可以生产可用的 SQL Parser 是如何实现的,请参考我从 CrockroachDB 剥离的 SQL-2011 标准支持的 SQL Parser[1]

执行计划 Planner

  1. 基于火山模型(Volcano Model)的 Select 实现[2]
  2. 基于 HTTP 的查询和插入接口

实现的局限

  1. 暂时没有实现 DDL,仅有固定的 Schemastruct Row { Id uint32 Sex byte Age uint8 Username [32]byte Email [128]byte Phone [64]byte }
  2. SQL 语法的有限支持,参见单测用例[3]
    Tokenizer 由于是基于 Golang 语言本身的一个取巧实现,对于一些字符串里的特殊字符支持会出现问题,可以通过加 “ 解决

传送门

GitHub地址:

https://github.com/auxten/go-sqldb

[1] SQL-2011 SQL Parser:

https://github.com/auxten/postgresql-parser

[2] 基于火山模型(Volcano Model)的 Select 实现:

https://github.com/auxten/go-sqldb/blob/main/planner/select.go

[3] 单测用例:

https://github.com/auxten/go-sqldb/blob/main/parser/parser_test.go

特别感谢

  1. Marshal/Unmarshal Code generation:https://github.com/andyleap/gencode/
  2. Document-oriented, embedded SQL database: genji:https://github.com/genjidb/genji
  3. CockroachDB:https://github.com/cockroachdb/cockroach
  4. 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》。

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”,更让大家开心的是他们成功的把产品卖给了美国海军和中央情报局等政府部门。于是大家买了个蛋糕给公司过了一个一周岁的生日,留下了这张照片:

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

— 完 —

相关推荐

自己动手写Android数据库框架_android开发数据库搭建

http://blog.csdn.net/feiduclear_up/article/details/50557590推荐理由关于Android数据库操作,由于每次都要自己写数据库操作,每次还得去...

谷歌开源大模型评测工具LMEval,打通谷歌、OpenAI、Anthropic

智东西编译|金碧辉编辑|程茜智东西5月28日消息,据科技媒体TheDecoder5月26日报道,当天,谷歌正式发布开源大模型评测框架LMEval,支持对GPT-4o、Claude3.7...

工信部:着力推动大模型算法、框架等基础性原创性的技术突破

工信部新闻发言人今日在发布会上表示,下一步,我们将坚持突出重点领域,大力推动制造业数字化转型,推动人工智能创新应用。主要从以下四个方面着力。一是夯实人工智能技术底座。通过科技创新重大项目,着力推动大模...

乒乓反复纠结“框架不稳定”的三个小误区

很多球友由于对框架的认知不清晰,往往会把“框架不稳定”当成一种心理负担,从而影响学球进度,其典型状态就是训练中有模有样,一旦进入实战,就像被捆住了手脚。通过训练和学习,结合“基本功打卡群”球友们交流发...

前AMD、英特尔显卡架构师Raja再战GPU,号称要全面重构堆栈

IT之家8月5日消息,知名GPU架构师拉贾科杜里(RajaKoduri)此前曾先后在AMD和英特尔的显卡部门担任要职。而在今日,由Raja创立的GPU软件与IP初创企...

三种必须掌握的嵌入式开发程序架构

前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。我相...

怪不得别人3秒就知道软考案例怎么做能50+

软考高级统一合格标准必须三科都达到45分,案例分析也一直是考生头疼的一门,但是掌握到得分点,案例能不能50+还不是你们说了算吗?今天就结合架构案例考点,分享实用的备考攻略~一、吃透考点,搭建知识框架从...

UML统一建模常用图有哪些,各自的作用是什么?一篇文章彻底讲透

10万+爆款解析:9大UML图实战案例,小白也能秒懂!为什么需要UML?UML(统一建模语言)是软件开发的“蓝图”,用图形化语言描述系统结构、行为和交互,让复杂需求一目了然。它能:降低沟通成本避...

勒索软件转向云原生架构,直指备份基础设施

勒索软件组织和其他网络犯罪分子正越来越多地将目标对准基于云的备份系统,对久已确立的灾难恢复方法构成了挑战。谷歌安全研究人员在一份关于云安全威胁演变的报告中警告称,随着攻击者不断改进数据窃取、身份泄露和...

ConceptDraw DIAGRAM:释放创意,绘就高效办公新未来

在当今数字化时代,可视化工具已成为提升工作效率和激发创意的关键。ConceptDrawDIAGRAM,作为一款世界顶级的商业绘图软件,凭借其强大的功能和用户友好的界面,正逐渐成为众多专业人士的首选绘...

APP 制作界面设计教程:一步到位_app界面设计模板一套

想让APP界面设计高效落地,无需繁琐流程,掌握“框架搭建—细节填充—体验优化”三步法,即可一步到位完成专业级设计。黄金框架搭建是基础。采用“三三制布局”:将屏幕横向三等分,纵向保留三...

MCP 的工作原理:关键组件_mcp部件

以下是MCP架构的关键组件:MCP主机:像ClaudeDesktop、GitHubCopilot或旅行助手这样的AI智能体,它们希望通过MCP协议访问工具、资源等。MCP主机会...

软件架构_软件架构师工资一般多少

软件架构师自身需要是程序员,并且必须一直坚持做一线程序员。软件架构应该是能力最强的一群程序员,他们通常会在自身承接编程任务的同时,逐渐引导整个团队向一个能够最大化生产力的系统设计方向前进。软件系统的架...

不知不觉将手机字体调大!老花眼是因为“老了吗”?

现在不管是联系、交友,还是购物,都离不开手机。中老年人使用手机的时间也在逐渐加长,刷抖音、看短视频、发朋友圈……看手机的同时,人们也不得不面对“视力危机”——老花眼,习惯眯眼看、凑近看、瞪眼看,不少人...

8000通用汉字学习系列讲座(第046讲)

[表声母字]加(续)[从声汉字]伽茄泇迦枷痂袈笳嘉驾架咖贺瘸(计14字)嘉[正音]标准音读jiā。[辨形]上下结构,十四画。会意形声字,从壴从加,加也表声。注:从壴,字义与鼓乐有关;从加,字义与...

取消回复欢迎 发表评论: