關聯式資料庫

文數字資料庫方面、過去有階層式資料庫(heirarchical database system)、網路式料庫系統(network database system)。大多數近代的資料庫系統,例如,DBASE、FOXBASE、ACCESS、ORACLE、INFORMIX等為關聯式資料庫系統(relational database system)。目前向量式地理資訊系統的屬性大 多儲存在關聯式資料庫系統中。因此僅就關聯式資料庫系統加以介紹。

資料庫特性:

關聯式資料庫系統最基本的觀念便是表格(table)。一個表格式為儲存資料最自然的方 式,每一個表格包含了許多行(column)又稱為欄位(field),於每一行內存著相同性質的資料。 表格內每一列(row)裡包含許多不同性質的資料項目。每一列又稱為一筆記錄 (record)。下面是一個典型的表 格:

表一

地籍編號 所有權人 面積 使用分區編號 使用分區
台中市西屯區7號 沈見宇 200 1 商業
台中市西市屯區4號 張標 173 1 商業
台中市西屯區310號 張標 312 2 住宅


表格包含三行(欄位):地籍編號、所有權人、及面積。表格包含三列(記 錄),分別記載六筆土地的資料。

難道一個關連性資料庫就是表格嗎?答案當然是否定的。一個關聯式資料庫系 統必須要滿足一些簡單的規則。

  1. 在關聯式系統內,每一個表格只能存放一種類型的記錄,每個記錄的欄 位數目必須固定,並有明確定義,取自同一個定義域。整個資料庫可以包含許多表格。
    地籍編號 所有權人 面積 使用分區編號 使用分區
    台中市西屯區7號 沈見宇 200 1 商業
    台中市西市屯區4號 張標 王一新 173 1 商業
    台中市西屯區310號 張標 312 2 住宅

     

    地籍編號 所有權人 面積 使用分區編號 使用分區
    台中市西屯區7號 沈見宇 200 1 商業
    台中市西市屯區4號 張標  王一新 173 1 商業
    台中市西屯區310號 張標 312 2 住宅

     

    地籍編號 面積 使用分區編號 使用分區 所有權人
    台中市西屯區7號 200 1 商業 沈見宇
    台中市西市屯區4號 173 1 商業 張標 王一新
    台中市西屯區310號 312 2 住宅 張標

  2. 在一個表格每一欄位的定義必須明確,而且不准重複的項目出現。
    地籍編號 所有權人 所有權人 面積 使用分區編號 使用分區
    台中市西屯區7號 沈見宇 王一新 200 1 商業
    台中市西市屯區4號 張標 王一新 173 1 商業
    台中市西屯區310號 張標   312 2 住宅

  3. 表格內每一個記錄必須是唯一的;既不可有重複的記錄出現。
  4. 表格內每個記錄的次序沒有規定。每個記錄得出現次序並不一定。
  5. 每一行內的資料必須取自同一個定義域。
  6. 一個新的表格可由兩個不同表格內中有相同定義域的欄位資料進行對比 而產生出來。重舊表格中產生新表格,就是關聯式資料庫系統的本質。

關聯式資料庫系統所處理的對象;而處理後的結果也是一些新的表格。關聯式 資料庫的基本操作。最基本的關聯式操作有:

橫向擷取

表格中根據設定選擇條件由原來的表格中,選出需要的資料列構成一個新的表 格。

例如,由表一中橫向擷取面積大於190的記錄,就可以得到下面的新表格。

表二

地籍編號 所有權人 面積
台中市西屯路7號 沈見宇 200
台中市西屯區310號 張標 312


縱向擷取

縱向擷取選取表格內的欄位,構成新的表格。例如由表一中縱向擷取「地籍編 號」和「面積」兩個欄位可以得到下面的表格。

表三

地籍編號 面積
台中市西屯區7號 200
台中市西市屯區4號 173
台中市西屯區310號 312


結合

結合可以組合來自不同表格內的資料。結合操作由兩個不同表格中,各取出欄 位加以比較,然後根據比較的結果將兩個表格接合成一個表格。例如、表四為 姓名及住址。如果要知道一宗地所有權人的地址,可比較表一的所有權人欄位 和表四的所有權人欄位,然後結合表一及表四產生表五。

表四

所有權人 住址
沈見宇 台中市文華路120號
張標 台北市虎林街130號


表五

地籍編號 所有權人 住址 面積
台中市西屯區7號 沈見宇 台中市文華路120號 200
台中市西市屯區4號 張標 台北市虎林街130號 173
台中市西屯區310號 張標 台北市虎林街130號 312


結合表格的方法有許多種,上述的方式稱為(nature join),為最常見的一種 結合方式。上述連結的進行方式可以用下面的方式解釋。表一共有3筆記錄,表四有2筆資料。

表一 表四
地籍編號 所有權人 面積
台中市西屯區7號 沈見宇 200
台中市西市屯區4號 張標 173
台中市西屯區310號 張標 312
所有權人 住址
沈見宇 台中市文華路120號
張標 台北市虎林街130號

 

因此表一和表四配合共有 3 X 2 = 6 種方式。

地籍編號 所有權人 面積 所有權人 住址
台中市西屯區7號 沈見宇 200 沈見宇 台中市文華路120號
台中市西屯區7號 沈見宇 200 張標 台北市虎林街130號
台中市西市屯區4號 張標 173 沈見宇 台中市文華路120號
台中市西市屯區4號 張標 173 張標 台北市虎林街130號
台中市西屯區310號 張標 312 沈見宇 台中市文華路120號
台中市西屯區310號 張標 312 張標 台北市虎林街130號

然後將所有權人相等的記錄選取出來,然後將重複的所有權人欄位消去其中之一,便成為表五的結果。

雖然各種廠牌的關聯式資料庫進行縱向擷取、橫向擷取及結合的指令有所不 同。但是一定包括這些功能,否則不能稱關聯式資料庫系統。

我們常常利用編號來識別事物,例如,地籍編號,身份證號碼。在關聯式 資料庫表格中的鍵(key)也有同樣的功用。鍵由一個或多個欄位所組成, 可以在表格中區別出唯一記錄。換句話說,在一個表格中,只能找到一個 符合鍵值的記錄。例如,在表一中地籍編號欄位為表一的主鍵,表四中的 所有權人為表四的主鍵。必須注意的是在表四中的所有權人是鍵,但是表 一中的所有權人不是鍵。因為一個人可能有兩筆土地。

向量式地裡地理資訊系統和關聯式資料庫連接時,透過圖形資料中所記載 的的鍵值和關聯式資料庫接合(圖一)。這個鍵直通常稱為圖形的識別碼(ID 或 TAG),這個欄位內的值由地理資訊系統自動加以維護,地理資訊系統使用 者不能自行更改。

圖一

地理位置 地籍編號 所有權人 面積
1 台中市西屯區7號 沈見宇 200
2 台中市西市屯區4號 張標 173
3 台中市西屯區310號 張標 312

 

 

 

 

正規化

在資料庫內,相同的資料可由不同的方式儲存。例如,表五中所儲存的資 料和表一及表四所儲存的資料相同。資料庫的表格的設計會影響到未來資 料管理、更新、使用上的效率。常態化(normalizartion)就是確保資料 庫效率所發展的技巧。例如,如果以表五的方式,將所有權人的住址的資 訊和土地的資料存在同一個表格。張標的住址必須儲存兩次。造成儲存空 間浪費。當張標變更他的地址,則必須要變更兩筆記錄。如果其中一筆忘 記更改,張標就會有兩個住址。造成資料的不一致。

SQL語言

SQL(Structure Query Language)語言為關聯式資料庫的標準查詢語言。目前 大多數的關聯式資料庫都可以透過SQL進行查詢、管理。 關聯式語言的結構十分容易瞭解。其基本語法為:

select 欄位 from 表格 where 選擇條件

 

SQL範例

1)select  *               
     from   表一         
     where 面積 > 190
     into 
   表二           
 
表一中面積大於190的記錄橫向擷取得到表二
 
2)select 地籍編號,所有權人 
     from 表一                        
     into    
表三                        
 
表一中地籍編號欄位及所有權人欄位縱向擷取得到表三
 
3)select *  
     from 表一,表四                                        
     where 表一.所有權人 = 表四.所有權人   
     into
表五                                                         
 
表一中所有權人姓名和表四中所有權人姓名相同的記錄加以結合,則產 生表五
 
4)  select 地籍編號,表一.所有權人,表四.住址,表一.面積
    from 表一,表四                                        
    where 表一.所有權人 = 表四.所有權人  AND  表一.
面積 > 190 
    into 表六                                                
 
       綜合relational 操作
 

並非以下介紹聚合函數的使用。聚合函數並不是關聯式資料庫的三個基本操作之一。不過SQL查詢語言中的聚合函數提供了一些統計分析的功能,在資料查詢上經常會用到。

5)select  sum(面積), count(*)
    from  表一                       
    into   表七                        

使用聚合數時,所有的資料被合併進行統計。

6) select       所有權人,sum(面積), count(*)
    from        表一                                      
   group by   所有權人              
    into          表 八                                    

使用聚合函數時,如果使用 group by 時,會依照group by 中的欄位,加以合併分類、進行統計運算。

7)select       表一.所有權人,表四.住址, sum(表一.面積), count(*)
    from        表一,表四                                                                   
    where      表一.所有權人 = 表四.所有權人                           
   group by   表一.所有權人                                              
    into          表九                                                                     

 使用和聚合函數及relation 操作

8)select       表一.所有權人,表四.住址,  sum(表一.面積* 2000)   "稅金", count(*)
    from        表一,表四                                                                   
    where      表一.所有權人 = 表四.所有權人                           
   group by   表一.所有權人                                              
    into         表十                                                                     

使用計算欄位。並且以稅金作為計算欄位的名稱。

9)select        表一.所有權人,表四.住址,  sum(表一.面積* 2000)   "稅金", count(*)
    from        表一,表四                                                                   
    where      表一.所有權人 = 表四.所有權人                           
   group by   表一.所有權人                                              
   order by     col3 desc  
    into         表十一  

使用排序功能 col3代表表十一中的第三個欄位. desc 代表由大排到小。