2000行代码,带你写一个自己的SQL数据库sqloracle程序员ibm

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

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

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

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

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

特性列表

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

存储引擎

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

SQLParser

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

执行计划Planner

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

实现的局限

暂时没有实现DDL,仅有固定的SchemastructRow{Iduint32SexbyteAgeuint8Username[32]byteEmail[128]bytePhone[64]byte}SQL语法的有限支持,参见单测用例[3]Tokenizer由于是基于Golang语言本身的一个取巧实现,对于一些字符串里的特殊字符支持会出现问题,可以通过加“解决

传送门

GitHub地址:

[1]SQL-2011SQLParser:

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

[3]单测用例:

特别感谢

SQL数据库的历史

最后说一下SQL数据库的历史吧。

上世纪60年代,由于IT技术尚未普及,硬件能力也捉襟见肘。程序员面临的业务逻辑还不是很复杂,但更可怕的是当时没有Google,更没有GitHub、StackOverflow。即使是构建一个最简单的增删改查系统也需要自己手动调用操作系统反人类的API,应用各种数据结构、算法去完成数据的存储和检索。

关系型数据库的大规模应用和SQL被普遍认可成为了关系型数据库的标准查询语言有很大的关系:

SQL编程语言最初是IBM研究人员RaymondBoyce和DonaldChamberlin在1970年代开发“SystemR”的过程中落地的。SQL当时被称为SEQUEL(这也是SQL普遍读法的由来)后来由于注册商标的问题,才改名为SQL。SQL的发明很大程度上是参考了EdgarFrankCodd于1970年发布论文《ARelationalModelofDataforLargeSharedDataBanks》。

1977年,32岁的程序员Larry从在IBM工作的好基友Oates那里拿到一本内部期刊《IBMResearchJournal》,从上面读到了SystemR的一些消息。由于技术人员对技术的敏感性,他们觉得这玩意儿一定会大火,于是三个30多岁的程序员决定去创业,于是自己凑钱创建了一个软件开发公司。公司名也是取得相当直白:SDL(SoftwareDevelopmentLabs,”软件开发实验室”)。随着IBMSystemR的推出市场,SQL语言迅速普及,Larry原来只是想开发一个兼容SystemR的数据库系统,跟在IBM后面喝点汤。

但SystemR竟然把返回的ErrorCodes当成了秘密保护了起来。不让我加入,那我就跟你打,于是Larry把公司名改成“RelationalSoftware,Inc”准备跟IBM死磕。1年后,他们开发出了数据库产品的第一个版本并把它命名为“Oracle”,更让大家开心的是他们成功的把产品买给了美国海军和中央情报局等政府部门。于是大家买了个蛋糕给公司过了一个一周岁的生日,留下了这张照片:

1979年,RSI公司发布了Oraclev2和一个自己的SQL版本……

7年之后Oracle上市,程序员Larry和Oates走上人生巅峰,持剑少年变恶龙……

Oracle上市的同年,SQL正式被ANSI(AmericanNationalStandardsInstitute)定为标准,第二年SQL成为了ISO标准,编号:ISO/IEC9075。此后分别在:1989,1992,1996,1999,2003,2006,2008,2011,2016年不断增补,就有了后世经常提到的SQL-89、SQL-92、SQL:2011等叫法。

关于山景智能

山景智能是一家AI赋能的企业业务超自动化解决方案提供商,是国内企业业务超自动化的领军者。

山景致力于推动企业业务超自动化,瞄准中国中大型企业业务端场景,基于云原生架构,融合业务驱动+AI增强型数据管理、自动机器学习、模型可解释、零代码敏捷开发等创新技术,面向企业提供“数据+AI+业务”端到端的超自动化平台及解决方案,帮助企业实现数字化转型,提升组织运营效率,提升企业业务价值。

