資料庫基礎 — Chapter 2

Joe Chao
11 min readAug 8, 2023

上篇文章對於資料庫有了個大致的概念,以及它各式的名詞解釋。本篇文章會從什麼是資料庫設計開始,接著提及資料建模、Schema 等重要概念,接最後把關聯式模型做一個整合。

在進入新的概念以前,我們先十分快速的統整上篇文章的概要。資料庫的概念源自於人類想要以電子方式儲存資料在電腦的系統內,也就是說,資料庫管理了資料,並且大部分的資料庫以 SQL 來書寫或查詢資料,而資料庫通常由資料庫管理系統(DBMS)所控制,DBMS 則作為資料庫與使用者之間的橋樑。

資料表的必要元素
資料庫系統的流程

資料庫系統設計

接著就要聊聊資料庫系統設計,一個好的資料庫系統設計對於往後資料庫的維護、更新等都非常重要,而其有兩個主要的方向:

  1. Database design 資料庫設計:著重於資料庫的定義
  2. Application design 應用設計:著重於程序(program)和存取資料庫的介面,也可以說是UI/UX。
Database System Design Process

這兩張圖都清楚地講述了資料庫設計與應用設計的整體流程,接著讓我們細聊資料庫設計(Database Design),又可以說是資料塑模(Data Modeling),實際以定義上來說,這兩者其實是有點差異的,但並沒有一個統一差異上的定義,對於這兩個名詞(請以 database design vs data modeling 作為關鍵字搜索),姑且我們就把它當作一樣的事情吧。

資料塑模(Data Modeling)

資料塑模示意圖

資料塑模將真實東西(也可以稱為實體)轉換成模型,可以說它是一種技術或是程序,目的在於建立客戶所需資訊和商業處理的正確模型,用來定義跟分析資料需求,而資料庫是將真實東西轉換成模型定義的資料結構。

資料庫設計流程

看這張圖就會知道,流程是由:

  1. 概念塑模(Conceptual Data Model):使用實體關係模型(Entity Relationship Model),產生實體關係圖(Entity Relationship Diagram)
  2. 邏輯塑模(Logical Data Model):使用關聯模型(Relational Model),產生資料表的 Schema
  3. 實體塑模(Physical Data Model):使用資料庫管理系統(DBMS),最後會產生真正的實體資料表。

Conceptual model(概念塑模)

概念塑模的目的是將現實中某部分的資料關係用結構化的方式呈現,建立整個資料庫邏輯結構的模型,過程不涉及任何資料庫管理系統、資料庫種類、軟體和實際儲存結構。

最常使用實體關係圖(ERD)來繪製實體關聯模型(ERM)。實體關係圖最後會運用到 DBMS 上。

第一篇文章提及了實體是個概括性的詞彙,它可以是個物品,也可以是個概念。在 ER Model 中,就是由實體和實體間的關係,又稱關聯(Relationship)組成的,主要分為三種:一對一關係、一對多關係、多對多關係。

Logical model(邏輯塑模)

在邏輯塑模中,我們會使用到關聯式模型(Relational Model),最後產生 Schema。邏輯模型主要由下列三者組成:

  • 資料結構:資料的組成方式,就是欄和列組成表格的關聯表(Relations)
  • 資料操作或運算:資料的相關操作
  • 完整性限制(Integrity Constraints):維護資料完整性的條件,其目的是確保儲存的資料是合法的資料

主要有四種邏輯資料模型:階層式模型(Hierarchical Model)、網路式模型(Network Model)、關聯式模型(Relational Model)、物件導向式模型(Object-Oriented Model)。

目前最主流的有關聯式模型與物件導向式模型,關於物件導向式上一篇文章有提及,這裡略過。關於關聯式模型的事情,在第一篇文章我也有提及,但你可能不知道它是關聯式模型,我們先看下圖:

有沒有覺得這張圖很熟悉呢?這就是關聯式模型。主鍵(PK)和外部索引鍵(FK)是構成關聯式模型的關鍵,關聯式模型所描述的,也就是資料表間的關係。

關聯式模型與 ERM 最大的差異在於,ER Model 它所想表達的是「實體」之間的關係,也可以說是物件之間的關係,當我們有了物件之間的關係,才有辦法創立「資料表」間的關係。

這時我們來看看關聯式模型所產出的結果:Schema。看過了關聯式模型之後,對它應該會有個模糊的概念。它就像一張藍圖,一張資料應長成甚麼樣的藍圖。

Schema

Schema 在開發人員的定義下是:資訊的彙整與資訊之間的關係。

"Organization or grouping of information and the relationships among them"

接著就可以提及到 Database Schema 的定義,它把 Schema 這個用詞限縮在資料庫這個領域上,讓我們看看各 DBMS 對它的定義:

  • MySQL:資料結構的集合,i.e. an abstract design of how data is stored in a database,在 MySQL 中,Database 跟 Schema 是相同的。
  • SQL server:一些元素(如資料表、欄位、資料型態、鍵等)的集合。SQL Server schema 由 schema objects 構成。
  • PostgreSQL: A namespace with the name database objects like views, indexed, and functions
  • Oracle: An oracle schema system assigns a single schema to each user. Oracle even names each schema after its respective user.

