# 數據庫

某部電腦顯示佢儲住嘅數據。
喺電算上，**數據庫**（粵拼：sou3 geoi3 fu3；英文：database，DB ），又叫**資料庫**，係指電腦系統化噉儲住資料嘅地方：**系統化**意思即係話個數據庫唔淨只識儲住數據，仲會設計到方便用家搵資料；舉個簡單例子，廿一世紀初嘅數據庫最起碼仲會包埋某啲形式嘅搜尋功能，俾用家打關鍵詞嚟摷資料，而喺實際應用上，例如一間企業可以用數據庫儲住佢哋員工嘅資料，等管理者可以隨時靠打員工名或者姓嚟搵有關某位員工嘅資料。

喺電腦科學裏面，數據庫係相當專門嘅領域：由數據庫嗰度搵件數據出嚟，就噉睇好似好簡單；不過到咗廿一世紀初，商業用嘅數據庫閒閒哋可以儲住成幾千億至幾萬億個位元組咁多嘅數據，而由呢啲噉嘅數據庫當中搵數據用到嘅演算法，可以非常複雜；由於數據庫技術咁專業，好多企業甚至仲會專登請個職位，淨係幫手應付數據庫方面嘅工作。

數據庫及相關嘅技術喺現代資訊科技中舉足輕重：數據庫技術令到企業儲到嘅數據量大增，於是有唔少資訊系統方面嘅工作者就著手研究噉嘅數據可以點樣用嚟達成商業目的，形成咗大數據同數據科學等嘅領域－可以例如量度同分析消費者用某件電子產品嗰陣嘅行為；電腦科學工作者仲會將機器學習等嘅人工智能技術結合落去數據庫度。

## 概論

正式嚟講，數據庫包涵一大團彼此間有啦掕嘅數據，仲有係呢團數據點樣組織埋一齊。舉例說明，好似係維基百科嘅營運噉，就會用到以下噉嘅數據庫：

* 儲住數據：維基百科日常運作嗰陣要記住大量數據，好似係啲用家嘅數據（每位用家嘅名、個戶口邊年邊月邊日開、同埋做咗幾多吓編輯... 呀噉）、啲維基頁嘅數據（每頁嘅標題同埋有幾多隻字符呀噉）同埋係啲修改嘅數據（每次修改係由邊位用家做同埋喺邊年邊月邊日發生呀噉）... 等大量數據。一個數據庫通常會分做若干張表，例如用家數據一張、維基頁數據一張、修改數據一張噉。
* 組織埋一齊：淨係記住啲數據係唔夠嘅，個數據庫仲要將唔同嘅表嘅數據連繫埋一齊，簡單例子有每位用家都俾個 ID 冧把佢，然後修改數據當中嘅每次修改都掕住做嗰次修改嘅用家嘅 ID 冧把，噉數據庫嘅使用者就有得攞住記用家數據嗰張表，叫部電腦去修改數據表嗰度，摷嗮嗰位用家做過嘅修改出嚟－啲數據之間有組織。

上述講嘅例子，可以用好似下圖噉嘅實體關係表畫出嚟。下圖每個視窗都表示一張專記住某種數據嘅表（例：`user` 係記用家數據嗰張表）而個視窗入面每行字都係一個描述嗰種嘢嘅變數（例：`user_id` 係位用家嘅 ID 冧把、`user_name` 係嗰位用家嘅名、`user_password` 係嗰位用家嘅密碼... 等等）而且唔同表之間仲有某啲特定方法將唔同表嘅數據掕埋一齊。而除咗維基數據之外，疾病資料庫同互聯網電影資料庫都係喺廿一世紀初相當出名嘅數據庫。

## 關係數據庫

喺廿一世紀初，數據庫入面嘅一幅試算表幾乎實會係以關係數據庫嘅形式表達嘅，即係話幅表會以表格嘅方式出現，有若干行打橫嘅列同埋若干行打戙嘅行，每列表示一個個案，每行表示一款數據。舉個簡單嘅例子說明，家陣整個數據庫，專門用嚟記住有關啲學生嘅數據，出好似下圖噉嘅表，每一行都表示一個學生可以有嘅一個特性，包括係名（`Name`）同主修嘅學科（`Major`）呀噉，而每一列都表示某一個學生嘅數據，包括嗰個學生嘅冧把，仲有係嗰個學生嘅 `Name` 同 `Major` 呀噉，做到清清楚楚噉表達嗮一柞個案同每個個案嘅特性：