THE END
1.设计一个图书管理系统数据库数据库缓存:我们可以使用缓存技术,将常用的数据缓存到内存中,以提高查询速度。 五、总结 设计一个图书管理系统数据库需要进行需求分析、数据库设计、数据库实现和数据库优化等步骤。通过合理的数据库设计和优化,可以提高图书管理系统的性能,提高图书馆的服务质量。https://www.dugusoft.com/zixun/zixun1351.html
1.银行储蓄系统mysql设计mob649e815e6170的技术博客在开发一个银行储蓄系统时,MySQL 数据库的设计是至关重要的一步。良好的数据库设计能够确保数据的完整性与高效性。接下来,我将引导你完成这个过程,并分享如何进行数据库设计的步骤和相应的代码示例。 项目流程概述 为了实现这个银行储蓄系统,我们可以将整个过程分为几个关键步骤。以下是一个初步的项目流程,保证你清晰...https://blog.51cto.com/u_16175475/12530838
2.创建单一数据库本快速入门使用无服务器数据库,因此将“服务层”设置为“常规用途(最具预算优势的无服务器计算)”,将“计算层”设置为“无服务器”。 选择“应用”。 在“备份存储冗余”下,为将保存备份的存储帐户选择一个冗余选项。 有关详细信息,请参阅备份存储冗余。 https://azure.microsoft.com/documentation/articles/sql-database-get-started/
3.MySQL数据库实验实现简单数据库应用系统设计Mysql这篇文章主要介绍了MySQL数据库实验实现简单数据库应用系统设计,文章通过理解并能运用数据库设计的常见步骤来设计满足给定需求的概念模和关系数据模型展开详情,需要的朋友可以参考一下+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 观前提示:本篇内容为...https://www.jb51.net/article/252268.htm
4.收藏100道Linux面试题附答案腾讯云开发者社区一、Linux 概述 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。 https://cloud.tencent.com/developer/article/2142555
5.PowerDesigner中实现CDM(概念模型)设计并转化为PDM(物理模型...关系数据库从应用以来,一直是数据关系系统数据存储方式的不二选择,本博文是在一个关系数据库学习过程中对一个简单的关系数据库进行系统分析和模型设计的基础上,应用数据建模工具PowerDesigner工具来描叙概念数据模式CDM图,并转化成特定数据库中的物理数据模式的过程PDM,其中包括对Powerdesigner工具的使用方法的简单讲解,及从...https://download.csdn.net/download/trudream/4863607
6.全国计算机二级考试哪个最简单全国计算机二级考试是全国计算机等级考试简称NCRE,是四个等级中的一个等级。包含语言程序设计,包括C、C++、Java、Visual Basic、WEB程序设计;数据库程序设计(包括VisualFoxPro、Access、MySql);MS office高级应用包括Word、EXCEL、PPT办公软件高级应用。计算机二级考试哪个最简单?下面百分网小编带大家一起来看看详细内容,希望...https://www.oh100.com/kaoshi/ncre2/tiku/482381.html
7.软件工程导论作业基本原理: 1.用分阶段的生命周期计划严格管理 2.坚持进行阶段评审 3.实行严格的产品控制 4.采用现代程序设计的技术 5.结果应能清楚地审查 6.开发小组的人员应该少而精 7.承认不断改进软件工程实践的必要性。 1.3 什么是软件?它有什么特点? 答:软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据结...https://www.unjs.com/zuixinxiaoxi/ziliao/20170805000008_1416273.html
8.案例数据库设计9篇(全文)校企合作的此类实训项目中,进行数据库设计与实现所用知识、技术,基础来自于校内所学,但又远高于校内简单的数据库理论知识,是学生按软件工程流程做项目开发最重要的一个环节,数据库设计的好坏,直接影响后期软件开发和维护。 摘要:该文介绍了如何使用UML进行数据库设计。首先建立静态模型,然后根据映射策略将模型映射为数据...https://www.99xueshu.com/w/ikey3pf3ms57.html
9.2010年7月电子商务全国自主考试(互联网数据库)真题自考4.在分布式数据库系统中,数据的共享有两个层次:___和全局共享。 5.按复杂程度可将多媒体数据模型分为三种:简单型、复杂型和___。 6.VBScript变量中,包含一系列值的变量称为___变量。 7.SQL语言中,___语句的主要作用是提交事务。 8.在数据字典中,反映数据之间组合关系的是___。 https://www.educity.cn/zikao/28669.html
10.保障性理论基础与保障性分析目标相对应,保障性分析应用于两个方面:一是提出有关保障性的设计因素;二是确保建立优化的保障系统与保障体制。前者是根据装备的任务需求,确定战备完好性与保障性目标,进而提出与确定可靠性、维修性、测试性、运输性等有关保障性的设计要求,以影响装备的设计,这是将保障性考虑有效地纳入装备设计,使研制的...https://mp.ofweek.com/im/a645693221836
11.NavicatDataModeler优越的数据库模型和设计工具使用模型转换功能,你可以将一个概念业务级别的模型转换为逻辑关联数据库模型,然后转换为物理数据库。从草拟你的系统设计大纲,到查看关系和设置链接的实体、表和视图的属性和字段。你可以轻松地配置精确的改变到数据库结构,并创建有组织和更有效的数据库系统。https://www.navicat.com.cn/products/navicat-data-modeler