【第167期 August 5, 2011】
 

研發新視界

以Google Docs Spreadsheet做為資料庫應用程式開發之實作

作者/許至輝

[發表日期:2011/8/1]


概述

隨著網路技術的不斷進步和創新,我們現在享有著穩定又便宜的網際網路服務。Google的崛起,更代表著網際網路時代的來臨。網際網路提供了許多實用的線上服務,更重要的是這大部分的服務還是免費的;這樣的環境下,更加速促進了資訊領域的商機發展。在建構這些網路服務的背後,需要的是高折耗的硬體設備,而且若要專業型的主機,更是價格不霏。雖然硬體技術也在日益創新,但仍然跟不上軟體的需求,至少在目前為止絕對還跟不上軟體應用所滿足的程度。因此對於資訊業來說,除了開發軟體的研發經費外,硬體設備的更新和維護經費也是一筆不容小覷的經常開銷。而資訊業將重點放在軟體的分析,開發和測試本來就是不得省略的費用,因此如何利用固定的資金,在軟硬體的分配上做最有效的利用將是影響競爭力的關鍵因素。

在所有資訊公司陸續追隨雲端運算的風潮時,Google早已經建構好雲端技術的平台(如下圖一),並釋出許多免費的線上服務,或是只需要少許費用的企業級服務。例如Google應用服務,Google Docs,Google App Engine,Ajax API 等等……,若能好好利用這些資源將可以為企業省下龐大的硬體經費。也因為免費的關係,也可以建立出自己專用的,以Google為後端主機的應用程式。本文將介紹如何以Google線上文件做為後端資料庫(不等於關聯式資料庫),並透過本機端應用程式來查詢或編輯這些資料。



介紹

Google自從推出了Google Docs,相信有許多人,許多公司因此受惠。因為我們多了一種更好的選擇。Google Docs打破了空間的限制,讓文件不用再侷限於單一電腦,而可以直接透過網路將其和別人共享,共同編輯。

Google Docs包括下列文件類型: Document(類似Word), Presentation(類似Power Point), Spreadsheet(類似Excel), Form, Drawing(類似Visual) 等等……。這些都是我們一般學業上或工作上會用到的工具,如今都可以直接在線上編輯,更重要的是可以多人同時編輯一個文件,你修改什麼,在遠端的同事就可以同時看到。或是今天報告在公司打到一半,回到家若要繼續修改只需要連上線就可以再繼續工作(當然這樣做是不應該的!公司的事公司完成才是對的。),不再需要隨身攜帶一個隨身碟,還要擔心弄丟或是中毒的危險。

要使用Google Docs,只需要有Google的帳號即可。進入之後,在Create new按鈕處新增自己需要的文件,之後右上角可以設定相關分享權限。其他基本用法其實跟Office都差不多,相信大家不用一下子就可以上手了。這次,我將實做一個應用程式,並以Google Docs的Spreadsheet文件做為資料來源,就像一個資料庫存放在遠端伺服器。


《圖二》



《圖三》


實做

應用程式功能說明

由於目前的專案中,都是使用Google Docs做為版控的申請和匯整,為了方便版控人員整理大量且繁雜過版資料,所開發的版控文件查詢程式。按下Connect按鈕之後,便可開始對Google線上文件做過版文件的查詢。

應用程式介面

登錄之後,我們便可以看到現在有哪些過版文件在線上。




《圖四》


Step-By-Step

Google提供了一系列的API供我們開發自己的應用程式時,可以更方便的使用Google的服務。除了JAVA、PYTHON、PHP,Google也提供了.NET的介面。這次我們即將實做的功能,就是以Google文件的Spreadsheet做為後端資料庫的應用程式。

首先,我們必須先到此網址http://code.google.com/p/google-gdata/downloads/list下載Google提供的API。


《圖五》


把最新版的API下載之後還需要進行安裝程序。(Google_Data_API_Setup_1.8.0.0.msi)


《圖六》


安裝好之後,我們在以下路徑就可以得到我們所需要的DLL了。


《圖七》


接下來開始進行程式的開發流程。使用的開發工具是Visual Studio 2010。

我將利用Google的線上文件作為儲存資料的地方,也就是類似資料庫的角色;並透過本機端的應用程式來存取線上文件的資料。

先建立好所需要的資料,Spreadsheet名為過版清單範例。而我們過版清單查詢應用程式的資料來源就是這個線上Spreadsheet文件。


《圖八》


即可,並在程式Imports進來。因為這次所要實做的例子只有用到Spreadsheet文件,所以只需要加入以下DLL


《圖九》


