隨著國產(chǎn)化的呼聲越來越高,國家也越來越重視,數(shù)據(jù)庫國產(chǎn)化一直是大家遇到的重要困難。那么個玩意,國內(nèi)就是沒有可以替代的好產(chǎn)品,主要是國內(nèi)的環(huán)境,大家都懂的,領(lǐng)導們不懂技術(shù),都只看形式,以及想要看到的數(shù)據(jù),或者為了騙取經(jīng)費,科研人員忙著應付各類的填表,報告,制度的約束,沒有很好的科研環(huán)境。所以國內(nèi)很難誕生跨時代的技術(shù)產(chǎn)品。
我們找到一篇外文,供給大家參考一下。
翻譯
這個是好問題,值得長期回答.
大部分數(shù)據(jù)庫是由c編寫的,通過b樹存儲數(shù)據(jù).在過去的一段時間李,有個產(chǎn)品叫C-Isam(c的library 用于索引順序訪問方法),這是一個低水平就能幫助c語言程序員寫數(shù)據(jù)以b 樹的數(shù)據(jù)格式.所以你需要知道b樹并且立即他是什么.
大部分數(shù)據(jù)庫存儲數(shù)據(jù)的時候都會構(gòu)建索引.讓我們假設一行記錄是800字節(jié),你寫5行到一個文件.付過行包含類似firstname,lastname,address等字段,并且你想要通過lastname搜索一條特殊的記錄,你可以打開文件,順序搜索每一條記錄,但是這個很慢.相反的,你打開索引文件,索引文件包含了lastname和行記錄在數(shù)據(jù)文件的位置.然后當你你定位到你打開的文件,調(diào)到剛才索引找到的問題,讀取數(shù)據(jù).因為索引數(shù)據(jù)非常小,他可以非??斓恼业綌?shù)據(jù).并且索引文件按照b樹組織數(shù)據(jù),他可以非常快并且有效的查找.
所以你要理解,對于一張表,會有一份數(shù)據(jù)文件和一份(或多分)索引文件.第一個索引可以是lastname,下一個可能是SS number.當用戶定義他們的查詢?nèi)カ@取一些數(shù)據(jù),他們會決定使用哪個索引去查找.如果你能找到任何信息在 C-ISAM 上,你將會很好的理解這個概念.
一旦你存儲數(shù)據(jù),索引文件,使用ISAM去達到想要通過一個值找到一條記錄,或者插入一條新的記錄.然而現(xiàn)代數(shù)據(jù)庫服務器都支持sql,所以你需要一個sql解析器,他會轉(zhuǎn)化sql語句到一系列相關(guān)的get.sql 可能join 2張表 ,所以哪一個表需要先去讀的優(yōu)化是有必要的(一般是根據(jù)索引命中的行數(shù)),并且如何關(guān)聯(lián)第二張表的數(shù)據(jù).sql能夠插入數(shù)據(jù),所以你需要去解析到put語句,但是他支持結(jié)合多個插入語句到事務,所以你需要事務管理器來管理事務,你需要事務日志去存儲事務.
可能你需要回滾/重新存儲 命令去回滾你的數(shù)據(jù)文件和索引文件,可能同樣包含你的事務日志文件.如果你真的想要這么做,你可以寫一些復制工具去備份你的數(shù)據(jù)庫到另一個服務器. 記錄如果你的客戶端程序駐留在單獨的機器上,那么你的數(shù)據(jù)庫服務器需要寫一個連接管理器用于發(fā)送sql請求通過tcp/ip協(xié)議到你的服務器.授權(quán)需要一些認證,解析請求,執(zhí)行g(shù)ets,發(fā)送執(zhí)行完的結(jié)果數(shù)據(jù)給客戶端.
所以這些數(shù)據(jù)庫服務器能后一直工作,尤其是為一個人.但是你創(chuàng)建一個簡單的版本為這些工具在一個時間.以如何存儲數(shù)據(jù)和索引開始,如何取回數(shù)據(jù)通過ISAM接口.
這里有一些樹–找一些舊書關(guān)于mysql和msql,在google上找btrees和isam,找開源的isam 的C實現(xiàn). 對c操作文件io有一個好的理解在linux服務器上.許多商業(yè)數(shù)據(jù)庫現(xiàn)在甚至不使用文件系統(tǒng)存儲數(shù)據(jù),由于緩存問題–他們直接寫行數(shù)據(jù)到硬盤.你最初只是想寫入文件.
希望本文對你有一點幫助
數(shù)據(jù)庫的最簡單實現(xiàn)
數(shù)據(jù)庫的最簡單實現(xiàn)
所有應用軟件之中,數(shù)據(jù)庫可能是最復雜的。
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ù),可以一條條比對記錄。但是這樣做效率太低,實際應用中,數(shù)據(jù)庫往往采用B樹(B-tree)格式儲存數(shù)據(jù)。
二、什么是B樹?
要理解B樹,必須從二叉查找樹(Binary search tree)講起。
二叉查找樹是一種查找效率非常高的數(shù)據(jù)結(jié)構(gòu),它有三個特點。
(1)每個節(jié)點最多只有兩個子樹。
(2)左子樹都為小于父節(jié)點的值,右子樹都為大于父節(jié)點的值。
(3)在n個節(jié)點中找到目標值,一般只需要log(n)次比較。
二叉查找樹的結(jié)構(gòu)不適合數(shù)據(jù)庫,因為它的查找效率與層數(shù)相關(guān)。越處在下層的數(shù)據(jù),就需要越多次比較。極端情況下,n個數(shù)據(jù)需要n次比較才能找到目標值。對于數(shù)據(jù)庫來說,每進入一層,就要從硬盤讀取一次數(shù)據(jù),這非常致命,因為硬盤的讀取時間遠遠大于數(shù)據(jù)處理時間,數(shù)據(jù)庫讀取硬盤的次數(shù)越少越好。
B樹是對二叉查找樹的改進。它的設計思想是,將相關(guān)數(shù)據(jù)盡量集中在一起,以便一次讀取多個數(shù)據(jù),減少硬盤操作次數(shù)。
B樹的特點也有三個。
(1)一個節(jié)點可以容納多個值。比如上圖中,最多的一個節(jié)點容納了4個值。
(2)除非數(shù)據(jù)已經(jīng)填滿,否則不會增加新的層。也就是說,B樹追求"層"越少越好。
(3)子節(jié)點中的值,與父節(jié)點中的值,有嚴格的大小對應關(guān)系。一般來說,如果父節(jié)點有a個值,那么就有a+1個子節(jié)點。比如上圖中,父節(jié)點有兩個值(7和16),就對應三個子節(jié)點,第一個子節(jié)點都是小于7的值,最后一個子節(jié)點都是大于16的值,中間的子節(jié)點就是7和16之間的值。
這種數(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ù)庫中的位置(即第幾條記錄)。查找姓名的時候,先從索引中找到對應第幾條記錄,然后再從表格中讀取。
這種索引查找方法,叫做"索引順序存取方法"(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命令解析為對應的ISAM操作。
(2)數(shù)據(jù)庫連接(join)是指數(shù)據(jù)庫的兩張表通過"外鍵",建立連接關(guān)系。你需要對這種操作進行優(yōu)化。
(3)數(shù)據(jù)庫事務(transaction)是指批量進行一系列數(shù)據(jù)庫操作,只要有一步不成功,整個操作都不成功。所以需要有一個"操作日志",以便失敗時對操作進行回滾。
(4)備份機制:保存數(shù)據(jù)庫的副本。
(5)遠程操作:使得用戶可以在不同的機器上,通過TCP/IP協(xié)議操作數(shù)據(jù)庫。
外文原文如下,翻譯可能不好,可以參考:
How do you build a database? (self.Database)
Its a great question, and deserves a long answer.
Most database servers are built in C, and store data using B-tree type constructs.
In the old days there was a product called C-Isam (c library for an indexed sequential access method) which is a low level library to help C programmers write data in B-tree format.
So you need to know about btrees and understand what these are.
Most databases store data separate to indexes. Lets assume a record (or row) is 800 bytes long and you write 5 rows of data to a file.
If the row contains columns such as first name, last name, address etc. and you want to search for a specific record by last name, you can open the file and sequentially search through each record but this is very slow.
Instead you open an index file which just contains the lastname and the position of the record in the data file.
Then when you have the position you open the data file, lseek to that position and read the data.
Because index data is very small it is much quicker to search through index files.
Also as the index files are stored in btrees in it very quick to effectively do a quicksearch (divide and conquer) to find the record you are looking for.
So you understand for one “table” you will have a data file with the data and one (or many) index files.
The first index file could be for lastname, the next could be to search by SS number etc.
When the user defines their query to get some data, they decide which index file to search through.
If you can find any info on C-ISAM (there used to be an open source version (or cheap commercial) called D-ISAM) you will understand this concept quite well.
Once you have stored data and have index files, using an ISAM type approach allows you to GET a record based on a value, or PUT a new record.
However modern database servers all support SQL, so you need an SQL parser that translates the SQL statement into a sequence of related GETs.
SQL may join 2 tables so an optimizer is also needed to decide which table to read first (normally based on number of rows in each table and indexes available) and how to relate it to the next table.
SQL can INSERT data so you need to parse that into PUT statements but it can also combine multiple INSERTS into transactions so you need a transaction manager to control this, and you will need transaction logs to store wip/completed transactions.
It is possible you will need some backup/restore commands to backup your data files and index files and maybe also your transaction log files, and if you really want to go for it you could write some replication tools to read your transaction log and replicate the transactions to a backup database on a different server.
Note if you want your client programs (for example an SQL UI like phpmyadmin) to reside on separate machine than your database server you will need to write a connection manager that sends the SQL requests over TCP/IP to your server, then authenticate it using some credentials, parse the request, run your GETS and send back the data to the client.
So these database servers can be a lot of work, especially for one person.
But you can create simple versions of these tools one at a time.
Start with how to store data and indexes, and how to retrieve data using an ISAM type interface.
There are books out there - look for older books on mysql and msql, look for anything on google re btrees and isam, look for open source C libraries that already do isam.
Get a good understanding on file IO on a linux machine using C.
Many commercial databases now dont even use the filesystem for their data files because of cacheing issues - they write directly to raw disk.
You want to just write to files initially.
I hope this helps a little bit.
2024-07-11 16:25:16
2024-07-08 16:52:55
2024-07-01 11:17:11
2024-05-17 16:26:26
2024-05-15 14:37:53
2024-05-09 18:08:16
2024-04-29 16:29:55
2024-04-24 15:58:15
2024-04-22 17:27:24
2024-03-18 15:17:11
本文版權(quán)歸作者所有!如有侵權(quán),請聯(lián)系管理員刪除。文章僅代表作者觀點,不代表行迪醫(yī)管立場。
網(wǎng)友評論
未登錄