你曾經夢想擁有一個不需要用SQL語句就可以輕鬆訪問的強大資料庫嗎?Apache CouchDB就是這樣的資料庫。在這個教程中,你將會學到看到如何開始使用這基於文件的資料庫,以及如何用PHP使用它。
認識CouchDB
Apache CouchDB是一種新型的資料庫管理系統,這種系統通常叫作NoSQL。NoSQL是在2009年初就浮現出並開始流行起來的,即是non-SQL的資料庫。NoSQL是一種非關係型資料儲存系統,這打破了長期以來以關係型資料庫和ACID特性主導的資料庫世界。這種系統的資料儲存不需要固定的表。
讓我立即喜歡上CouchDB並決定寫這篇文章的原因是由於它是基於文件的資料庫,而不是將內容儲存在表中。這就方便我們自由儲存資訊,如同儲存在陣列中一樣
這裡有個示例文件:
1 |
FirstName="Bob", Address="5 Oak St.", Hobby="sailing". |
另一個文件可以有這樣的資料:
1 |
FirstName="Jonathan", Address="15 Wanamassa Point Road", Children=("Michael,10", "Jennifer,8", "Samantha,5", "Elena,2"). |
很酷吧。首先我們不會用空間來儲存空的或null的列。
其次我們不再需要考慮表和列了!我們要設定資訊時,僅需要設定我們需要的資訊。但是如果我們沒有仔細計劃時,這也可能會引發問題。我們以後會詳細介紹。
我喜歡CouchDB的另一個原因是因為訪問它是通過REST API。對於那些知道REST API是什麼的人來說,它可以做許多事情!而對於那些對它沒有認知的人來說,就是可以通過JavaScript直接從瀏覽器獲得或設定資料,而不需要在伺服器端寫PHP程式碼。
使用CouchDB
現在你知道了它的基本特性,我們開始使用它吧。首先你需要知道PHP沒有內建的函式去訪問CouchDB資料庫。
訪問CouchDB我推薦PHPillow,由Kore Nodmann寫的一個類庫,是我目前為止看到的寫的最好的類。其次你需要知道設定和訪問CouchDB和MySQL語句不同。我說過,PHPillow是訪問CouchDB的最好的方法(我的觀點),所以我將在例子中採用它。
資料連線
連線CouchDB例項,phpillowConnection類方便簡單:
phpillowConnection->createInstance(‘localhost’, 5984, ‘user’, ‘password’);
連線建立之後,你的文件中可以使用這個連線。
自定義文件
所有的文件都是對一個基本抽象類phpillowDocument的擴充套件。定義部落格文章的完整模型如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class myBlogDocument extends phpillowDocument { protected static $type = 'blog_entry'; protected $requiredProperties = array( 'title', 'text', ); public function __construct() { $this->properties = array( 'title' => new phpillowStringValidator(), 'text' => new phpillowTextValidator(), 'comments' => new phpillowDocumentArrayValidator( 'myBlogComments' ), ); parent::__construct(); } protected function generateId() { return $this->stringToId( $this->storage->title ); } protected function getType() { return self::$type; } } |
靜態屬性$type定義了儲存文件的型別,對每個文件來說是唯一的。如果你想實現一個模組,在type前加上一個字首,譬如這個例子中的“blog”。如果你使用的是5.3版本之前的PHP,你需要在文件類中返回文件型別,如上所示。5.3以及5.3版本之上的使用者可以使用更普遍的做法,在基文件類中用static::$type來返回文件型別。
$requiredProperties定義了必須要設定的屬性。而屬性是在$properties中設定,它是在構造器當中初始化的。我們對每個屬性都採用了一個驗證器來校驗輸入。有很多更復雜的驗證器,如上面例子中的phpillowDocumentArrayValidator,稍後會提到,它的詳細描述在API文件中可以找到。
最後你需要定義生成文件ID的方法。CouchDB可以通過ID來完成一些任務,這裡通過stringToId()實現。通常你至少有一個唯一的屬性。如果不是唯一值的話,文件處理器將會附加上些資訊,這樣又唯一了。
使用文件
現在要儲存資料在上面程式碼新建的文件中,可以使用下面的程式碼:
1 2 3 4 |
$doc = new myBlogDocument(); $doc->title = 'New blog post'; $doc->text = 'Hello world.'; $doc->save(); |
save()函式會將文件儲存在資料庫中。呼叫這個函式之後,你可以獲得一個神奇的屬性:
1 |
$doc->_id; |
直接使用這個ID,你可以又從資料庫中調出這個文件:
1 2 |
$doc = new myBlogDocument(); $doc->fetchById('blog_entry-new_blog_post'); |
這個方法從資料庫中又調出上面的文件。CouchDB中的文件有幾個神奇的屬性:_id和_rev(為修改文件所用)。除了定義的屬性之外,還有個叫revisions的屬性,它儲存了該文件所有更改過的內容。
1 |
echo $doc->revisions[0]['title']; |
如果你更改了一個物件的某個屬性,並儲存起來,舊的版本也會儲存在資料庫中,所以沒有資訊丟失。這個自動儲存舊版本的功能可以取消,將$versioned屬性設定為false。
我提到修改嗎?
是的,我提到了!感謝你注意到了!最後說一次,如果更改了CouchDB資料庫中的文件,它自動將其儲存到前一個的版本!不再需要再進行多次資料庫操作,要確保應用事務可以回滾。
這個教程就到這裡了。下次我們將會用PHPillow來處理更多更高階的查詢。
原文:Jean-Baptiste Jung 編譯:伯樂線上 – 唐小娟
【如需轉載,請標註並保留原文連結、譯文連結和譯者等資訊,謝謝合作!】