《圖十》


第一步,先執行身分認證。GData提供了非常簡單的驗證function,短短兩行就解決摟!其中的IDTb.Text和PWTb.Text是由UI輸入的。


《圖十一》


身分驗證成功後,我們便一層一層地往資料邁進。基本上Google文件Spreadsheet的資料結構如下(對應上圖):


《圖十二》


以Spreadsheet為單位的資料擷取,一樣簡單的兩個步驟就可以做到了。先建立型別為SpreadsheetQuery的物件query,再用此物件做Query得到型別SpreadsheetFeed的物件feed。物件feed為型別SpreadsheetEntry的Collection,而feed.Entries便是我們Google Docs的所有Spreadsheet文件。透過For Loop就可以逐筆得到所有的Spreadsheet文件了。


《圖十三》


一個Spreadsheet可以包含多個Worksheets。對於每個Worksheet,有一個Worksheet Metafeed列出所有Spreadsheet中的Worksheet。以下說明如何向下擷取各層(Level2, Level3)的資料。

類似上面的做法,但在支前需要多建立一個AtomLink的物件。範例如下:


《圖十四》


取得Worksheet後,再取得每一資料列(List)的資料或每一格(Cell)的資料。如下面程式範例。同樣需要透過AtomLink-->ListQuery-->ListFeed取得每一列,每一列的資料是存成ListEntry.CustomElementCollection的型別, 而ListEntry.CustomElementCollection則是ListEntry.Custom型別物件的集合。此ListEntry.Custom就是每個Cell的物件。


《圖十五》


以上步驟,就是截取Google Spreadsheet資料最基礎也最核心的步驟。
但是要作為存取資料的核心,當然少不了提供應用程式做查詢的功能。GData API提供了許多種對Spreadsheet做查詢的方式,在此我將舉兩種查詢的例子:

一、List-feed:

以資料列為單位,可以資料行名稱(Column name)做多種運算式的查詢,包含=、<>、AND、OR等實用的運算子。下表為其基本說明。


《圖十六》


二、Cell-feed: 以資料格為單位做查詢


《圖十七》


以List為單位,可以針對資料行名稱作查詢。我們只需要將Query字串設定在ListQuery物件的SpreadsheetQuery屬性即可。

語法: [columnName][binaryOperator][value],ex: name = test

實作範例如下:


《圖十八》


以上程式就可以抓出此Worksheet,申請人欄位是海公公的List(資料列)。

除了上面解說的基本資料擷取功能外,Google Data API還提供了上傳、下載、刪除、編輯的功能。

Demo

登錄之後,我們便可以看到現在有哪些過版文件在線上。


《圖十九》


或者可以直接選擇現在要查哪個SD的過版,比如說我們想要查所有海公公題教過的程式。


《圖二十》


《圖二十一》


這次實做的應用雖然只是單純的版控文件查詢表,但只要再加強查詢的多樣化以及可以編輯修改的功能,便可以讓版控技術人員工作的更有效率。

結論

相信Google Docs的方便性和使用性已經獲得了眾人的肯定與支持,從本專案使用情形看來,就是個很成功的例子。它使版控和SD們擺脫了以往被一大堆Mail轟炸的窘境,再加上mail的廢話和附件時間,真的是相當浪費版控人員的工作時間,如今使用Google文件運作得相當不錯,流程順暢又節省時間。另外以Google Docs Spreadsheet做為資料庫雖然是個不錯的點子,但是和一般的關聯式資料庫比起來,絕對是相當不夠用的。資料庫最重要的正規化條件,Google Docs Spreadsheet都沒有辦法達到,連設定索引都沒辦法,光是這些原因就讓這個點子只能局限於小應用而已。雖說它的目的本來就不在於此,但若是能加上索引功能和Primary Key設定的功能,甚至再補強查詢語法的多樣化,絕對是讓其競爭力大大的提升。希望Google的技術專家能夠聽見這個需求。

參考資料

1.http://google-gdata.googlecode.com/svn-history/r887/docs/folder40/N_Google_GData_Spreadsheets.htm
2.http://code.google.com/intl/zh-TW/apis/spreadsheets/data/2.0/developers_guide_dotnet.html#CellFeeds
3.http://code.google.com/intl/zh-TW/apis/documents/docs/2.0/developers_guide_dotnet.html
4.http://docs.google.com/support/bin/answer.py?hl=en&answer=159999
5.http://code.google.com/intl/zh-TW/apis/spreadsheets/data/2.0/reference.html#ListParameters
6.http://code.google.com/intl/zh-TW/googleapps/