首頁 > 科技

2000 行程式碼,帶你寫一個自己的 SQL 資料庫

2021-06-10 17:41:59

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

在 C 被當做「高階語言」,雷布斯和小馬哥還在寫程式碼的年代,資料庫還不是一個成熟的事物。

和很多技術從簡單到複雜的發展歷程不太一樣,資料庫首先成熟並被大規模使用的是 RDBMS(關係型資料管理系統),後來才逐漸興起了實現相對簡單,以 Redis 為代表的 KV 型的資料庫。

資料庫從後端的技術上看是一個演算法、資料結構、系統工程、效能優化的交匯點。

筆者一直對資料庫領域充滿了興趣,前前後後主導和參與了很多資料庫及相關係統的開發。這三年的主要業餘時間都在研究資料庫,由於大多數資料庫項目都歷史悠久,程式碼量基本都在50萬行以上,閱讀起來讓人頗感頭疼。咬牙堅持了兩年,有了一點點心得。

因此決定寫一個程式碼量儘量少,但又能有現代資料庫的基本架構的項目,於是花了一週時間寫了「GO SQL DB」

「Go SQL DB」 是一個研究目的的支援SQL查詢的關係型資料庫。主要目標是為了向資料庫愛好者展示一個關係型資料庫的基本原理和關鍵設計。

因此,為了便於理解,採取了很多取巧但不是很嚴謹的設計,程式碼量控制在了 2000 行左右(包含了 400 多行的單元測試程式碼)。

特性列表

純 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[1]執行計劃 Planner

基於火山模型(Volcano Model)的 Select 實現[2]基於 HTTP 的查詢和插入介面實現的侷限

暫時沒有實現 DDL,僅有固定的 Schemastruct Row { Id uint32 Sex byte Age uint8 Username [32]byte Email [128]byte Phone [64]byte }SQL 語法的有限支援,參見單測用例[3]Tokenizer 由於是基於 Golang 語言本身的一個取巧實現,對於一些字元串裡的特殊字元支援會出現問題,可以通過加 「 解決傳送門

GitHub地址:

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

特別感謝

Marshal/Unmarshal Code generationDocument-oriented, embedded SQL database: genjiCockroachDB:https://github.com/cockroachdb/cockroachLet’s Build a Simple DatabaseSQL資料庫的歷史

最後說一下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+業務」端到端的超自動化平臺及解決方案,幫助企業實現數字化轉型,提升組織運營效率,提升企業業務價值。

— 完 —


IT145.com E-mail:sddin#qq.com