本系列是之前應 Newzilla 邀稿而發表刊載的文章,現在在本站重新整理後發表。本篇簡單介紹資料庫、種類,以及資料庫管理系統,讓新手對資料庫有最基本的認識。
目錄
前言
本篇文章探討開放源碼的資料庫 PostgreSQL 以及跨平台語言 Java(OpenJDK)之間的整合應用。首先會介紹資料庫系統的部份,讓讀者們對資料庫具有基本的認識,接下來就正式進入目前熱門的資料庫之一:PostgreSQL 的部份。經過簡單的 SQL 語法單元後,就是 Java 和 PostgreSQL 之間的處理了。
由於 Java 與資料庫之間的連線通常是程式語言中較進階的部份,所以讀者們若能稍具有 Java 程式設計基礎,或擁有其他語言的編程經驗的話會比較好。當然若只對 PostgreSQL 或是 Java 中 JDBC 部份感到興趣的話,那麼本篇文章也應能讓你有些心得。
什麼是資料庫系統
每家公司和網站或多或少都有資料庫,例如客戶/廠商或會員資料庫、零件/產品及型錄資料庫、人事管理資料庫等等,負責將公司中各項重要資料以分門別類的方式記錄下來。即使是沒有上述資料庫的小型公司,在會計報帳、記帳時所細列的月報表和年報表,也是一種資料庫。
廣義地來說,資料庫可視為一堆資料的集合,所以 Excel 試算表、CSV 檔案(Comma-Separated-Value)、信件軟體中的郵件和通訊錄、硬碟裡的檔案、圖書館中的書籍等等,都只是形態不同的資料庫。
但是光擁有資料庫是不夠的,我們還需要一套資料庫的管理系統,如果沒有它的話,我們就找不到從網路下載到硬碟上的風景圖片,也找不到一年前所收到的郵件,或圖書館裡的米蘭.昆德拉(Milan Kundera)名著「生命中不能承受之輕」(Unbearable Lightness of Being)。
因為資料庫可能擁有不同形態,所以就產生了種類及功能互異的資料庫管理系統。像是 Windows 中的檔案總管、Linux 平台上的 ls mv rm ln find cd whereis 等指令,或是線上圖書管理資訊網站及書籍索引紙卡管理系統。如此一來我們就可以有系統地管理所有資料,並且使用資料庫管理系統來快速搜尋到我們所要的檔案或書籍。
簡單來說,資料庫系統(Database System)可分成兩部份:資料庫(Database)和資料庫管理系統(Database Management System)。資料庫負責儲存資料,而資料庫管理系統則是我們讀取資料庫的介面。更精確地說,資料庫系統是特定主題相關資訊的集合,並經過某種完善的組織規劃和架構,使得我們可以快速且簡單地找到資料。
資料庫的種類
依照資料庫的儲存架構,大略可粗分為四種:
階層式資料庫(Hierarchical Database)
以樹狀結構、分門別類的方式將資料儲存在不同的階層中,像是硬碟中目錄式檔案系統就是屬於此類。因此最上層是頂端,並以樹狀形式往下擴散,形成一座金字塔,其上下階層之間的關聯性直接而簡單。例如名為「男歌手」的目錄其上層名為「全部歌手」,下層則是歌手名字。不過因為資料關聯是以上下階層為主軸的縱向發展,所以在橫向階層之間的關聯不易處理,容易造成資料重複出現而浪費空間,或是管理不易。
網路式資料庫(Network Database)
將每一筆紀錄使用節點的方式儲存,而每個節點之間可以互相建立關聯,最終成為一個龐大而複雜的網路架構。有點像是人際關係架構一樣,你認識十個朋友,這十個朋友又各自認識其他人,變成人際網路,或是人脈。最近網路上當紅的社群網站(http://www.orkut.com/,已關站)就是類似這樣的系統。這種資料庫避免了資料重複性的問題,但是關聯性容易過於複雜。所以當節點愈來愈多的時間,關聯性的維護就會愈發複雜。
關聯式資料庫(Relational Database)
資料會依照不同的分類而儲存在數個表格之中,再利用欄位之間的參考來建立表格之間的關聯。每個表格都可以各自進行資料的新增、修改、查詢和刪除,也可以使用關聯性在數個表格中取得所要查詢的資訊。這是目前最廣泛應用的資料庫架構。
物件導向式資料庫(Object-Oriented Database)
此架構是用物件導向的觀念來建立資料庫,每個類別都有各自的屬性和方法,並且也具有類別、物件和繼承的架構。這種資料庫的出現時間較晚,因此發展還不如關聯式資料庫普及。
資料庫管理系統
資料庫管理系統(以下簡稱 DBMS)的目的就是做為使用者和資料庫之間的橋樑,負責將使用者的要求經過解析後傳送給資料庫,並且將其結果回傳給使用者。想像一下圖書館內的館藏查詢和借閱記錄系統,可以讓我們查看自己所借閱過的書籍、搜尋目前圖書館內是否有某一本書,以及預約借閱他人尚未歸還的書籍。所以 DBMS 使得我們不用擔心資料的儲存位置,以及如何找到資料,這些複雜的事項全由 DBMS 包辦了。因此大致上來說,DBMS 具有下列幾項功能:
資料定義
資料庫一開始時是處於空白狀態,你可以加進各種資料,但是在輸入資料之前,我們必須要先設定資料庫中將要存放資料種類,也就是要依據各種需求去設定及管理資料項目,像是表格、欄位與其資料型態,以及表格之間的關聯性。
資料處理
這項功能讓使用者能夠去存取資料庫中的資料,主要就是基本四項:新增、修正、刪除及查詢(CRUD)。如此一來我們才能隨時更新資料庫,並且找到我們所需要資料。
資料安全
DBMS 要能根據不同的使用者帳號設定不同的權限,並且以密碼檢驗以防止任意人士登入。使用者依權限可在其授權範圍內存取資料,避免資料外洩或遭到破壞。另外連線時的交易處理也屬於此一部份。
資料備份
資料庫很可能在某次天災人禍後崩毀,造成資料流失的慘狀。因此 DBMS 必須要提供備份的功能,使得資料庫毀損時能將傷害減到最低。
關聯式資料庫架構
目前市面上主流的架構是關聯式資料庫,它的 DBMS 就稱之為關聯式資料庫管理系統(Relational Database Management System,以下簡稱 RDBMS)。它主要是使用表格(table)做為其儲存資料的方法,所以一個資料庫中會有一至數個表格,分別存放各式資料。
每個表格中都有各自的欄位(field)或行(column),像是會員表格中需要有帳號、密碼、性別、電子郵件、星座、註冊時間、留言篇數、上站次數等欄位,記錄著和會員相關的資料。在定義好資料後,接下來資料便可以一筆筆分門別類地輸入與其相對應的表格之中,稱之為記錄(record)或列(row),而同一表格之中的每筆資料都有共有的欄位。
在我們粗略地規劃好表格之後,接著就要來整理一下每個表格的定義。先來看一個簡單的例子:假設我們現在要實做一個會員制的留言版系統,其中需要包含有留言、會員、管理者等表格,而會員表格中有「星座」欄位。有天你需要把其資料中字串「白羊座」改成「魔羯座」,或是把「乙女座」、「室女座」改成「處女座」,那麼在人數少時你可以輕易修改而無須太過耗時。但是如果會員人數已成長上千甚至上萬人的話,那麼直接修改會員表格中的欄位就顯得效率欠佳。
關聯模式
關聯式資料庫使用關聯模式來解決這個問題,也就是將資料切割成數個較小的單位,彼此之間互相關聯起來。為了達到將各自獨立的表格之間產生關聯,表格中的指定欄位可讓其他表格取得參考(reference),或者說鍵值(key)。
以上述為例,星座就可以獨立出來做為一個表格,並且在會員表格中設定某個欄位去參考星座表格中的鍵值。如此一來,想要修改星座名稱時,只要在星座表格中修改一筆資料就可以了。省時省力,無需面對會員表格中動輒千筆的資料和效率低落而感到頭痛,讓表格中的重複資料量降低。
也就是說,星座表格中有一個欄位,我們將其設定為鍵值行(key column),其中每筆資料之間的鍵值無法重覆。有點像是書本的 ISBN 編號一樣,每本書的 ISBN 都不同。接著在會員表格中,去設定它的星座欄位參考到星座表格中的鍵值行。如此一來,星座欄位中存放的數值便只能使用星座表格中鍵值行內的數值,達成了會員表格與星座表格之間的關聯。
在星座表格中的鍵值行稱之為主鍵值(primary key),會員表格中的星座欄位稱之為外來鍵值(foreign key),因為它參考到其他表格中的鍵值行。