要建一棟大樓,首先肯定是需要一張詳細,漂亮的設計圖,一個系統的建立同樣也需要一個藍圖,如果矇頭直接幹,想到啥做啥,那這個系統到後面就會崩潰,其實這也是架構師存在的意義之一。
有一天,在搬磚的時候,突然,你對自己說:「不行,我不能整天做增刪改查,我是要成為程式媛的男人,就讓我自己做一個資料庫讓別人增刪改查吧!」
說做就做,你跑到某寶上買了一大塊硬碟,接上電腦,放在了自己的房間裡,:「這就是我實現資料庫的倉庫了!」
然後,你想著要做一個資料庫,自己肯定要先畫一個資料庫的藍圖(架構圖)吧!
我們先有點儀式感,給我們要繪畫的架構藍圖檔案起個名字,就叫dggz(大哥關注)吧!
那有了自己的硬碟,然後第一步,在dggz上畫一個資料倉儲。
有了資料倉儲,接下來你就考慮一個問題,資料倉儲需要一個磁碟管理器來存取檔案吧,於是乎你就萌生了三個解決方案,
1.使用目前作業系統提供的檔案系統來作為自己資料倉儲的磁碟管理器。
2.自己寫一個磁碟管理器?
3.在現有的檔案系統上加以改造,使這個磁碟管理器適合自己的資料倉儲。
資料庫經常要做的是拿裡面得資料元組出來做事,很明顯現有得檔案系統以檔案為單位並不顯得那麼合適,那是否可以考慮自己寫一個磁碟管理器?很明顯,如果能自己寫一個磁碟管理器是最適合咱們資料倉儲的方案了,但是成本過高,時間成本和人力成本都太高,那只有第三種折中的方案了,在現有的檔案系統上加以改造,使它適應我們自己的資料倉儲了。
說幹就幹,咱要使現有的檔案系統適應咱自己的倉庫,那咱自己的倉庫就要有一些問題需要解決。
1.資料項怎麼表示呢,就是 姓名,年齡這些資料在倉庫裡用varchar和interger 都用bytes表示,但怎麼表示這個問題需要我們自己考慮。
2.記錄怎麼表示,就是資料項的集合,比如說 姓名年齡是user表的模式,那麼一條記錄就是 (小明,18),這條記錄在檔案中要怎麼表示。
3.每次把資料讀入記憶體,不大可能一次一條的讀,那每次肯定讀入一個塊為單位會更合適,那麼記錄在塊中怎麼組織比較合適呢?
4.記錄怎麼修改呢?比如說修改後記錄超出塊的範圍等等問題?
5.塊要怎麼在檔案中表示呢?
終於,歷經千辛萬苦,咱們解決了以上的問題,對現有的 檔案系統完成了改造。可以在dggz上加上儲存管理器了。
接下來,咱要考慮一下讀取的效率問題了,資料的讀取如果每次都是直接從磁碟讀出來,那麼咱這個資料庫的效率肯定不會特別的高,所以咱在記憶體中肯定要設定一個緩衝區,用來交換資料,儲存一些資料,讓交換到磁碟裡的次數減少,於是咱可以在dggz上上一塊緩衝區。
有了這塊緩衝區,肯定需要涉及到緩衝區的管理,考慮以下問題,
1.緩衝區的結構怎麼設計?
2.緩衝區的置換演演算法怎麼設計?
3.緩衝區的怎麼管理,就是怎麼從磁碟把資料置換到緩衝區?
解決完以上問題,咱們就可以在dggz上畫一個緩衝區管理器了。
下一步呢?我們要從磁碟裡讀資料,但每次讀資料總不能都全表掃描把,肯定需要一個索引,和檔案的管理器吧,用來記錄和管理索引。利用索引,檔案,記錄等資訊,穿過緩衝區讀取倉庫裡的檔案。
有了對咱資料庫操作的整套工具後,就要考慮對外的開放了,需要有SQL語句,那定義好咱們的SQL語句,就需要有一個查詢的編譯器。
此時,解析完這些語句,肯定需要一個執行這些語句的工具,執行引擎就出現了。
就這樣,咱的一個簡單的資料庫就完成了,但是這樣的資料庫在軟體設計上有諸多的不完善,無法商用,比如說如果資料出現丟失,咱們資料庫有什麼辦法恢復嗎?這個時候就需要一個紀錄檔和恢復的管理器吧。
有了紀錄檔,咱得考慮下一個事情,如果咱對資料庫的操作,比如說銀行轉賬,A往B的賬戶賺錢,A轉了100萬到B的賬戶,這個時候銀行系統崩潰了,然後恢復,這個時候B的賬戶還沒有轉進100萬,於是乎發生了官司,怎麼辦,咱們肯定不會允許這個事情發生,所以咱就考慮把A賬戶減100萬和B賬戶加100萬繫結成一組操作,要麼都做,要麼都不做,我們稱這個東西叫事務,這樣才能保證我們資料庫的正確性和安全性,於是乎,咱就往資料庫裡新增了一個事務管理器。當然,事務需要記錄在紀錄檔中才安全。
這個時候資料庫的安全性和正確性得到了滿足,但是資料庫是同時很多人在用的,現在咱們完成的只是單人的使用,如果多個人一起使用,還是會發生比如兩個同時存取一個資料,一個讀一個寫,就會有不正確的事發生,所以要加上並行控制,當然,並行控制目前主流的還是用鎖,所以我們需要一個鎖表。
嗯嗯,做系統的都知道,需要管理員,那就來一個資料庫管理員吧。
然後一個完整的資料庫系統就新鮮出爐啦!
你滿意的看了看自己的磚,搬得更加賣力了。
挖了這麼多的坑,下一章終於要開始填坑了!下一章先講講記憶體吧!
最後,還是那句話,大哥姐姐們,碼字不易,來點贊吧,有打賞我也不介意嘿嘿。