2022年5月15日 星期日

An Embedded Database - SQLite

最近上課剛好認識SQLite,覺得它整個設計和故事都挺有趣的,所以決定寫個文章分享他的歷史、版權和設計的部分 :)

SQLite,是一個遵守ACID的關聯式資料庫管理系統(Relational Database Management System, RDBMS),它的全部就是一個C file,被整合在使用者程式中。


History

SQLite誕生於2000年,當時它的作者 D. Richard Hipp 在 General Dynamics工作,為美國海軍開發用於導彈驅逐艦的軟體。最初他們使用的數據庫是HP-UX和IBM Informix,對於非專業的工程師來說,熟悉設定和使用Informix就需要很多時間,Hipp 就想說能不能有一個self-contained 的Database,易於使用,並且可以隨程序一起移動並在任何地方運行,系統上也不需要安裝其他軟體或是設定

之後,只要有空閒時間Hipp就持續開發SQLite,並且在2000年8月發布了初版,它和其他RDBMS最大的概念上差別是, 大部分的RDBMS(MySQL, PostgreSQL)都是Server-Client,但是SQLite是Server-less,是直接對檔案做操作

從上圖可以看出來,如果使用SQLite就不需要擔心RDBMS崩潰的問題,也可以同時多個App讀寫同一Database(Single Disk File),衝突和讀寫由OS來處理


License? Public domain software

對於很多自由軟體(free software)來說,都會根據它的licenses來決定是否可否商業化,是否使用了要公開,但是對於SQLite,並不需要擔心這個,因為 SQLite是一個Public domain software,什麼是Public domain呢?就是不具有版權的作品

The public domain consists of all the creative work to which no exclusive intellectual property rights apply. Those rights may have expired, been forfeited, expressly waived, or may be inapplicable.

公共領域包括所有不適用專有知識產權的創造性作品。 這些權利可能已過期、被沒收、明確放棄或可能不適用。

底下是SQLite的LICENSE.md 內容,裡面描述了Hipp已經放棄了SQLite的版權,所以它已經屬於Public domain

The author disclaims copyright to this source code. In place of a legal notice, here is a blessing:

(作者否認此源代碼的版權。 代替法律聲明,這裡有一個祝福:) 

May you do good and not evil. (願你行善不作惡)

May you find forgiveness for yourself and forgive others. (願你為自己找到寬恕,也寬恕他人)

May you share freely, never taking more than you give. (願你自由分享,從不索取多於給予)

除了Hipp放棄了版權,任何貢獻代碼的人也都必須放棄他們的版權,簽署版權免責聲明

順便分享在Size isn't everything for the modest creator of SQLite | Technology | The Guardian 這篇關於Hipp的採訪中的一段話

"It's very clear to me that if I'd had any business sense whatsoever I could have made a lot of money, but I don't," he says. "I like to tell people that we make enough to live fine in Charlotte, North Carolina. We don't make nearly enough money to live in London or San Francisco, but we don't live there so that's OK," he adds - with a touch, just a touch, of wistfulness.

(“我很清楚,如果我有任何商業意識,我本可以賺很多錢,但我沒有,”他說。 “我喜歡告訴人們,我們賺的錢足以在北卡羅來納州夏洛特過上好日子。我們賺的錢還不夠住在倫敦或舊金山,但我們不住在那裡,所以沒關係,”他補充道 - 淡淡的,只是淡淡的,懷念。 )

那篇文章給的副標就是:SQLite被IT界的一些大廠使用-但他沒有從中賺到一分錢


An Embedded Database

Think of SQLite not as a replacement for Oracle but as a replacement for fopen()

(SQLite 不是 Oracle 的替代品,而是 fopen() 的替代品) 

 1. SQLite is a C-language library, One file of ANSI-C

SQLite是一個C-language library,只要include,就能透過function call 來操作database了,常用的function如下

所以SQLite 它不是作為一個獨立的process獨立運行,而是在它所服務的程式內運行。C語言如何使用這個庫可以參考SQLite with C-language Interface, 簡單練習SQLite,如果是其他語言的話可以透過一些既有的wrapper就能使用了


2. Based on PostgreSQL 6.5 syntax and semantics

當我們使用 sqlite3_exec() 去對DB做操作,裡面帶入的SQL語句(例如 SELECT * FROM table)是基於PostgreSQL 6.5的

int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */ 

); 

但SQLite的syntax and semantics和PostgreSQL還是有差別的,最大差別是它不檢查非主鍵的property type

那為什麼是選擇基於 PostgreSQL呢?因為當時 Hipp對市面上的很多RDBMS做了測試,他發現PostgreSQL總是可以回傳正確的資料且不會崩潰,所以SQLite很多想法(文件,規範,或是測試)都基於PostgreSQL,他們相信PostgreSQL做出的決定,直到現在WWPD (What Would Postgres Do)仍然是 SQLite 開發團隊的口頭禪。


3. Architecture

SQLite 是一個模塊化架構,稱為"The SQLite Stack",來管理Database,如果對內容有興趣的話,可以看D. Richard Hipp - SQLite [The Databaseology Lectures - CMU Fall 2015] - YouTube 這個影片,介紹得很仔細,大致的架構如下(喔 當然最後他們都在一個C file裡面)


Application of SQLite

官方提供的 Command Line Shell For SQLite 和 SQLite Archive Files 就是應用範例,至於其他的可以參考 (655) SQLite: Protégé of PostgreSQL - YouTube 影片中的介紹


沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。