上次針對SQLite進行了掃盲,之后有同學(xué)在評論里問俺:如何在項目中使用它?今天咱來聊一下這個話題。
★如何權(quán)衡?
當(dāng)你在權(quán)衡某個場合是否應(yīng)該使用SQLite時,(在技術(shù)層面)至少要考慮如下幾點:
◇能否發(fā)揮SQLite的某些特長?
◇是否還有其它的替代方案?
◇是否有啥潛在的技術(shù)風(fēng)險?
想清楚上述問題之后,再做出決策。
★SQLite的特點
關(guān)于SQLite的特長,在上次的帖子中已經(jīng)介紹過了??紤]到某些同學(xué)比較健忘,咱再回顧一下:
◇文件型數(shù)據(jù)庫,且只有單一數(shù)據(jù)文件
◇輕量級
◇綠色(不依賴其它軟件庫)
◇跨平臺(包括引擎和數(shù)據(jù)文件)
◇支持內(nèi)存數(shù)據(jù)庫
◇支持較大的數(shù)據(jù)文件(TB級別)
★可能的替代方案
剛才說了,權(quán)衡SQLite的使用需要考慮其它的替代方案,所以俺簡單介紹一下和SQLite用途相近的其它幾種技術(shù)手段。后面講應(yīng)用場景的時候,會結(jié)合這幾個替代方案來作對比。
◇Access數(shù)據(jù)庫
Access數(shù)據(jù)庫也是文件型的數(shù)據(jù)庫,支持的很多SQL特性都類似于SQLite。自從Windows 2000開始,Windows就內(nèi)置了Access的數(shù)據(jù)庫引擎(Microsoft Jet Database Engine)。所以Access數(shù)據(jù)庫在上述系統(tǒng)中也是可以獨立運行的(不依賴Office)。
Access數(shù)據(jù)庫最主要的缺點就是不能跨平臺。另外還有幾個小缺點:文件大小有限制(2GB)、不支持內(nèi)存數(shù)據(jù)庫。
◇其它文件型數(shù)據(jù)庫
其實,除了Access之外,還有另外一些文件型數(shù)據(jù)庫。但是這些文件型數(shù)據(jù)庫要么名氣太小,要么不支持多種編程語言(比如HSQLDB),要么已經(jīng)過時(比如FoxPro、Paradox)。所以后面分析應(yīng)用場景的時候就不再提及這些玩意兒。
◇CSV文件
CSV(Comma Separated Values,詳細解釋見“這里”)是一種很簡單的純文本格式。它本身就是用來表示二維的數(shù)據(jù)信息的。一個CSV文件可以理解為數(shù)據(jù)庫的一張表。
CSV的缺點主要在于:不便于存儲非文本的數(shù)據(jù)信息(比如BLOB類型的信息);如果需要同時存儲多張表的信息,就需要對應(yīng)有多個CSV文件(文件一多,就嫌麻煩)。
◇XML文件
XML文件想必大伙兒都知道,我就不多說了。XML格式主要缺點也有兩個:一個是由于XML本身是樹狀結(jié)構(gòu),有時候不便于表示二維數(shù)據(jù)表的信息;另一個是數(shù)據(jù)量大(比如文件超過10MB或者XML節(jié)點層次很深)的時候,解析XML的開銷蠻大的。
★作為數(shù)據(jù)庫的應(yīng)用場景
前面說了一大通,現(xiàn)在開始切入正題,先說說SQLite作為一個輕型數(shù)據(jù)庫,方便干哪些事兒?
在這類場景中,由于是把SQLite作為數(shù)據(jù)庫來使的,所以基本不用考慮CSV和XML這兩種替代方案。
◇需要數(shù)據(jù)庫的小型桌面軟件
如果你開發(fā)一個小型的桌面軟件并且需要用到數(shù)據(jù)庫功能(比如某個背單詞軟件),那SQLite是一個不錯的選擇。因為SQLite很綠色又很短小精悍。
不過,由于Windows在桌面系統(tǒng)的比重很大。對于那些不考慮跨平臺的開發(fā)人員,SQLite相對于Access來說,沒有太大的優(yōu)勢。
◇需要數(shù)據(jù)庫的手機軟件
眼下手機應(yīng)用的發(fā)展很迅猛,相應(yīng)的開發(fā)人員也多起來了。假如你就是一個手機應(yīng)用程序的開發(fā)人員,并且你開發(fā)的應(yīng)用需要有數(shù)據(jù)庫功能(比如某個字典工具),那SQLite簡直是不二之選。由于手機操作系統(tǒng)名目繁多,同時手機的內(nèi)存偏小,這時候SQLite跨平臺和輕量級的特長就充分發(fā)揮出來了。目前幾個知名的手機操作系統(tǒng)(比如Android、Windows Mobile、Symbin、Palm等),SQLite都支持得不錯。
在這種場合,Access基本沒戲。
★作為數(shù)據(jù)容器的應(yīng)用場景
所謂數(shù)據(jù)容器,就是把SQLite作為裝數(shù)據(jù)的容器,充分發(fā)揮SQLite單一數(shù)據(jù)文件的優(yōu)點。另外,還可以避免自己定義一套數(shù)據(jù)文件格式的麻煩。要知道,定義一個完善的數(shù)據(jù)文件格式是難度極大滴(要考慮可擴展性、要考慮向下兼容、假如跨CPU架構(gòu)還要考慮字節(jié)序、假如數(shù)據(jù)量大還要考慮性能、還要...)。
◇數(shù)據(jù)備份/恢復(fù)、數(shù)據(jù)導(dǎo)入/導(dǎo)出
某些軟件系統(tǒng)(尤其是些企業(yè)應(yīng)用系統(tǒng))經(jīng)常會碰到數(shù)據(jù)備份/恢復(fù)的功能需求。比如說,客戶會要求你把一些數(shù)據(jù)(往往是業(yè)務(wù)相關(guān)的)定期備份成一個獨立的數(shù)據(jù)文件,然后存儲在別處。一旦軟件系統(tǒng)自身發(fā)生不測,再把備份的數(shù)據(jù)恢復(fù)回來。
另外,導(dǎo)入/導(dǎo)出功能也是經(jīng)常碰到的。一般是某個軟件安裝在多個地方。然后需要把一些數(shù)據(jù)(往往是業(yè)務(wù)相關(guān)的)從A處導(dǎo)出,然后在B處導(dǎo)入。
針對上述這兩種需求:如果牽涉的數(shù)據(jù)比較大,就不宜使用XML或者Access;如果牽涉到跨平臺,就無法使用Access;如果牽涉到多種數(shù)據(jù),就不宜使用CSV(除非你能忍受多個CSV文件并存)。有上述條件限制的地方,都很適合用SQLite。
◇在線升級
這年頭不聯(lián)網(wǎng)的單機已經(jīng)很少了,提供在線升級功能的軟件會多起來。一般的在線升級分為兩類:升級程序(比如Firefox自動升級新版本)和升級業(yè)務(wù)數(shù)據(jù)(比如殺毒軟件升級病毒庫)。這兩種類型都可以使用SQLite來完成。把需要要升級的內(nèi)容放置到SQLite數(shù)據(jù)庫文件中,將來升級時只需下載單一的升級文件即可。
在這種場景,不太合適用CSV和XML。如果不考慮跨平臺,倒也可以用Access來搞定。
★作為內(nèi)存數(shù)據(jù)庫的應(yīng)用場景
在這種類型的場景中,咱們要充分發(fā)揮SQLite內(nèi)存數(shù)據(jù)庫的特長。由于SQLite的API設(shè)計比較合理,操作內(nèi)存數(shù)據(jù)庫和操作文件數(shù)據(jù)庫幾乎沒啥區(qū)別,所以從文件型切換到內(nèi)存型,代碼不用大改。另外,從3.6.11開始,SQLite增加了online backup接口,便于在內(nèi)存數(shù)據(jù)庫和文件數(shù)據(jù)庫之間進行數(shù)據(jù)的同步。
◇降低磁盤I/O開銷
比如開發(fā)了某個字典工具,詞庫存儲在SQLite數(shù)據(jù)庫文件中。當(dāng)詞庫越來越大的時候,你可能會發(fā)現(xiàn),查詞的速度越來越慢。當(dāng)然啦,速度慢未必是磁盤I/O引起的。這時候你可以把程序略微修改一下(可能就10行左右的代碼),在初始化時把詞庫載入內(nèi)存的SQLite數(shù)據(jù)庫中。然后再對比測試一下性能。如果發(fā)現(xiàn)性能有明顯提升,那你以后就可以一直用這種方式了。
使用這個招數(shù),要小心內(nèi)存數(shù)據(jù)庫對內(nèi)存空間的占用。比如對于普通的PC,占用個幾兆、十幾兆還行,再大的話就不爽了。另外,對于手機操作系統(tǒng),此招數(shù)效果不好(手機本身的內(nèi)存就不是很大,而且存儲介質(zhì)的速度已經(jīng)蠻快了)。
◇作為臨時表
內(nèi)存數(shù)據(jù)庫方式,還可以用來充當(dāng)臨時表,存放一些臨時數(shù)據(jù)。當(dāng)程序的進程退出時,內(nèi)存數(shù)據(jù)庫就自然消失了,不會留下任何垃圾。
不過這種方式只適合于某個程序獨占臨時表的情形。如果臨時表需要被多個進程共用,這招就不靈了。