數(shù)據(jù)庫的最簡單實現(xiàn)

作者:?阮一峰? ?http://www.ruanyifeng.com/blog/2014/07/database_implementation.html

所有應(yīng)用軟件之中,數(shù)據(jù)庫可能是最復(fù)雜的嗜愈。

MySQL的手冊有3000多頁赞季,PostgreSQL的手冊有2000多頁凯肋,Oracle的手冊更是比它們相加還要厚习贫。

但是粟害,自己寫一個最簡單的數(shù)據(jù)庫甚疟,做起來并不難。Reddit上面有一個帖子金麸,只用了幾百個字擎析,就把原理講清楚了。下面是我根據(jù)這個帖子整理的內(nèi)容。

一揍魂、數(shù)據(jù)以文本形式保存

第一步桨醋,就是將所要保存的數(shù)據(jù),寫入文本文件现斋。這個文本文件就是你的數(shù)據(jù)庫喜最。

為了方便讀取,數(shù)據(jù)必須分成記錄庄蹋,每一條記錄的長度規(guī)定為等長瞬内。比如,假定每條記錄的長度是800字節(jié)限书,那么第5條記錄的開始位置就在3200字節(jié)虫蝶。

大多數(shù)時候,我們不知道某一條記錄在第幾個位置倦西,只知道主鍵(primary key)的值能真。這時為了讀取數(shù)據(jù),可以一條條比對記錄调限。但是這樣做效率太低舟陆,實際應(yīng)用中误澳,數(shù)據(jù)庫往往采用B樹(B-tree)格式儲存數(shù)據(jù)耻矮。

二、什么是B樹忆谓?

要理解B樹裆装,必須從二叉查找樹(Binary search tree)講起。

二叉查找樹是一種查找效率非常高的數(shù)據(jù)結(jié)構(gòu)倡缠,它有三個特點哨免。

二叉查找樹的結(jié)構(gòu)不適合數(shù)據(jù)庫,因為它的查找效率與層數(shù)相關(guān)昙沦。越處在下層的數(shù)據(jù)琢唾,就需要越多次比較。極端情況下盾饮,n個數(shù)據(jù)需要n次比較才能找到目標值采桃。對于數(shù)據(jù)庫來說,每進入一層丘损,就要從硬盤讀取一次數(shù)據(jù)普办,這非常致命,因為硬盤的讀取時間遠遠大于數(shù)據(jù)處理時間徘钥,數(shù)據(jù)庫讀取硬盤的次數(shù)越少越好衔蹲。

B樹是對二叉查找樹的改進。它的設(shè)計思想是呈础,將相關(guān)數(shù)據(jù)盡量集中在一起舆驶,以便一次讀取多個數(shù)據(jù)橱健,減少硬盤操作次數(shù)。

B樹的特點也有三個沙廉。

這種數(shù)據(jù)結(jié)構(gòu)畴博,非常有利于減少讀取硬盤的次數(shù)。假定一個節(jié)點可以容納100個值蓝仲,那么3層的B樹可以容納100萬個數(shù)據(jù)俱病,如果換成二叉查找樹,則需要20層袱结!假定操作系統(tǒng)一次讀取一個節(jié)點亮隙,并且根節(jié)點保留在內(nèi)存中,那么B樹在100萬個數(shù)據(jù)中查找目標值垢夹,只需要讀取兩次硬盤溢吻。

三、索引

數(shù)據(jù)庫以B樹格式儲存果元,只解決了按照"主鍵"查找數(shù)據(jù)的問題促王。如果想查找其他字段,就需要建立索引(index)而晒。

所謂索引蝇狼,就是以某個字段為關(guān)鍵字的B樹文件。假定有一張"雇員表"倡怎,包含了員工號(主鍵)和姓名兩個字段迅耘。可以對姓名建立索引文件监署,該文件以B樹格式對姓名進行儲存颤专,每個姓名后面是其在數(shù)據(jù)庫中的位置(即第幾條記錄)。查找姓名的時候钠乏,先從索引中找到對應(yīng)第幾條記錄栖秕,然后再從表格中讀取。

這種索引查找方法晓避,叫做"索引順序存取方法"(Indexed Sequential Access Method)簇捍,縮寫為ISAM。它已經(jīng)有多種實現(xiàn)(比如C-ISAM庫和D-ISAM庫)够滑,只要使用這些代碼庫垦写,就能自己寫一個最簡單的數(shù)據(jù)庫。

四彰触、高級功能

部署了最基本的數(shù)據(jù)存忍萃丁(包括索引)以后,還可以實現(xiàn)一些高級功能。

(1)SQL語言是數(shù)據(jù)庫通用操作語言分蓖,所以需要一個SQL解析器尔艇,將SQL命令解析為對應(yīng)的ISAM操作。

(2)數(shù)據(jù)庫連接(join)是指數(shù)據(jù)庫的兩張表通過"外鍵"么鹤,建立連接關(guān)系终娃。你需要對這種操作進行優(yōu)化。

(3)數(shù)據(jù)庫事務(wù)(transaction)是指批量進行一系列數(shù)據(jù)庫操作蒸甜,只要有一步不成功棠耕,整個操作都不成功。所以需要有一個"操作日志"柠新,以便失敗時對操作進行回滾窍荧。

(4)備份機制:保存數(shù)據(jù)庫的副本。

(5)遠程操作:使得用戶可以在不同的機器上恨憎,通過TCP/IP協(xié)議操作數(shù)據(jù)庫蕊退。

(完)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市憔恳,隨后出現(xiàn)的幾起案子瓤荔,更是在濱河造成了極大的恐慌,老刑警劉巖钥组,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输硝,死亡現(xiàn)場離奇詭異,居然都是意外死亡者铜,警方通過查閱死者的電腦和手機腔丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作烟,“玉大人,你說我怎么就攤上這事砾医∧昧茫” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵如蚜,是天一觀的道長压恒。 經(jīng)常有香客問我,道長错邦,這世上最難降的妖魔是什么探赫? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮撬呢,結(jié)果婚禮上伦吠,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好毛仪,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布搁嗓。 她就那樣靜靜地躺著,像睡著了一般箱靴。 火紅的嫁衣襯著肌膚如雪腺逛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天衡怀,我揣著相機與錄音棍矛,去河邊找鬼。 笑死抛杨,一個胖子當(dāng)著我的面吹牛茄靠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝶桶,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼慨绳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了真竖?” 一聲冷哼從身側(cè)響起脐雪,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恢共,沒想到半個月后战秋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡讨韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年脂信,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片透硝。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰闪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出濒生,到底是詐尸還是另有隱情埋泵,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布罪治,位于F島的核電站丽声,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏觉义。R本人自食惡果不足惜雁社,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晒骇。 院中可真熱鬧霉撵,春花似錦磺浙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崭参,卻和暖如春呵曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背何暮。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工奄喂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人海洼。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓跨新,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坏逢。 傳聞我的和親對象是個殘疾皇子域帐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容