| Number | Name | Major |
| --- | --- | --- |
| 1 | Jack | 生物學 |
| 2 | Kate | 社會學 |
| 3 | Claire | 語言學 |
| 4 | John | 化學 |
| 5 | John | 化學 |
| ... | ... | ... |

廿一世紀初嘅關係數據庫嘅設計可以好複雜：

* 首先一個數據庫通常要有最少一行攞嚟做主匙（primary key）；一條主匙係指個數據庫入面俾人揀嚟做到「每個個案都有自己獨有一個數值」嘅匙，例如好似上圖噉，上圖個數據庫記住咗啲學生嘅數據，不過 `Name` 同埋 `Major` 唔會做到主匙－呢個世上的確有可能會有學生真係咁啱得咁橋同名又讀同一個學科，好似响上圖入面學生 4 同學生 5 都係個名叫阿 John 而且一樣係讀化學嘅，因為噉，設計個數據庫嘅人就整咗一行叫 `Number` 表示學生號碼，同每個學生俾個獨一無二嘅號碼佢，嗰兩個讀化學嘅阿 John 號碼唔同，於是用個數據庫嘅人就有得靠住檢驗手上個學生嘅 `Number`，確保自己搵到嗰個學生真係自己想搵嗰個，而唔係一個咁啱同名同姓嘅人－`Number` 就係呢個數據庫條主匙。主匙仲可以再細分做
	+ 自然匙：指條匙嘅數值係對應住某啲會喺數據庫以外嘅特性嘅。假想家陣設計個數據庫嘅人想每個學生都俾條主匙佢，但佢用嘅主匙係身份證號碼－佢喺每個學生登記嗰陣都叫佢哋填自己嘅身份證號碼，並且喺個數據庫入面入咗每個學生嘅身份證號碼，因為身份證號碼正路嚟講係每個人都保證獨一無二嘅，而呢種用「喺個數據庫以外嘅地方都有可能會用到嘅特性」嚟做嘅匙就係所謂嘅自然匙。
	+ 代理匙：自然匙嘅相對，指條匙喺個數據庫以外完全係冇意義嘅。假想家陣設計個數據庫嘅人可能唔想個數據庫入面記住好似身份證號碼呢啲咁敏感嘅個人資料，所以佢就改改自己個做法－喺一個學生登記嗰時，佢都用擬亂數產生等嘅方法隨機噉產生一個有返咁上下長嘅號碼（例如 `72108526761` 噉），攞呢個數字嚟做嗰個學生嘅學生號碼；呢啲學生號碼喺個數據庫以外嘅地方係完全冇用嘅，而好似呢種用「喺個數據庫以外嘅地方唔會用到嘅特性」嚟做嘅匙就係所謂嘅代理匙。
* 外匙：指條匙會連去第張表嘅主匙度；舉個例，家陣個學生數據庫要擴張，要記埋每一個學生係由邊位導師（`Tutor`）主要負責教嘅，間學校嘅數據庫仲另外有張表係記住有關啲導師嘅數據嘅（下面冇擺出嚟睇），而每位導師都有個 5 個位嘅數字表示佢嘅導師號碼（導師號碼係導師數據嗰張表嘅主匙），而學生張表嘅 `Tutor` 就係用導師號碼嚟表示每個學生由邊位導師負責，例如阿 Jack 嘅導師係號碼 `83026` 嗰位，而嗰兩個讀化學嘅阿 John 咁啱由同一位導師負責。喺學生呢張表入面，`Tutor` 就係一條外匙。

| Number | Name | Major | Tutor |
| --- | --- | --- | --- |
| 1 | Jack | 生物學 | 83026 |
| 2 | Kate | 社會學 | 87949 |
| 3 | Claire | 語言學 | 52641 |
| 4 | John | 化學 | 76867 |
| 5 | John | 化學 | 76867 |
| ... | ... | ... |

* 複合匙（composite key）：指一種主匙嘅做法，指條匙由兩個或者以上嘅特性（行）組成。舉個例說明，想像家陣有間企業想整個數據庫，記住自己同啲客做過嘅交易，於是佢就整咗個噉嘅數據庫－個數據庫每一列都記住咗一串交易，會包含以下嘅重要數據：
	+ `Employee_id` 指做嗰單交易嘅員工嘅號碼（記員工數據嗰張表條主匙）、
	+ `Client_id` 指做嗰單交易嘅客嘅號碼（記住啲客嘅數據嗰張表條主匙）、
	+ `Total_sales` 指嗰位員工同嗰位客之間嘅交易總共賺咗幾多錢，以美元計。
