不要過度複雜化模型,因為你不可能涵蓋所有可能。
本文章會試著以我所知、網路上所查到的訊息、與 Coursera 上的 Meta Database Engineer Specialization 的課程來試著書寫資料庫的基礎,算是給自己的紀錄也是教學,本系列文章不需要任何的先備知識,一切從頭講起。
目錄如下,需要的人可以自行尋找你想看的區塊:
- 資料庫的基本介紹
- 資料庫的種類
- 關聯式資料庫的介紹
- SQL 的基本語法
Intro
什麼是資料庫?這裡先給出一個最簡單的定義,是系統化儲存資料(data)的地方。
那什麼是資料呢?任何事物都可以成為資料,資料本身是未經整理和分析的,經過資料處理(data processing)後,才能將資料轉換為資訊(information)。系統化後的資料具有兩個性質,第一是具有可辨認性(identifiable),第二是儲存於實體(entity)內。
接著就會有人問什麼是實體(entity)了,實體是用於描述物件(無論是事物或者概念)的一個詞彙,它是一個概念性的詞彙。
然而,關聯式資料庫(relational database)中,實體又代表著資料表(table)。在資料表中有大家所熟知的直行(column)橫列(row),行又可以叫做欄位(field),主要是用於表示屬性(attribute),也就是實體的性質,也可以說是欄位的定義,欄位會有特定的名字來描述它底下儲存的這些資料的性質。列則是資料表的紀錄(record),以實體的概念來說,就是實例(instance)。
資料階層
在進入什麼是資料庫之前,先提及資料的階層,層層遞進到資料庫。
資料階層的最小儲存單位是位元,8個位元組成一個位元組,也就是ASCII碼的字元。數個位元組結合成欄位,多個欄位組成紀錄,以實體的概念又稱實例,最後將一組記錄儲存成檔案,又稱為實體,資料庫就是一組相關檔案的集合。
- 第一階層:位元(Bits)
- 第二階層:位元組(Bytes)
- 第三階層:欄位(Fields)
- 第四階層:紀錄(Records) = 實例(Instances)
- 第五階層:檔案(Files) = 實體(Entity)
- 第六階層:資料庫(Database)
什麼是資料庫?
上述完資料、實體、資料表的定義後,就要切入正題了,什麼是資料庫?資料庫是一個對結構化資料的組織性收集,通常以電子方式儲存在電腦系統。
“A form of electronic storage in which data is organized systematically”
知道他的定義後,可能還是會一片模糊,於是我們先看看資料庫都能做些什麼:儲存資料、建立資料間的關係、過濾資料、搜索資料、執行 CRUD(Create, Read, Update, and Delete)指令。這樣就會清楚許多資料庫在做什麼了,讓資料有組織、有系統的儲存,並且被你使用。
在關聯式資料庫中,資料表是他的基本物件,也可以說是最小單位。在一個資料庫中,他可以有很多個工作表,這些工作表都是相關的,基本上是不能單獨存在的。所以,在關聯式資料庫中,資料表又被稱作關聯(relation),而他的列,也就是紀錄,也被稱作元組(tuple)。
那是否還有其他除了關聯式資料庫的資料庫呢?答案是有的。
以下為資料庫的種類,主要分為三種:
- 關聯式資料庫(relational database)
- 物件導向式資料庫(Object-oriented databases, OODB)
- 非關聯式資料庫(NoSQL databases),又分作 Document databases, Key-value databases, and Graph databases。
關聯式資料庫
首先,資料必定儲存在資料表裡,並且欄位(行)會有資料的屬性。而紀錄(列)會有對應該屬性應有的值,方便建立資料點間的連結。
然而,看上圖左邊的 order table,你會發現在 order date 都是同一天的情況下,要如何辨識訂單呢? 這時候你就需要主鍵(primary key, PK),它必須是獨一的,不能重複,也就是 order table 的 order ID 或者是 customer table 的 customer ID。
在關聯式資料庫中,資料表間需要有關聯,如上圖,Order table 和 Customer Table 皆有 Customer ID,在 Customer Table 中的 Customer ID 如上述是主鍵,但 Order table 的 Customer ID 是做什麼的呢?是為了關聯兩張表所用的,因此 Order table 的 Customer ID 是外部索引鍵(foreign key, FK),連接在源頭表的主鍵用的。
- Customer table, order table: 實體
- CustomerID, FirstName, LastName, Email: 欄位
- CustomerID: 主鍵
- The rows under the fields: 紀錄、實例
- CustomerID in order table: 外部索引鍵
物件導向式資料庫
什麼是物件導向式的資料庫呢?這裡簡略帶過。因為物件導向是來自於其他程式語言的概念,詳見超連結的那篇文章。有機會我再來以我的方式補述物件導向。他的特點在於資料是以物件(object)的形式儲存,而非資料表。並且會以類別(class)的方式去分類,類別可以造就物件。
非關聯式資料庫
什麼是非關聯式資料庫呢?在提到這個概念之前,必須先提及什麼是結構化和非結構化資料(structured / unstructured data)。
一般結構化資料是以有限的資料格式儲存,以 SQL 資料庫儲存,並使用 Data Warehouse。而非結構化資料則可能是大量的資料,且具有多變的資料格式,通常使用 Data lake,因此一般的 SQL 資料庫無法儲存,這時就需要非關聯式資料庫。非關聯式資料庫的特點如下:
- 提供較有彈性的資料儲存格式
- 常見於社交媒體平台、互聯網、人工智能等會產生大量資料
- 例如 Document databases, Key-value databases, and Graph databases
- Graph databases: 資料以節點(node)的形式儲存。在以下這張圖中,如 customer, orders, and products 等實體就是節點。節點間的關係就是 edge。
- Document databases: 資料以 JSON(JavaScript Object Notation) 物件的方式儲存,資料被區隔在 collection 裡,就像資料表一樣。在每個 collection 裡,會有數個由 JSON 寫出來的 document 儲存資料。
那介紹完資料庫的型態,簡略講一下資料庫會被放置在哪裡,可能是 local 端(dedicated machine),也可能是現在比較受歡迎的雲端(cloud hosting)上。
稍稍提及資料型態(data type),資料型態的目的在於將這個欄位限縮於某個特定的資料型態,每個 SQL 可能會有不一樣的資料型態,取決於文檔,如數值、文字、日期、布林等。後續會有更詳盡的介紹。
在每筆資料中,除了資料型態會被限縮之外,還會有值域(Domain)的限制,確保每個欄位下的每筆資料的可以被良好的定義。
除此之外,關聯式資料庫還需要一些規則使其得以良好的運行,如以下三個規則:
完整性規則 Integrity constraints
- Key constraints: 主鍵不應是 NULL,也不應重複。
- Domain constraints: 同一資料行中的資料屬性必須要相同。
- Referential integrity constraints: 次要資料表的外部索引鍵的資料欄位值,一定要存在於主要資料表的主鍵中的資料欄位值
大數據 Big data
什麼是大數據呢?大數據是指那些複雜(complex)且隨著時間以指數型成長的數據,例如社交平台、互聯網、網路購物等爆炸的數據量。它可能是結構化、半結構化或非結構化的資料組成的。相較於傳統數據,它更能提供一些特殊的視角,有助於解決問題或做決定。
商業智慧 Business Intelligence(BI)
BI 是一個概括性的術語,涵蓋從商業的運營或活動中,收集、儲存和分析資料的整個程序和方法。這些事物加總起來,才能為企業建立起一個全面的視圖,協助人們做出更周詳與可付諸行動的決定。
資料庫發展進程
- (1970s-1990s) — Flat files(資料都存在一個檔案或一個table裡), hierarchical and network databases
- (1980s-present) — Relational database system
- (1990s- present) — Object-oriented, object-relational, web-enabled
SQL(Structured Query Language)
什麼是 SQL?SQL 翻作結構式查詢語言,是一種能夠與結構化資料互動的標準語言,用於關聯式資料庫管理系統(RDBMS)。
資料被資料庫儲存,然後我們透過 SQL 能與資料互動,那麼誰來管理這些資料庫呢?這時候資料庫管理系統(Database Management System, DBMS)就出現了,它的目的在於控制資料庫的分類及資料的存取。其中有許多分支,例如 MySQL, PostgreSQL, Oracle, and Microsoft SQL Server。
SQL data types
資料型態的目的在於決定什麼樣的資料可以填入你的欄位,如你預期。它也幫你告訴 DBMS 如何解釋這個行的值。最常見的有 Numeric, String, Date。
Numeric data types: INT(whole number), DECIMAL(fraction), positive, negative
String data types: for mixed types of characters(like numeric, string or special characters)
- CHAR(固定長度,宣告後即無法改變),例如 CHAR(50) 代表至多只能 50 個字符。就算是只有五個字符的紀錄,仍然會佔據 50 個字符的空間。適用於你已經預先決定好他字符長度的欄位。
- VARCHAR(變動長度),例如 VARCHAR(50),至多只能 50 個字符,但是如果字有五個字符,他就只會佔據五個字符的空間,他會節省記憶體的使用。
Database constraints
目的在限制只有部分型態的資料可以被儲存進資料表中,使資料表準確且可靠。
Contraints 是適用於所有欄位(e.g. NOT NULL, DEFAULT),而 Rule 則是適用於特定欄位。
- NOT NULL SQL constraint: 確保所有資料欄位都不是空白的
- DEFAULT: 設立預設值,如果沒有值被特別指定的話
SQL subsets
Data definition language(DDL):
CREATE DATABASE database_name;
CREATE TABLE table_name(column1_name DATAYTPE,...);
USE database_name;
SHOW DATABASES;
SHOW TABLES;
-- remove an existing object from a database
DROP DATABASE database_name;
DROP TABLE table_name;
ALTER TABLE table_name ADD(colun_name DATATYPE);
ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE table_name MODIFY column_name DATATYPE;
-- Remove all records from a table but not the table itself
TRUNCATE TABLE table_name;
--- show info about that table
DESC table_name;
Data manipulation language(DML)
--- datatype must be corresponding
INSERT INTO table_name (column1_name, column2_name)
VALUES (value1, value2);
--- 把來源資料表的資料加入目標資料表的資料中
INSERT INTO target_tb1 (column_name)
SELECT column_name FROM source_tb1;
UPDATE table_name
SET column_name = value --- specify the location of the records
WHERE condition;
DELETE FROM table_name WHERE condition;
Data query language(DQL)
SELECT * FROM table_name;
SELECT column_name FROM table_name WHERE condition;
Data control language(DCL): control access to the database
- GRANT: provide the user of the database with the privileges required to allow users to access and manipulate the database
- REVOKE: remove permissions from any user
Transaction Control Language (TCL):
- manage transactions in the database
- COMMIT Command to save all the work you have already done in the database.
- ROLLBACK Command to restore a database to the last committed state.
Operator and Clause:
- +, -, *, /, %, =, >, <, ≥, ≤, <> or !=
- ORDER BY (ASC|DESC)
- GROUP BY
- WHERE
- BETWEEN, LIKE, IN
- DISTINCT
本篇文章目前介紹了資料庫的定義、資料庫相關的基本詞彙、什麼是 SQL 與 DBMS,最後我們簡略的提及了一些 SQL 的基本語法,語法的部分有機會會再進行補充,或另行發一篇文章,下一篇介紹會從資料建模、Schema、資料庫結構等概念開始。
謝謝你的閱讀,如果你覺得這篇文章對你有點幫助,可以幫我點拍手讓我得知,感謝!
參考資料: