MySQL是一種開源(免費)的關聯式資料庫管理系統,所以任何人都可以免費使用,是Web開發中最常用的資料庫之一。MySQL 會將資料儲存在由資料列與資料欄組成的資料表中。使用者可使用結構化查詢語言 (通常稱為 SQL) 來定義、操控、控管及查詢資料。
簡單來說,資料庫是用來放置大量資料與檔案的一個倉庫,SQL是跟網站倉庫溝通的管員,而MySQL是用來管理倉庫的系統。因此,我們可以透過MySQL系統請SQL與倉庫溝通,管理資料庫中的資料。
關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。
關聯式資料庫有三個特質:
例如:在一個電商網站中,應該會有賣家、商品、分類、使用者和交易紀錄等資料表,而這些資料表各自也有不同的關聯。
例如:在建立 To-do List 的認證系統的時候,需要建立todo 跟 user 這兩種資料的直接關聯性。因此在關聯式資料庫裡,todo 跟 user會以兩個資料表來存放,而在兩個資料表之間,我們也會設定「使用者擁有 todo」這個關聯:
SELECT * FROM [TABLE_NAME] WHERE [COND];
綜合以上所述,由於關聯式資料庫須事先設計好架構,上線後如要進行欄位變更便會相當麻煩,若資料量龐大,變更Schema更是工程浩大。按照關聯式資料庫模型遵循嚴格的 ACID 屬性,對於已經有明確的資料格式,並預計未來不會有大幅度的變更的專案,多考慮選擇使用關聯式資料庫。 大多使用在網站開發、企業應用、日誌分析、數據倉庫等。
以下是一張通訊錄資料表,這張表格是數筆資料的集合。
在資料表上,每一列 (row) 都代表一筆紀錄 (record),也就是「一筆資料」。
垂直的欄在資料庫的術語裡被稱為資料欄位 (field),而他們代表的意義是屬性 (attribute)。
在資料表上最小的單位是格子 (cell),每個格子代表某一筆紀錄的某一個屬性的值 (value)。例如在下例中,「陳小明的郵箱」是 chen@example.com。
創建一個資料表的時候,會替它取個名字 (table name),表示資料表中的資料是同一種類。
每一個聯絡人都有一個獨一無二的識別碼,也就是第一欄的「編號」,也就是流水號。
例:在一個購物網站裡,一個使用者只會有一個購物車,該購物車也只會被一個使用者所擁有。
例:在一個購物網站的一個商品分類裡會有多個商品,而一個商品只會屬於一個分類。
例:一個使用者會參與多個活動,而一個活動也會有多個使用者參與。
最基本的思考方式,是詢問在目前應用程式需求的情境下:
兩個問題都是 NO,代表資料 A 和 B 是一對一的關係。
如果其中一個是 NO,而另一個是 YES,那麼就是一對多的關係,看哪個資料是多的那方。
如果兩個問題都是 YES,那麼就是多對多的關係。
特性:
例:能代表學校學生資料唯一性的屬性,是學生證號碼、信箱和駕照號碼。
例:駕照號碼這個屬性雖然具備唯一性,但有些學生可能沒有駕照,故不滿足持有性,無法作為主鍵。
例:透過 album_id 可以找到在特定 album 的所有 photo。
在一對一的關係裡,我們可以把任一 table 的 Primary Key 放入另一個 table 當 Foreign Key。
例:使用者 (User) 和購物車 (Cart) 是一對一的關係:
在 carts table 上增加一個 user_id 屬性作為 Foreign Key ,對應到 users table 的 id 屬性
我們要在「多」的那方 table 上新增 Foreign Key,對應到「一」那邊的 Primary Key。
例:一個分類 (Category) 會有多個商品 (Product),所以要把 categories 的 id 放入「多」的那端,也就是在 products table 上加入一個 category_id 屬性
在建立多對多關係的資料時,要在原本的兩個 table 之間,加上一個新的 Table。再讓原本的兩個 table 與新增的 table,建立一對多的關係。最後,才把原本的兩個 table 的 primary key 作為 foreign key 放入新增的 table 裡。
例:使用者 (User) 和商品 (Product) 是多對多的關係。
注意:由於多對多關係會新增 join table,並拆解成兩個一對多的關係,所以在關聯式資料庫的設計裡,最後只會留下一對一和一對多的關係。