開放源碼嵌入式數據庫 SQLite 簡介

轉載自: http://www.ibm.com/developerworks/cn/opensource/os-sqlite/

 

SQLite 是 D. Richard Hipp 用 C 語言編寫的開源嵌入式數據庫引擎。它是完全獨立的,不具有外部依賴性。它是作爲 PHP V4.3 中的一個選項引入的,構建在 PHP V5 中。SQLite 支持多數 SQL92 標準,可以在所有主要的操作系統上運行,並且支持大多數計算機語言。SQLite 還非常健壯。其創建者保守地估計 SQLite 可以處理每天負擔多達 100,00 次點擊率的 Web 站點,並且 SQLite 有時候可以處理 10 倍於上述數字的負載。

功能

SQLite 對 SQL92 標準的支持包括索引、限制、觸發和查看。SQLite 不支持外鍵限制,但支持原子的、一致的、獨立和持久 (ACID) 的事務(後面會提供有關 ACID 的更多信息)。

爲什麼要進行嵌入?

嵌入式數據庫的名稱來自其獨特的運行模式。這種數據庫嵌入到了應用程序進程中,消除了與客戶機服務器配置相關的開銷。嵌入式數據庫實際上是輕量級的,在運行時,它們需要較少的內存。它們是使用精簡代碼編寫的,對於嵌入式設備,其速度更快,效果更理想。嵌入式運行模式允許嵌入式數據庫通過 SQL 來輕鬆管理應用程序數據,而不依靠原始的文本文件。嵌入式數據庫還提供零配置運行模式,這樣可以啓用其中一個並運行一個快照。

要知道,SQLite 的數據庫權限只依賴於文件系統,沒有用戶帳戶的概念。SQLite 有數據庫級鎖定,沒有網絡服務器,並且可以實現多數 SQL92 標準(但不是全部)。SQL92 標準的其他一些主要功能是外鍵和檢查限制。瞭解哪些SQL92 功能未實現。

這意味着事務是原子的,因爲它們要麼完全執行,要麼根本不執行。事務也是一致的,因爲在不一致的狀態中,該數據庫從未被保留。事務還是獨立的,所以,如果在同一時間在同一數據庫上有兩個執行操作的事務,那麼這兩個事務是互不干擾的。而且事務是持久性的,所以,該數據庫能夠在崩潰和斷電時倖免於難,不會丟失數據或損壞。

SQLite 通過數據庫級上的獨佔性和共享鎖定來實現獨立事務處理。這意味着當多個進程和線程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程向數據庫執行寫入操作之前,必須獲得獨佔鎖定。在發出獨佔鎖定後,其他的讀或寫操作將不會再發生。

SQLite 網站上記錄了完整的 SQLite locking semantics

內部結構

在內部,SQLite 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQLite 通過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展 SQLite 的內核變得更加方便。所有 SQL 語句都被編譯成易讀的、可以在 SQLite 虛擬機中執行的程序集。


圖 1. SQLite 的內部結構
SQLite 的內部結構

SQLite 支持大小高達 2 TB 的數據庫,每個數據庫完全存儲在單個磁盤文件中。這些磁盤文件可以在不同字節順序的計算機之間移動。這些數據以 B+樹(B+tree)數據結構的形式存儲在磁盤上。SQLite 根據該文件系統獲得其數據庫權限。

數據類型

SQLite 不支持靜態數據類型,而是使用列關係。這意味着它的數據類型不具有表列屬性,而具有數據本身的屬性。當某個值插入數據庫時,SQLite 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成列類型。如果不能轉換,則該值將作爲其本身具有的類型存儲。

SQLite 支持 NULLINTEGERREALTEXTBLOB 數據類型。

管理 SQLite

SQLite 附帶一個可下載的 command-line interface for database administration。通過數據庫名稱可以調用此命令行程序,並且可以按照下面的方式創建新的數據庫和表:


清單 1. 創建新的數據庫和表

C:\minblogg>sqlite3 c:\minblogg\www\db\alf.db
SQLite version 3.2.1
Enter ".help" for instructions
sqlite> create table mytable(name varchar(40), age smallint);
sqlite> insert into mytable values('Nils-Erik',23);
sqlite> select * from mytable;
Nils-Erik|23
sqlite>

然後,可以再次打開該數據庫,列出它的表和架構,並繼續進行插入和刪除值的操作。


清單 2. 列出表和架構

 
C:\minblogg>sqlite3 c:\minblogg\www\db\alf.db
SQLite version 3.2.1
Enter ".help" for instructions
sqlite> .tables
mytable
sqlite> select * from mytable;
Nils-Erik|23
sqlite> .schema
CREATE TABLE mytable(name varchar(40), age smallint);
sqlite>

SQLite 還附帶命令行數據庫分析器,該分析器允許您顯示關於任何 SQLite 數據庫當前狀態的詳細信息。


清單 3. SQLite 分析器

 
C:\minblogg>sqlite3_analyzer www\db\alf.db
Analyzing table mytable...
Analyzing table sqlite_master...
/** Disk-Space Utilization Report For www\db\alf.db
*** As of 2005-Apr-24 18:56:40
Page size in bytes.................... 1024
Pages in the whole file (measured).... 2
Pages in the whole file (calculated).. 2
Pages that store data................. 2          100.0%
Pages on the freelist (per header).... 0            0.0%
Pages on the freelist (calculated).... 0            0.0%
Pages of auto-vacuum overhead......... 0            0.0%
Number of tables in the database...... 2
Number of indices..................... 0
Number of named indices............... 0
Automatically generated indices....... 0
Size of the file in bytes............. 2048
Bytes of user payload stored.......... 13           0.63%
*** Page counts for all tables with their indices ********************
MYTABLE............................... 1           50.0%
SQLITE_MASTER......................... 1           50.0%
*** All tables *******************************************************
Percentage of total database.......... 100.0%
Number of entries..................... 2
Bytes of storage consumed............. 2048
Bytes of payload...................... 91           4.4%
Average payload per entry............. 45.50
Average unused bytes per entry........ 916.50
Maximum payload per entry............. 78
Entries that use overflow............. 0            0.0%
Primary pages used.................... 2
Overflow pages used................... 0
Total pages used...................... 2
Unused bytes on primary pages......... 1833        89.5%
Unused bytes on overflow pages........ 0
Unused bytes on all pages............. 1833        89.5%
*** Table MYTABLE ****************************************************
Percentage of total database..........  50.0%
Number of entries..................... 1
Bytes of storage consumed............. 1024
Bytes of payload...................... 13           1.3%
Average payload per entry............. 13.00
Average unused bytes per entry........ 999.00
Maximum payload per entry............. 13
Entries that use overflow............. 0            0.0%
Primary pages used.................... 1
Overflow pages used................... 0
Total pages used...................... 1
Unused bytes on primary pages......... 999         97.6%
Unused bytes on overflow pages........ 0
Unused bytes on all pages............. 999         97.6%

由於完全能夠使用命令行界面來管理數據庫,因此它可以爲數據庫管理員帶來很大的方便。目前有許多優秀的基於 Web 的 SQLite 數據庫管理系統。其中有一個是基於 PHP 的SQLiteManager


圖 2. 使用 SQLiteManager 管理數據庫
SQLiteManager

備份

備份 SQLite 數據庫有兩種方法。如果數據庫正在使用中,則應從命令行界面使用 .dump 命令。這樣可以創建一個包含必要命令和數據的文件,從而重新創建數據庫。.dump 命令也可以用於備份數據庫表。


清單 4. .dump 命令

 
sqlite> .dump
BEGIN TRANSACTION;
CREATE TABLE mytable(name varchar(40), age smallint);
INSERT INTO "mytable" VALUES('Nils-Erik', 23);
COMMIT;
sqlite>

如果數據庫沒有處於使用狀態,則可以直接將數據庫文件複製到安全位置。

在 PHP V5 中使用 SQLite

一個好的做法是將 SQLite 數據庫與 PHP 代碼分開。完成此操作的一個簡便方法是創建一個 www 目錄。在此目錄中,創建一個用於存放 SQLite 數據庫的db 目錄、一個用於存放數據庫和表創建腳本的dbscripts 目錄和一個用於存放數據庫備份的backups 目錄。


清單 5. 使用 PHP V5 組織 SQLite 數據庫

 

2004-12-06  15:43    DIR          .
2004-12-06  15:43    DIR          ..
2005-04-23  19:55    DIR          db
2005-01-02  11:46    DIR          dbscripts
2005-01-02  11:46    DIR          backups

在 PHP V5 中創建 SQLite 數據庫與在命令行界面中創建該數據庫非常相似。如果該數據庫不存在,則創建一個空數據庫。

$db = sqlite_open('../db/ac.db');

創建一個表也非常容易:


清單 6. 創建表

$db = sqlite_open('../db/ac.db');
sqlite_query($db, 'DROP TABLE post');
sqlite_query($db, 'CREATE TABLE post (id INTEGER PRIMARY KEY, 
   kategori VARCHAR(20) NOT NULL, 
titel VARCHAR(75) NOT NULL, referens VARCHAR(75), status VARCHAR(20) not null, 
date varchar(10)not null, synopsis VARCHAR(120), inlaegg varchar(8192))');

插入一條記錄:

$sqldb = sqlite_open("../db/ac.db");
sqlite_query($sqldb, "INSERT INTO isvs VALUES ('$isvurl' , '$isvname', '$comment')");

並選擇數據:


清單 7. 從 SQLite 數據庫中選擇數據

$sqldb = sqlite_open("www/db/ac.db");
$results = sqlite_query($sqldb, "SELECT * FROM isvs order by isvurl asc ");
   
while (list($isvurl, $isvname) = sqlite_fetch_array($results)) {
  sqlite_close($sqldb);

使用 SQLite 和數據庫抽象層

兩個先進的開源數據庫抽象層對 SQLite 提供支持:PEAR::DB,它們包含在 PHP V5 中,並且被認爲是更輕量級的 ezSQL。通過預先使用 PHP 擴展和應用程序庫 (PEAR) 或 ezSQL,可將 SQLite 用於應用程序的快速復原,在以後需要時,可以將其無縫轉向更具工業性質的數據庫。


清單 8. 使用 ezSQL 和 SQLite

$users = $db->get_results("SELECT name, age FROM table1");
foreach ( $users as $user )
{
            echo $user->name;
            echo $user->age;
}

城中另一個遊戲

SQLite 不是惟一的開源嵌入式數據庫引擎。如果 SQLite 不能滿足您的要求,請使用 Derby(是 Apache 孵化器項目)和 Cloudscape(IBM 公司的 Derby 商業版本,包括 IBM 支持和服務)。Cloudscape 於 1996 年誕生於 Cloudscape 公司。三年以後,Informix 軟件公司併購了 Cloudscape,2001 年,IBM 併購了 Informix 軟件公司的數據庫資產,其中包括 Cloudscape。去年,IBM 將此代碼像 “Derby”一樣作爲孵化器項目獻給了 Apache Software Foundation。

Derby 是100 % 的 Java 編程語言關係數據庫,並提供了存儲過程和觸發器,行級鎖定,可以執行事務提交和回退操作,並支持加密。

最近,Zend 公司爲 IBM 發佈了 Zend Core,該軟件可以看作是基於 PHP V5 的解決方案,其中包括用於 Cloudscape 的 PHP 擴展和綁定的 Cloudscape 數據庫服務器。

SQLite 使用注意事項

在確定是否在應用程序中使用 SQLite 之前,應該考慮以下幾種情況:

  • 目前沒有可用於 SQLite 的網絡服務器。從應用程序運行位於其他計算機上的 SQLite 的惟一方法是從網絡共享運行。這樣會導致一些問題,像 UNIX® 和 Windows® 網絡共享都存在文件鎖定問題。還有由於與訪問網絡共享相關的延遲而帶來的性能下降問題。
  • SQLite 只提供數據庫級的鎖定。雖然有一些增加併發的技巧,但是,如果應用程序需要的是表級別或行級別的鎖定,那麼 DBMS 能夠更好地滿足您的需求。
  • 正如前面提到的,SQLite 可以支持每天大約 100,00 次點擊率的 Web 站點 —— 並且,在某些情況下,可以處理 10 倍於此的通信量。對於具有高通信量或需要支持龐大瀏覽人數的 Web 站點來說,應該考慮使用 DBMS。
  • SQLite 沒有用戶帳戶概念,而是根據文件系統確定所有數據庫的權限。這會使強制執行存儲配額髮生困難,強制執行用戶許可變得不可能。
  • SQLite 支持多數(但不是全部)的 SQL92 標準。不受支持的一些功能包括完全觸發器支持和可寫視圖。請參閱 unimplemented SQL92 features

如果您感到其中的任何限制會影響您的應用程序,那麼您應該考慮使用完善的 DBMS。如果您可以解除這些限制問題,並且對快速靈活的嵌入式開源數據庫引擎很感興趣,則應重點考慮使用 SQLite。

一些能夠真正表現 SQLite 優越性能的領域是 Web 站點,可以使用 SQLite 管理應用程序數據、快速應用程序原型製造和培訓工具。

結束語

由於資源佔用少、性能良好和零管理成本,嵌入式數據庫有了它的用武之地,它將爲那些以前無法提供用作持久數據的後端的數據庫的應用程序提供了高效的性能。現在,沒有必要使用文本文件來實現持久存儲。SQLite 之類的嵌入式數據庫的易於使用性可以加快應用程序的開發,並使得小型應用程序能夠完全支持複雜的 SQL。這一點對於對於小型設備空間的應用程序來說尤其重要。

嵌入式數據庫對於加快應用程序開發也很重要,尤其是在用於數據庫抽象層(例如 PEAR::DBezSQL)時。最後,SQLite 正在積極開發中,未來一定會有新的功能,會對開源社區更有用。


 

參考資料

  • 您可以參閱本文在 developerWorks 全球站點上的 英文原文

  • 請訪問 SQLite,以下載最新版本的 SQLite、命令行界面、文檔和最新消息。

  • 下載 SQLiteManager,使 SQLite 數據庫管理更方便。

  • PHP.net 下載包括 SQLite 的 PHP V5。

  • 請參閱 developerWorks 上的文章“ 審計 PHP,第 1 部分: 理解 register_globals”,瞭解開發人員創建 PHP 應用程序時需要牢記的一些基本問題。

  • PHP 簡介”是對 PHP 腳本語言的一個簡要介紹,並討論了 PHP 的起源、功能及其使用的平臺。

  • PHP 例解,第 1 部分”是系列文章中第一部分,它介紹了 PHP 的一些基礎知識。描述了包括作者頁和前端的 Webzine,在作者頁中,內容提供者可以輸入文章的正文,前端用於將這些內容介紹給全世界的讀者。

  • 學習 PHP,第 1 部分” 是由三個部分組成的文章列系中的第 1 部分,通過記錄文檔工作流系統的構建過程,全面介紹 PHP,從文件系統的最基本的 PHP 腳本,到使用數據庫和流。

  • 可以從 The PHP Extension and Application Repository 獲得 PEAR::DB 數據庫抽象層。

  • 請訪問 jvmultimedia,下載 ezSQL 數據庫抽象層。

  • 請購買 Chris Newman 撰寫的 SQLite 一書,該書主要介紹了開源的嵌入式數據庫。

  • 瞭解關於 Apache 孵化項目 Derby IBM Cloudscape 的更多信息。

  • 請下載包括 Cloudscape 的 combined PHP V5 binary distribution

  • 請參閱 developerWorks 的 開源專區,瞭解更多的 how-to 信息、工具和項目更新,幫助您使用開源技術進行開發,並將這些技術用於 IBM 的產品中。

  • 使用 IBM 試用軟件 改進您的下一個開源開發項目,可以通過下載或從 DVD 中獲得這些軟件。

  • 通過參與 developerWorks blogs 加入 developerWorks 社區。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章