4. 常用內(nèi)存數(shù)據(jù)庫
4.1 SQLite
SQLite是一個小型的C程序庫,實現(xiàn)了獨立的,可嵌入的,零配置的SQL數(shù)據(jù)庫引擎。特性包括:
- 事務(wù)操作是原子,一致,孤立,并且持久的(ACID),即使在系統(tǒng)崩潰和電源故障之后。
- 零配置——不需要安裝和管理。
- 實現(xiàn)了絕大多數(shù)SQL92標(biāo)準(zhǔn)。
- 整個數(shù)據(jù)庫存儲在一個單一的文件中。
- 數(shù)據(jù)庫文件可以在不同字節(jié)序的機器之間自由地共享。
- 支持最大可達(dá)2T的數(shù)據(jù)庫。 (241
字節(jié))
字符串和BLOB類型的大小最大可達(dá) 2G 字節(jié)(231字節(jié))。小的代碼: 完整配置的少于250KB,忽略一些可選特性的少于150KB。在大多數(shù)常見操作上比流行的客戶/服務(wù)器數(shù)據(jù)庫引擎更快。簡單,易于使用的API。內(nèi)建TCL綁定。 另外提供可用于許多其他語言的綁定。具有良好注釋的源代碼,95%經(jīng)過測試。獨立:沒有外部依賴。源代碼位于公共域。 可用于任何用途。
SQLite發(fā)行版包含一個獨立的命令行訪問程序(sqlite),可用于管理SQLite數(shù)據(jù)庫,并適合作為一個如何使用SQLite庫的例子。
License: SQLite使用Public domain授權(quán)(注),對于個人使用和商業(yè)使用都是免費的。
技術(shù)上的優(yōu)點和特性
SQLite是一個輕量級、跨平臺的關(guān)系型數(shù)據(jù)庫。
◇輕量級
先說它的第一個特色:輕量級。想必SQLite的作者很看重這個特性,連它的Logo都是用的“羽毛”,來顯擺它的輕飄飄。SQLite和C/S模式的數(shù)據(jù)庫軟件不同,它是進程內(nèi)的數(shù)據(jù)庫引擎,因此不存在數(shù)據(jù)庫的客戶端和服務(wù)器。使用SQLite一般只需要帶上它的一個動態(tài)庫,就可以享受它的全部功能。而且那個動態(tài)庫的尺寸也挺小,以版本3.6.11為例,Windows下487KB、Linux下347KB。
◇ 綠色軟件
SQLite的另外一個特點是綠色:它的核心引擎本身不依賴第三方的軟件,使用它也不需要“安裝”。所以在部署的時候能夠省去不少麻煩。
◇單一文件
所謂的“單一文件”,就是數(shù)據(jù)庫中所有的信息(比如表、視圖、觸發(fā)器、等)都包含在一個文件內(nèi)。這個文件可以copy到其它目錄或其它機器上,也照用不誤。
★技術(shù)上的缺點和不足
◇并發(fā)訪問的鎖機制
SQLite在并發(fā)(包括多進程和多線程)讀寫方面的性能一直不太理想。數(shù)據(jù)庫可能會被寫操作獨占,從而導(dǎo)致其它讀寫操作阻塞或出錯。
SQL標(biāo)準(zhǔn)支持不全
在它的官方網(wǎng)站上,具體列舉了不支持哪些SQL92標(biāo)準(zhǔn)。我個人感覺比較不爽的是不支持外鍵約束。
◇網(wǎng)絡(luò)文件系統(tǒng)(以下簡稱NFS)
有時候需要訪問其它機器上的SQLite數(shù)據(jù)庫文件,就會把數(shù)據(jù)庫文件放置到網(wǎng)絡(luò)共享目錄上。這時候你就要小心了。當(dāng)SQLite文件放置于NFS時,在并發(fā)讀寫的情況下可能會出問題(比如數(shù)據(jù)損壞)。原因據(jù)說是由于某些NFS的文件鎖實現(xiàn)上有Bug。
★編程語言接口
SQLite支持很多種語言的編程接口。這對于我這種喜歡混用多種編程語言的人來說,是很爽的。下面我大概介紹一下。
◇C/C++
由于SQLite本身是C寫的,它自帶的API也是C接口的。所以C/C++用起來最直接了。假如你不喜歡面向過程的C API風(fēng)格,可以另外找個C++的包裝庫。想重新發(fā)明輪子的同學(xué),也可以自己包裝一個。
◇Java
如果要用Java訪問SQLite,可以通過SQLite的JDBC驅(qū)動,或者通過專門的SQLite包裝庫。我個人建議走JDBC方式,萬一將來要換數(shù)據(jù)庫,代碼就不用大改。
◇Python
pysqlite是Python操作SQLite的首選。從Python 2.5開始,它已經(jīng)被整合到Python的標(biāo)準(zhǔn)庫中。看來Python社區(qū)還是蠻喜歡SQLite嘛。
◇.Net
對于喜歡.Net的同學(xué),可以通過SQLite的ADO.NET驅(qū)動來訪問。
◇Ruby
Ruby可以通過SQLite-Ruby操作SQLite數(shù)據(jù)庫,不過我沒用過。
◇Perl
在CPAN上有DBD::SQLite,不過我也沒用過。
★一些非技術(shù)的參考因素
需要根據(jù)“如何選擇開源項目”里面提到的幾個參考因素,再評估一下。
◇授權(quán)協(xié)議(License)
SQLite使用的是Public Domain協(xié)議,這是最爽一種,可以放心大膽地用。
◇用戶的普及程度
最近這幾年,使用SQLite的人越來越多。包括一些大公司也開始把它整合到產(chǎn)品中(比如Google的Gears、Apple的Safari、Adobe的AIR)。
◇開發(fā)的活躍程度
如果到SQLite的Change Log上大致了解一下,可以看出最近5年基本上每1-2個月都會有更新。說明開發(fā)的活躍度還是非常高的。
SQLite不同于其他大部分的SQL數(shù)據(jù)庫引擎,因為它的首要設(shè)計目標(biāo)就是簡單化:
- 易于管理
- 易于使用
- 易于嵌入其他大型程序
- 易于維護和配置
許多人喜歡SQLite因為它的小巧和快速. 但是這些特性只是它的部分優(yōu)點, 使用者還會發(fā)現(xiàn)SQLite是非常穩(wěn)定的. 出色的穩(wěn)定性源于它的簡單, 越簡單就越不容易出錯. 除了上述的簡單、小巧和穩(wěn)定性外, 最重要的在于SQLite力爭做到簡單化.
簡單化在一個數(shù)據(jù)庫引擎中可以說是一個優(yōu)點, 但也可能是個缺點, 主要決定于你想要做什么. 為了達(dá)到簡單化, SQLite省略了一些人們認(rèn)為比較有用的特性, 例如高并發(fā)性、 嚴(yán)格的存取控制、豐富的內(nèi)置功能、 存儲過程、復(fù)雜的SQL語言特性、 XML以及Java的擴展, 超大的萬億級別的數(shù)據(jù)測量等等. 如果你需要使用上述的這些特性并且不介意它們的復(fù)雜性, 那么SQLite也許就不適合你了. SQLite沒有打算作為一個企業(yè)級的數(shù)據(jù)庫引擎, 也并不打算和Oracle或者PostgreSQL競爭.
僅憑經(jīng)驗來說SQLite適用于以下場合: 當(dāng)你更看中簡單的管理、使用和維護數(shù)據(jù)庫, 而不是那些企業(yè)級數(shù)據(jù)庫提供的不計其數(shù)的復(fù)雜功能的時候,使用SQLite是一個比較明智的選擇. 事實也證明, 人們在許多情況下已經(jīng)清楚的認(rèn)識到簡單就是最好的選擇.
4.1.1 SQLite最佳試用場合
· 網(wǎng)站
作為數(shù)據(jù)庫引擎SQLite適用于中小規(guī)模流量的網(wǎng)站(也就是說, 99.9%的網(wǎng)站). SQLite可以處理多少網(wǎng)站流量在于網(wǎng)站的數(shù)據(jù)庫有多大的壓力. 通常來說, 如果一個網(wǎng)站的點擊率少于100000次/天的話, SQLite是可以正常運行的. 100000次/天是一個保守的估計, 不是一個準(zhǔn)確的上限. 事實證明, 即使是10倍的上述流量的情況下SQLite依然可以正常運行.
· 嵌入式設(shè)備和應(yīng)用軟件
因為SQLite數(shù)據(jù)庫幾乎不需要管理, 因此對于那些無人值守運行或無人工技術(shù)支持的設(shè)備或服務(wù), SQLite是一個很好的選擇. SQLite能很好的適用于手機, PDA, 機頂盒, 以及其他儀器. 作為一個嵌入式數(shù)據(jù)庫它也能夠很好的應(yīng)用于客戶端程序.
· 應(yīng)用程序文件格式
SQLite作為桌面應(yīng)用程序的本地磁盤文件格式取得了巨大成功.例如金融分析工具、CAD 包、檔案管理程序等等. 一般的數(shù)據(jù)庫打開操作需要調(diào)用sqlite3_open()函數(shù),并且標(biāo)記一個顯式本地事務(wù)的起始點(BEGIN TRANSACTION)來保證以獨占的方式得到文件的內(nèi)容. 文件保存將執(zhí)行一個提交(COMMIT)同時標(biāo)記另一個顯式本地事務(wù)起始點. 這種事務(wù)處理的作用就是保證對于應(yīng)用程序數(shù)據(jù)文件的更新是原子的、持久的、獨立的和一致的.
數(shù)據(jù)庫里可以加入一些臨時的觸發(fā)器,用來把所有的改變記錄在一張臨時的取消/重做日志表中. 當(dāng)用戶按下取消/重做按鈕的時候這些改變將可以被回滾. 應(yīng)用這項技術(shù)實現(xiàn)一個無限級的取消/重做功能只需要編寫很少的代碼.
· 替代某些特別的文件格式
許多程序使用fopen(), fread(), 或 fwrite()函數(shù)創(chuàng)建和管理一些自定義的文件用來保存數(shù)據(jù). 使用SQLite替代這些自定義的文件格式將是一種很好的選擇.
· 內(nèi)部的或臨時的數(shù)據(jù)庫
對于那些有大量的數(shù)據(jù)需要用不同的方式篩選分類的程序, 相對于編寫同樣功能的代碼, 如果你把數(shù)據(jù)讀入一個內(nèi)存中的SQLite數(shù)據(jù)庫, 然后使用連接查詢和ORDER BY子句按一定的順序和排列提取需要的數(shù)據(jù), 通常會更簡單和快速. 按照上述的方法使用內(nèi)嵌的SQLite數(shù)據(jù)庫將會使程序更富有靈活性, 因為添加新的列或索引不用重寫任何查詢語句.
· 命令行數(shù)據(jù)集分析工具
有經(jīng)驗的SQL用戶可以使用SQLite命令行程序去分析各種混雜的數(shù)據(jù)集. 原是數(shù)據(jù)可以從CSV(逗號分隔值文件)文件中導(dǎo)入, 然后被切分產(chǎn)生無數(shù)的綜合數(shù)據(jù)報告. 可能得用法包括網(wǎng)站日志分析, 運動統(tǒng)計分析, 編輯規(guī)劃標(biāo)準(zhǔn), 分析試驗結(jié)果.
當(dāng)然你也可以用企業(yè)級的客戶端/服務(wù)器數(shù)據(jù)庫來做同樣的事情. 在這種情況下使用SQLite的好處是: SQLite的部署更為簡單并且結(jié)果數(shù)據(jù)庫是一個單獨的文件, 你可以把它存儲在軟盤或者優(yōu)盤或者直接通過email發(fā)給同事.
· 在Demo或測試版的時候作為企業(yè)級數(shù)據(jù)庫的替代品
如果你正在編寫一個使用企業(yè)級數(shù)據(jù)庫引擎的客戶端程序, 使用一個允許你連接不同SQL數(shù)據(jù)庫引擎的通用型數(shù)據(jù)庫后臺將是很有意義的. 其更大的意義在于將SQLite數(shù)據(jù)庫引擎靜態(tài)的連接到客戶端程序當(dāng)中,從而內(nèi)嵌SQLite作為混合的數(shù)據(jù)庫支持. 這樣客戶端程序就可以使用SQLite數(shù)據(jù)庫文件做獨立的測試或者驗證.
· 數(shù)據(jù)庫教學(xué)
因為SQLite的安裝和使用非常的簡單(安裝過程幾乎忽略不計, 只需要拷貝SQLite源代碼或sqlite.exe可執(zhí)行文件到目標(biāo)主機, 然后直接運行就可以) 所以它非常適合用來講解SQL語句. 同學(xué)們可以非常簡單的創(chuàng)建他們喜歡的數(shù)據(jù)庫, 然后通過電子郵件發(fā)給老師批注或打分. 對于那些感興趣怎樣實現(xiàn)一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)的高層次的學(xué)生, 按照模塊化設(shè)計且擁有很好的注釋和文檔的SQLite源代碼, 將為他們打下良好的基礎(chǔ). 這并不是說SQLite就是如何實現(xiàn)其他數(shù)據(jù)庫引擎的精確模型, 但是很適合學(xué)生們了解SQLite是如何快速工作的, 從而掌握其他數(shù)據(jù)庫系統(tǒng)的設(shè)計實現(xiàn)原則.
· 試驗SQL語言的擴展
SQLite簡單且模塊化的設(shè)計使得它可以成為一個用來測試數(shù)據(jù)庫語言特性或新想法的優(yōu)秀的原型平臺.