上面講了一些 Database Schema 在各 DBMS 下的定義,看起來眼花撩亂,實際上 Database Schema 的核心就是:

“Organizational data in the form of tables and the relationships between the tables”

Schema 是設計資料庫前就需要先設計出來的東西,然而它並不儲存實際上的資料,實際上的資料會等到最後一層才儲存。

Physical Model(實體塑模)

  • 針對指定資料庫管理系統建立實際資料庫結構的資料模型,例如:SQL Server
  • 對於關聯式資料庫模型的實體模型來說,就是在資料庫管理系統軟體建立關聯表(Relation) 的表格、關聯性(Relationship)和索引等定義資料
  • 簡單來說,就是將 Conceptual model 和 Logical model 實際建立出來

在介紹完三層的資料建模後,我們再次來細看關聯式模型,它也是目前最常見的模型。

Relational model

關聯式模型主要由三個概念組成:資料、資料的關係、限制。SQL 在關聯式資料庫中,是用來查詢和拿取資料用的。

在關聯式資料庫中,資料表又等於關聯(Relation)。在一個資料表中有列(Row),也稱做紀錄(Record)或元組(Tuple)。行(column),也稱做欄位(Field)或屬性(Attribute)。列定義了行的資料。也就是說,一行由一系列的屬性組成。

屬性的分類:

  • simple attributes(不能再被切分開的屬性)
  • composite attributes(可以被切開的屬性,例如姓名,可以拆成姓跟名)
  • single valued attributes(只能存一個值)
  • multi-valued attributes(可以存多個值,應該避免)
  • derived attributes(從另一個欄位得到的值)
  • key attributes

而在欄位中會有值域(Domain)的限制,值域取決於欄位的資料型態。也有階層(Degree),也就是有多少欄位,和基數(Cardinality),也就是有多少紀錄。

至於限制部分,完整性限制 Integrity constraints:

  • Key constraints: 主鍵不應是 NULL,也不應重複。
  • Domain constraints: 同一資料行中的資料屬性必須要相同。
  • Referential integrity constraints: 次要資料表的外部索引鍵的資料欄位值,一定要存在於主要資料表的主鍵中的資料欄位值

還有關聯的類別:一對一、一對多、多對多。

以及

超鍵(Superkey)

  • 是 Schema 的單一屬性或屬性值集合,超鍵需要滿足唯一性
  • Superkey 可以由一個或多個行(屬性)組成,只要唯一就可以
  • 上方範例關聯表來看,符合的有(sid)、(SSN)、(sid, SSN)、(sid, ename)、(SSN, cname)、(sid, tel)、(SSN, cname, postcode)……

候選鍵(Candidate Keys)

  • 候選鍵是一個超鍵,在每一個關聯表至少擁有一個候選鍵,不只滿足超鍵的唯一性,還需要滿足最小性(Minimality)
  • Candidate Keys 是超鍵的子集合,但不同的是,候選鍵還必須要有最小性,所以單一屬性的超鍵一定是候選鍵
  • 舉個例子,如果下面的範例多了一個學生 sid = 5, ename = Jane,這時候 (sid, ename) 就不是候選鍵,因為去掉 ename 也能區分每一行,所以 ename 是多餘的

主鍵(Primary Key)

  • 符合的有(sid)、(SSN)
  • 從候選鍵中選出一個作為主鍵,挑選主鍵的原則:不可為空值(Not Null)、永遠不會改變(Never Change)、非識別值(Nonidentifying Value)、簡短且簡單的值(Brevity and Simplicity)

替代鍵(Alternate Keys)

  • 在候選鍵中不是主鍵的其他候選鍵稱為替代鍵(Alternate Keys),因為這些是可以用來替代主鍵的候選鍵
  • 如果 (sid) 是主鍵,則 (SSN) 是替代鍵

外來鍵(Foreign Keys)

  • 是關聯表的單一或多個屬性的集合,它的屬性值是參考到其他關聯表的主鍵,用來建立兩個關聯表間的連接。換句話說,Foreign Keys 是其他關聯表的主鍵,可以是該關聯表的主鍵,但不一定是
  • 外來鍵和參考的主鍵屬於相同定義域,不過屬性名稱可以不同
  • 外來鍵可以是空值NULL
CREATE TABLE customer (
C_Id INT NOT NULL,
Name VARCHAR(50) NOT NULL,
Address VARCHAR(255),
Phone VARCHAR(20),
CONSTRAINT pk_Customer_Id PRIMARY KEY (C_Id, Name)
);
--- 我們限制 C_Id 及 Name 這兩個欄位為主鍵,CONSTRAINT 後面接著的即是此主鍵的名稱。

感謝你的閱讀,本篇文章介紹就到這裡,下一篇文章會開始講正規化一二三階、標準化等概念,如果你覺得對你有幫助可以拍個手,謝謝~

--

--

Joe Chao

會計背景,但目前在管顧實習。喜歡很多事情,於是都選擇把它一一記錄下來。