* 即係例如員工號碼 107 嗰位員工同客戶號碼 400 嗰個客之間做咗嘅交易總共值 55,000 文美元咁多。喺呢個表當中，`Employee_id` 同 `Client_id` 一齊扮演咗主匙嘅角色－一位員工可能同時要應付多個客，所以齋靠 `Employee_id` 做唔到主匙，而一個客又可能會由幾位員工同時處理，所以齋靠 `Client_id` 都係做唔到主匙，不過 `Employee_id` 同 `Client_id` 一齊用就能夠做到每個個案都有佢嘅獨有數值。呢種用兩個或者以上嘅特性結合而成嘅主匙就係複合匙。

| Employee\_id | Client\_id | Total\_sales |
| --- | --- | --- |
| 107 | 400 | 55,000 |
| 101 | 401 | 267,000 |
| 105 | 402 | 22,500 |
| 104 | 403 | 5,000 |
| ... | ... | ... |

## SQL

## 硬件

喺硬件上，有返咁上下規模嘅組織用嘅數據庫通常都會儲响數據中心嗰度－呢啲組織會有若干個數據中心，每個數據中心嗰度都會有啲伺服器喺度。呢啲伺服器通常會係行多元處理嘅電腦，記憶體充裕，可以儲到極大量嘅數據；除此之外，呢啲伺服器都會受到嚴密保護，因為呢啲系統好多時都會儲住啲重要嘅個人資料（例如係一間企業啲員工嘅地址或者電話號碼呀噉），又或者係有嗰間企業研發緊嘅新產品嘅詳情，唔俾得同行知。正路嚟講，淨係得嗰啲有權限嘅人（例如係間企業嘅高層噉）先至可以睇或者攞數據庫入面嘅數據，而且有陣時唔同用家嘅權限可能都唔同（例如高層同研發部嘅人可以睇研發緊嘅新產品嘅數據，但間企業嘅其餘員工就唔得）。

2014 年一個數據中心；
呢啲電腦儲住咗好多重要嘅數據喺入面。
## 管理系統

數據庫管理系統（DBMS）泛指一啲專門設計嚟俾用家攞嚟管理數據庫嘅軟件，最少會有齊增查改刪（CRUD）嘅功能。增查改刪包括：

* **增加**（**C**reate）指加新嘅數據個案落個數據庫嗰度；
* **查閱**（**R**ead）指俾用家查同睇數據庫入面嘅數據；
* **更改**（**U**pdate）指俾用家改嘅數據庫嘅數據；
* **刪除**（**D**elete）指俾用家剷走唔想要嘅數據。

## 睇埋

* 時間標記：指一串用嚟記住一件事件幾時發生嘅資訊；數據庫入面嘅每一件數據通常都會掕住個時間標記，用嚟表示嗰件數據係幾時記錄入去個數據庫度嘅。睇埋 logging 同相關嘅分析。
* 序列化：係指將一個數據結構或者物件轉化成一個可以儲起嘅格式，等呢啲數據可以傳去第度而且收數據嗰方可以重新砌返啲數據出嚟。有好多程式語言（例如 Python 同 C#）都會有特定嘅陳述式做序列化。例如 C# 就有類似噉嘅做法：

```
 [SerializeField] InputField feedback1; // feedback1 會做序列化。

```

	+ 做序列化可能嘅用意包括係想將啲數據傳去數據庫嗰度，例如行為分析上就成日會將自己嘅軟件設計成曉將描述用家行為嘅數據傳返去間企業嘅數據庫嗰度。
* 原始數據
* 數據清洗
* 網頁刮料

## 文獻

* Hellerstein, J. M., Stonebraker, M., & Hamilton, J. (2007). *Architecture of a database system*. Now Publishers Inc.
* Hellerstein, J. M., & Stonebraker, M. (Eds.). (2005). *Readings in database systems*. MIT press.
* Kent, W. (2012). *Data and Reality: A Timeless Perspective on Perceiving and Managing Information*. Technics publications.
* Ramakrishnan, R., Gehrke, J., & Gehrke, J. (2003). *Database management systems* (Vol. 3). New York: McGraw-Hill.

## 引咗

## 拎

* （英文） DB File extension – information about files with the DB extension.