DSpace的PostgreSQL資料庫架構與操作
前言
PostgreSQL是個專業但卻免費開放原始碼的資料,選擇他做為DSpace的資料庫是很穩定的。即使由於它過於複雜的架構讓我們沒辦法把它像MySQL這樣地簡單操作,在本文件當中我們依然要求你具備關聯式資料庫的概念,並且熟知SQL語法的操作。特別是SQL語法,這是所有資料庫的共通語言,所以一定要知道。
PostgreSQL有pdAdmin III資料庫管理介面可供使用,GUI圖形化且中文的操作介面也容易使用。但是在DSpace裡面操作資料庫的時候,除了要知道怎麼看JAVA程式來操作物件,還會使用到SQL指令。看完本文件,希望讓你對於操作PostgreSQL有個概念。
第一章 PostgreSQL簡介
PostgreSQL 是由散佈在全球的數百名開發者(包含非營利組織團體,學術研究機構及國際企業體)志願貢獻與共同開發的專案成果,歷今22年來持續發展。長久以來被用於要 求極端嚴謹的商業應用/科學研究環境及政府組織中。PostgreSQL 為 BSD 版權協議發佈,允許您在商業或非商業應用的兩種環境下均能享有自由取得且不受限制的使用權。PostgreSQL 具有高度擴展性,且完整遵從國際 ISO-SQL 規範的開發方向,是當前全球最先進的開放源始碼(OSS)的物件關聯型資料庫管理系統(ORDBMS)。更詳細的介紹可以參考PostgreSQL ::國際中文社群網誌:: http://postgresql-chinese.blogspot.com/。
PostgreSQL與其他資料庫類似,使用SQL語言來執行資料的查詢。它的特色在於資料庫的可程式性,對於使用資料庫資料的實際應用,PostgreSQL 讓開發與使用的工作,變得更加容易。
我們在建構DSpace的過程中,只需要透過DSpace的API來操控資料庫,你只需要擁有操控SQL語言的能力即可,不需要深入研究PostgreSQL的功能。由於它的架構十分複雜,我們不建議用SQL或pgAdmin手動新增、刪除或修改資料庫的任何資料或架構,請盡量使用DSpace設計好的物件(object)中的方法(method)來執行。
第二章 PostgreSQL安裝
有些Linux發行版已經內建PostgreSQL,在DSpace的建立過程中,我們使用的CentOS作業系統已經內建,因此我們不需要另外安裝。
如果你想要開放所有的對外連線來查看你的資料庫(ex. pgAdmin),則你需要編輯postgresql.conf (通常會放在/var/lib/pgsql/data或者/usr/local/pgsql/data),並且在Linux之中修改為:
vim postgresql.conf
加入tcpip_socket = true
加入listen_addresses = '*' #限定任何IP皆可連線
vim pg_hba.conf
加入host dspace dspace 127.0.0.1 0.0.0.0 md5
(注意,開放所有對外連線是不安全的,你必須明確的了解你做什麼事情。)
第三章 DSpace資料庫架構說明
透過pgAdmin III可以看到DSpace整個架構。pgAdmin III詳細的操作方法在稍後章節會提到。
以下是DSpace在安裝的過程中會自動建立的表格架構,由於PostgreSQL本身架構太過複雜,與其撰寫把完整的資料庫架構細節寫上來,不如請直接參考輸出的備份檔。在此我將各表格與各欄位的用處及注意事項寫下來,未確認的表格與欄位,註釋則是空白。灰色背景表示是表格名稱與註釋,白色背景表示是該表格底下的欄位名稱與註釋。
第四章 透過pgAdmin操作資料庫
第一節 pdAdmin簡介
pgAdmin III是一個針對PostgreSQL的通用並且具有豐富特性的開放源碼管理和開發工具,可以用在Linux、FreeBSD、Solaris、Mac OSX和Windows平臺上管理運行於任何平臺的PostgreSQL 7.3以及更高級的版本,也包括商業版本例如EnterpriseDB、Mammoth PostgreSQL、Bizgres 和 Greenplum database。詳細網址是http://www.pgadmin.org/index.php?lang=zh_CN,目前最新的版本是pgAdmin III 1.8.1版本(2008年1月23日),適用於Windows平台的pgAdmin III下載位置在http://www.pgadmin.org/download/windows.php,左方可以選擇其他的平台。
第二節 新伺服器登錄
安裝完pgAdminIII並開啟之後,首先你要做的便是將DSpace的連線資料登錄,以便之後的連線。欄位的填寫資料可以參考上圖,但要確定你的PostgreSQL是否有開啟TCP/IP連線,並且允許任何IP連線管理。
第三節 pgAdminIII操作環境簡介
PostgreSQL是有嚴謹架構的資料庫,而pdAdminIII也提供了相當完整且複雜的功能。在此我僅介紹管理DSpace時可能會使用的操作部分。
查詢資料庫中的資料表
如上圖的路徑中,可以找到DSpace所有的資料表。
查詢資料表當中的欄位
資料表可繼續往下打開,即可看到該資料表的所有欄位資料。
查詢資料表當中的資料列
資料表按右鍵,選擇「檢視資料」,當中有
- 「檢視頂部100筆資料列」:最前面100筆資料的意
- 「檢視全部資料列」:注意,檢視的資料量過大將會導致伺服器負荷過大,不建議開啟此項
- 「檢視已篩選資料列」:以where的條件來篩選資料。但也要注意是否篩選結果資料量會過大的問題
直接輸入SQL指令
點選主視窗的SQL查詢工具,可使用此工具快速測試你的SQL語法。如上圖所示,上方是輸入SQL的地方,下方則是輸出的結果處,但不能像「檢視資料」這樣直接修改。除了select查詢之外,你也可以使用update、delete等其他指令,而下方結果輸出處會顯示有幾筆欄位受到影響。
第五章 透過DSpace的API來操作資料庫
DSpace大部分的物件使用方式,你都可以在原始安裝檔的src目錄下找到。其中src/org/dspace/content目錄裡面皆擺放著常用的物件及方法,例如你要操作item的話,那麼可以查詢src/org/dspace/content/Item.java。當然,要記得在文件開頭import檔案。
詳細的物件使用方法我想再另外一個Dspace操作手冊裡面說明,在此就省略。
然而,Dspace提供的物件並不能滿足設計所需,有時候我們仍需要以純粹的SQL語法來進行查詢。src/org/dspace/storage/rdbms中的DatabaseManager.java、TableRow.java跟TableRowIterator.java裡面的物件可以幫助你這樣做。以下詳細說明這些物件的操作方式。
- 必須在開頭輸入需要的檔案路徑。在JAVA跟JSP的輸入方法不同,看你要在哪邊操作資料庫。
JAVA:
import org.dspace.storage.rdbms.DatabaseManager;
JSP:
import org.dspace.storage.rdbms.TableRow;
import org.dspace.storage.rdbms.TableRowIterator;
<%@ page import="org.dspace.storage.rdbms.DatabaseManager" %>
<%@ page import="org.dspace.storage.rdbms.TableRow" %>
<%@ page import="org.dspace.storage.rdbms.TableRowIterator" %> -
Context context = new Context(); //context是DSpace定義的情境,如果你之前的文件裡面沒有context的話,那麼請用此方法建立一個空的context。當然,要記得在開頭import檔案。
-
TableRow row = DatabaseManager.querySingle(context, "select * from collection"); //querySingle第二個參數是sql語法
-
String temp = row.getStringColumn("name"); //這樣就能取得第一列的name欄位的值。再執行一次則是取得下一列,依此類推。
DatabaseManager.java中的操作方法有很多種,除了查詢之外也有刪除(delete)、更新(update),也有搜尋或新增等方法,相當地實用,請務必好好讀過一遍。
第六章 透過JDBC連接操作資料庫
JAVA程式語言本身也有提供連接資料庫的應用介面,Java Database Connectivity,簡稱JDBC。開始之前必須再次,DSpace的API具有錯誤回報與紀錄log的功能,而且似乎較不會使系統出現問題,建議不要使用原始的JDBC進行連線。由於早期尚未熟悉DSpace的API前,我先使用了JDBC的方式,導致現在系統時常因為資料庫連線而無法回應,並不是好事。
要使用的JDBC API包裝在java.sql(之後的延伸版本則是擺在javax.sql)之中,因此在使用之前必須要import這個檔案:
JAVA:
import java.sql.*
JSP:
<%@ page import="java.sql.*" %>
接著是與資料庫進行連線。注意以下來自於ConfigurationManager的三個參數,個別代表著資料庫位置、帳號及密碼,這是使用Dspace內建的ConfigurationManger來取得與Dspace同樣設定的方法。當然,要記得import:
Class.forName("org.postgresql.Driver").newInstance();
String db_url = ConfigurationManager.getProperty("db.url");
String db_user= ConfigurationManager.getProperty("db.username");
String db_password= ConfigurationManager.getProperty("db.password");
Connection conn= DriverManager.getConnection(db_url,db_user,db_password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
接著便可以對stmt輸入sql、傳回查詢結果,並且取出。以下是範例,請注意到sql跟rs的類型宣告:
String sql="SELECT * FROM item LIMIT 10 OFFSET 0";
//修改這邊的SQL語法!
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {
%><br />
欄位1: <%=rs.getString(1)%>/
欄位2: <%=rs.getString(2)%>/
欄位3: <%=rs.getString(3)%>/
欄位4: <%=rs.getString(4)%>/
<%
}
在while迴圈中,你可以注意到取出rs資料的方法是用getString,而且參數是從1開始而非常見的0。