科普資料庫系列文章:(4/4) 關聯式資料庫特性

在瞭解了資料庫系統的專有名詞後,相信以後您在面臨資料庫相關的話題與學習時,應該會有一定的認知與印象。這一短篇就列舉關聯式資料庫的特性與種類,保持沉浸在資料庫的學習中。

以下即整理出關聯式資料庫的幾項特性,對於這些敘述裡的資料庫專有名詞,您應該可以了然於胸,不難理解了。

  • 關聯式資料庫是由相互關係正規化的關聯資料表所構成
  • 關聯資料表之間是藉由相同的欄位值:「Foreign Key, FK」而連繫
  • 關聯資料表裡的所有屬性內含值都是基元值(Atomic Value)
  • 資料表的Tuple之間沒有次序性(Order)
    實際應用上,使用者可以指定關聯表格中所有Tuple的次序,也就是說上、下記錄的順序並沒有特定的次序。不過,有時候會以事先以主要關鍵欄位進行排序,例如:學生資料表其記錄以“學號” 為排列次序。
  • 欄位之間沒有次序性(Order)
    實際應用上,也可以指定關聯中所有屬性的順序,但非必要。譬如:為方便檢視起見,學生記錄中的“學號” 這個Attribute可放在第一個位置, “姓名” 這個Attribute可放在第二個位置…。
  • 所有欄位值皆為基元值(Atomic Value)
    即: 不可再分解的值,或是分解後不具任何意義的值。又稱簡單值(Simple Value)、純量值(Scalar Value)。當然,哪些欄位的值是否為Atomic可以由使用者來認定,有些則不可以。例如:姓名 (可以),生日 (可以),學號 (不可以),性別 (不可以)…等。
  • 一個關聯中,不含重複的「值組」(Tuple),白話一點的說,一張資料表關聯裡不含重複的資料記錄

關聯的種類

資料表的主鍵並非只是維持資料表唯一性資料的關鍵,更重要的是,可以作為兩資料表之間需要架構出關聯時的要件。在Access中建立資料表關聯的種類,將取決於相關欄位是如何被定義:

  • 如果父關聯(資料表)的主鍵對應子關聯(資料表)裡的多個值組(Tuple),即多筆資料記錄,則可以建立一對多關聯。
  • 如果父關聯(資料表)的一個值組僅能對應到子關聯(資料表)裡的一個值組,子關聯(資料表)裡的一個值組也僅能對應到父關聯(資料表)的一個值組,則可以建立一對一關聯。通常是由父關聯(資料表)的主鍵對應子關聯(資料表)的主鍵。
  • 多對多的關聯是使用第三個關聯(資料表)建立兩個一對多的關聯,第三個關聯(資料表)的主鍵包含二個屬性(欄位)-來自兩個不同關聯(資料表)的外來鍵。

一對多的關聯

大多數的資料表關聯都是屬於這一類的關聯。在此種關聯中,A資料表中的任一筆資料記錄,可以關聯至B資料表的多筆資料記錄。例如:A資料表為[訂單]資料表,記載著每一筆訂單的基本資料;B資料表為[訂單明細]資料表,儲存著每一張訂單所交易的商品項目與數量。在[訂單]資料表中,記載了每一張訂單的[訂單編號]、[訂單日期]、[客戶編號]、[送貨地址]、[運費]、…等等基本資料,其中,[訂單編號]是不可重複的唯一性欄位,也就是主索引關鍵。至於每一張訂單到底包含若干品項的交易明細,基於資料庫正規化的設計,並未記載於[訂單]資料表內,而是儲存在[訂單明細]資料表中。因此,在[訂單明細]資料表裡也會儲存著[訂單編號]欄位,以及交易的[商品編號]與[數量]欄位,其中,在[訂單明細]資料表裡的[訂單編號]欄位是會重複的內容,所以,[訂單]資料表與[訂單明細]資料表彼此之間,可以藉由[訂單編號]欄位建立起關聯,此為一對多的關聯。

