如何實現一個關係資料庫?

Stackoverflow 上的建議是讀SQLite 源碼。有沒有更系統的著作或教程?

還有哪些開源代碼可以參考?


Database Management Systems - 3rd Edition - Ramakrishnan Gehrke


題主說的關係資料庫,可以理解為 Relational Database Management Systems (RDBMS) 吧。要實現一個這麼一個複雜的玩意,我覺得比較靠譜的方法是先寫一個非常簡單的版本,理解其中最基本的東西,然後再慢慢深入學習,否則一個 SQL 解析的就夠寫好一陣子了。

我上了一門課,課程設計就是做一個簡單的 RDBMS,上課用的就是 @vczh 巨巨提到的這本書,讀起來挺順溜。斷斷續續做了兩個月,即使是兩人組隊,功能也簡單,感覺還是很有難度,大約只拿到 90% 的分。課程設計分為四個階段,基本上每一階段實現這個 RDBMS 的一個模塊。

細節不談,只說說框架。

第一個模塊是 分頁文件管理,資料庫系統按頁操作文件,好,這一模塊結束了,非常簡單。

第二個模塊是 記錄文件管理,在前一個模塊的基礎上,操作一個文件頁中的某一條記錄,該模塊負責插入,刪除,遍歷。這裡也比較簡單,舉個栗子,為了簡化操作,處理一條記錄,就讀入並寫出一個文件頁,這種辦法在實際的開發中是絕不可能出現的,至少要用個 MRU 之類的方法管理緩存。這是為了不把學習曲線搞得太陡。

第三個模塊是 關係管理,也可以說是管理,調用前面(低層)的模塊,管理資料庫中的表。

第四個模塊是 索引管理,實現基於 B+ 樹的索引管理,難度陡然上升,有點讓人聯想起畫馬的教程了 - -#。

第五個模塊是 查詢引擎,這裡不解析 SQL,只實現一些基本的操作,比如最基本的 filter,這樣的:SELECT * FROM Table1 WHERE Table1.id &> 10,還有 project,這樣的:SELECT Table1.id FROM Table1,以及 nested-loop join 和 index nested-loop join,差不多是這樣:SELECT * FROM Table1, Table2 WHERE Table1.id = Table2.id。剩下的就是構造一些上述操作的組合,來實現非常簡單的查詢。

一張圖概括:

總結,題主如果想實現一個關係資料庫,出於學習的目的,不妨先做個簡單的,對整體比較有把握了以後再逐步細化。

題外話,別的課可以用 Java, Python, Obj-C,而這門課主要用的是 C 和一點 C++,各種 memcpy,內存管理,類型轉換,導致我現在對 C++ 有點…(._.)


1. 文件系統。 所有數據以二進位文件存儲,數據段等長或者變長。

2. B+樹組織形式

3. 索引

4. SQL語句

5. join

6. transaction

7. 備份與容災

8. client支持遠程操作等


可以看看H2的源代碼,純Java寫的調試和閱讀起來都要方便很多。更經典的可以去看看PostgreSQL的代碼。


推薦TZ去看PostgreSQL的源代碼,PG的源代碼非常規範,不像是MYSQL的源代碼,是故意混淆過的。PG是RDBMS中的學院派,最早的RDBMS,完全開源


推薦閱讀:

如何學習Zynq?
為什麼國內創造不出很棒的編程語言?
一般編程語言都是英文的,大家對中文編程有什麼樣的看法,中文編程有哪些優劣勢?
為什麼目前流行的編程語言都是很早以前就發明的?
如果計算機是由中國人發明的,那麼編程時寫代碼會是全中文嗎?

TAG:資料庫 | 編程語言 | 編程 | 文件系統 |