在[訂單]資料表中的一個[訂單編號],可以對應著[訂單明細]資料表中的多筆交易明細,因此,這是一對多的資料表關聯。

一對一的關聯

在一對一的關聯中,A資料表中的一筆資料記錄,可以關聯至B資料表的一筆資料記錄,而B資料表中的一筆資料記錄,也只能對應到A資料表裡的一筆資料記錄。這種資料表關聯的使用時機並不多見,通常是基於安全性考量,會將原本資料表中的部分敏感性的欄位資料,分割至另一個資料表中,然後,為這兩個資料表架構出一對一的關聯。例如:A資料表為[員工基本資料],記載著每一位員工的[工號]、[姓名]、[性別]、[部門]、[職稱]、[分機]、…等基本資料,其中,[工號]是此資料表中不可重複的主索引鍵;而B資料表則儲存著每一位員工的[保險帳號]、[基本薪資]、[考績]、[轉帳銀行]、[考績]、…等較具機密與敏感的資料,當然也包括了[工號]欄位,因此,透過共有的[工號]欄位,為這兩張資料表架構出一對一的關聯。

基於安全性或其他因素,可將原本資料豐富的資料表,分割成兩個資料表並串起一對一的關聯。

延伸學習

通常我們可以運用一對一關聯進行以下工作:

  • 分開具有許多欄的資料表。
  • 基於安全考量而隔離資料表的某部份。
  • 儲存暫時資料,只要刪除資料表,便可輕易刪除資料。
  • 儲存只適用於主資料表子集的資訊。

多對多的關聯

在實務上,兩個資料表之間的多對多關聯並不容易建置,通常會藉由三個資料表來建構出多對多的關聯,意即,在原來的兩個資料表之間再加入一個聯合資料表。例如:[訂單]資料表與[商品]資料表即擁有多對多的關聯,其中,在[訂單]資料表中的每一筆訂單資料可以配對至多項商品資料記錄,表示一張訂單包含多項商品的交易。而[商品]資料表中的每一項商品資料亦可配對至多筆交易記錄,表示一項商品在多筆訂單中皆有交易記錄。通常我們無法對這類型的關聯直接進行定義,而是藉由兩組一對多的資料表關聯建構彼此的關係。例如:藉由[訂單明細]資料表為媒介,架構出[訂單]資料表與[商品]資料表的多對多關聯。

關聯式資料庫的完整性

在關聯資料庫中,為了確保相關資料表之間其資料內容的一致性,避免因為一張資料表的記錄有所異動時,造成另一個關聯資料表的內容變成無效,因此,必須維持關聯資料表的參考完整性。例如:[禮盒]資料表裡儲存了5筆禮盒基本資料,包含禮盒編號、名稱、重量、單價與庫存等資料欄位;而[禮盒包裝明細]資料表裡,則記錄著每一種禮盒的包裝內容,儲存每一種禮盒含有多少種糖果。因此,這兩張資料表是一種一對多的關聯。

如果沒有維持參考完整性的設定,則關聯參照將會發生問題。例如:若禮盒T004其實並不存在或者已經不再生產,勢必要從[禮盒]資料表裡移除T004資料記錄,可是,若移除T004記錄後,在[禮盒包裝明細]資料表裡的4筆與T004相關的包裝明細記錄,就沒有參照的對象了而變成無效的內容了!

所以,若維持關聯資料的參考完整性設定,資料庫系統將禁止使用者移除上述範例[禮盒]資料表裡的資料記錄,除非先行刪除或一併刪除在[禮盒包裝明細]資料表裡的4筆與T004相關的包裝明細記錄,以確保兩資料表的正確參照。

<(1)首篇:通識資料庫>   <(2) 科普關聯式資料庫>   <(3) 關聯式資料庫的專有名詞>   <(4) 關聯式資料庫特性>