# 資料庫 ## 什麼是資料庫 而資料庫 (database) ,則是為了解決組織、存取、刪除、編輯大量資料的問題。它提供完整結構,幫我們更有效滿足需求。 例如在日常生活中,我們會利用電腦、數位形式長久地保存資料,像是儲存 MS Word .doc 或純文字在檔案中。但當資料量比較大時,隨機、無秩序地儲存資料,會造成花很多時間、甚至找不到資料的困擾。 又或想進一步管理、查詢與操作資料;或是想多人、多個應用程式去使用資料時,也會因為檔案缺乏結構與管理工具,執行過程中會遇到更多的不便。 ## 資料庫專有名詞 ### 資料庫管理系統 (DBMS) DBMS(Database Management System)是一個軟體系統,用於定義、創建、管理和控制資料庫。DBMS提供了以下功能: 1. **數據定義**:允許用戶定義數據的結構和格式。 2. **數據操作**:提供插入、更新、刪除和檢索數據的工具。 3. **數據安全性**:確保只有授權的用戶才能訪問和修改數據。 4. **數據完整性**:確保數據的一致性和準確性。 5. **數據備份和恢復**:提供數據備份和恢復工具,以防數據丟失。 常見的DBMS有: - **MySQL**:一個開源的關聯型資料庫管理系統,廣泛用於網頁應用。 - **PostgreSQL**:一個強大且功能豐富的開源關聯型資料庫管理系統。 - **Microsoft SQL Server**:微軟開發的關聯型資料庫管理系統,適用於企業級應用。 - **Oracle Database**:甲骨文公司開發的關聯型資料庫管理系統,具有強大的功能和高性能。 ![](https://i0.wp.com/tw.alphacamp.co/wp-content/uploads/2022/12/6283155f7b9eddad6992f8d0_Untitled-1.png?w=800&ssl=1) ### 資料庫 (Database) 資料庫是一個有組織的數據集合,用於存儲和管理數據。資料庫可以包含多個表格,每個表格存儲不同類型的數據。例如,一個公司資料庫可能包含員工表、客戶表和訂單表。 ### 表格 (Table) 表格是資料庫中的基本結構,用於存儲數據。每個表格包含行和列: - **row(記錄)**:每一 row 代表一個完整的數據記錄。 - **column(欄位)**:每一 column 代表數據記錄的一個屬性或特徵。 例如,一個學生表格可能包含以下列:學生ID、姓名、年齡、班級。 ![截圖 2024-06-04 上午12.26.26](https://hackmd.io/_uploads/HJf60wsNA.png) ### 工作台 (Workbench) Workbench是一種圖形化工具,用於與資料庫互動。它提供了一個用戶友好的界面,方便用戶管理資料庫、設計資料庫結構、執行SQL查詢和進行數據分析。以下是常見的工作台工具: - **MySQL Workbench**:MySQL的官方圖形化管理工具,用於設計和管理MySQL資料庫。 - **pgAdmin**:PostgreSQL的圖形化管理工具,用於設計和管理PostgreSQL資料庫。 - **SQL Server Management Studio (SSMS)**:Microsoft SQL Server的官方管理工具,用於設計和管理SQL Server資料庫。 這些工具使得資料庫管理變得更加直觀和方便,特別適合初學者和那些不熟悉命令行操作的用戶。 ## 常見的資料庫種類 ### 關聯型資料庫 (Relational Database) 關聯型資料庫使用表格來存儲數據,並通過行和列來組織數據。表格之間可以通過關聯(外鍵)來建立關係。這種資料庫適合結構化數據的存儲和查詢,並且使用SQL(Structured Query Language)進行操作。 #### **特點:** - **結構化數據**:使用表格來存儲數據,每個表格包含行和列。 - **SQL 語言**:使用SQL(Structured Query Language)來進行數據查詢和操作。 - **資料完整性**:通過主鍵、外鍵和約束條件來維護數據的一致性和完整性。 - **事務支持**:支持ACID(原子性、一致性、隔離性、持久性)特性,確保數據的可靠性。 - **標準化設計**:數據通常被標準化以減少冗餘和提高數據一致性。 ### 非關聯型資料庫 (NoSQL Database) NoSQL資料庫適合存儲和處理非結構化或半結構化數據。這些資料庫通常不使用表格和SQL來存儲和查詢數據,而是採用其他數據模型,如文檔、鍵值、列族或圖形。 #### **特點:** - **多樣的數據模型**:包括文檔、鍵值、列族和圖形等多種數據模型。 - **靈活的數據結構**:允許存儲非結構化和半結構化數據。 - **高擴展性**:通常具備優秀的橫向擴展能力,適合大規模分布式系統。 - **最終一致性**:相比關聯型資料庫,NoSQL資料庫在一致性方面更加靈活,通常採用最終一致性模型。 ### 常見的資料庫管理系統 1. MySQL: MySQL 是一種關聯式資料庫管理系統。由於其高效能、穩定性、輕量級以及開源的特性,常被用於網站的資料庫系統,且在開發中的快速原型設計也十分常用。它支援多種平台並提供多種編程語言的API,例如 PHP、Perl、C、C++ 等。 2. PostgreSQL: PostgreSQL 是一種具有強大擴展性和標準遵循度的開源物件關聯資料庫系統。它能夠處理從小型單機應用到大型互聯網或數據倉儲應用的工作負載。與 MySQL 不同,PostgreSQL 支援複雜的查詢和儲存過程。 3. MongoDB: MongoDB 是一種高效能、開源、無模式的文檔導向資料庫,被稱為是 NoSQL 系列資料庫中的一個重要成員。它能夠支援多種資料結構,並且易於擴展,適合應對大數據存儲和雲計算。 - [參考文章](https://tw.alphacamp.co/blog/database-intro) - [延伸閱讀](https://medium.com/moda-it/%E9%97%9C%E8%81%AF%E5%BC%8F%E8%B3%87%E6%96%99%E5%BA%AB-vs-%E9%9D%9E%E9%97%9C%E8%81%AF%E5%BC%8F%E8%B3%87%E6%96%99%E5%BA%AB-8cc14e68896b) ## Key ### 主鍵 (Primary Key) **定義**:主鍵是一個或多個column,其值在表中唯一標識每一row。主鍵的主要作用是確保每一row數據的唯一性和完整性。 **特點**: 1. **唯一性**:主鍵column中的每個值必須是唯一的,不能重複。 2. **非空性**:主鍵column中的值不能為空(NULL)。 3. **穩定性**:主鍵的值應該是不可變的,不能隨意更改。 **用途**: - **唯一標識數據行**:主鍵用於唯一標識表中的每一行,確保數據的唯一性。 - **關聯表之間的連接**:在關聯型資料庫中,主鍵通常用作外鍵,以在不同表之間建立關聯。 **示例**: - 在一個學生表中,學生編號(StudentID)可以作為主鍵,因為每個學生都有一個唯一的編號。 - 在一本書的表中,書籍ISBN(International Standard Book Number)可以作為主鍵,因為每本書都有一個唯一的ISBN。 ### 外鍵 (Foreign Key) **定義**:外鍵是一個或多個column,用於建立和加強兩個表之間的連接。外鍵的值來自另一個表的主鍵,從而創建了表之間的關聯。 **特點**: 1. **參照完整性**:外鍵確保表與表之間的數據一致性。例如,如果在子表中插入一row數據,其中的外鍵值必須存在於父表的主鍵列中。 2. **防止孤立數據**:外鍵防止在子表中存在沒有對應父表記錄的孤立數據。 3. **級聯操作**:可以設置級聯更新或刪除,當父表中的數據變更或刪除時,自動更新或刪除相關的子表數據。 **用途**: - **建立表之間的關聯**:外鍵用於在不同表之間建立關聯,使得數據庫能夠管理和維護數據的一致性。 - **實現參照完整性**:通過外鍵約束,確保相關表之間的數據正確和一致。 **示例**: 假設有兩個表:`Students` 表和 `Enrollments` 表。我們希望在 `Enrollments` 表中存儲學生選課的信息,其中 `StudentID` 是外鍵,參照 `Students` 表的主鍵 `StudentID`。 ## 資料庫關聯類型 ### 1. 一對一 (One-to-One) **定義**:在一對一關係中,表A中的每一行對應表B中的唯一一行,反之亦然。 **示例**:每個人都有唯一的護照,每個護照只屬於一個人。 ### 2. 一對多 (One-to-Many) **定義**:在一對多關係中,表A中的每一行可以對應表B中的多行,但表B中的每一行只能對應表A中的唯一一行。 **示例**:一個作者可以寫多本書,但每本書只有一個作者。 ### 3. 多對一 (Many-to-One) **定義**:在多對一關係中,表A中的多行可以對應表B中的同一行,這是一對多的逆關係。 **示例**:多個學生屬於同一個班級,但每個班級可以有多個學生。 ### 4. 多對多 (Many-to-Many) **定義**:在多對多關係中,表A中的每一行可以對應表B中的多行,反之亦然。需要使用聯結表來表示這種關係。 **示例**:學生可以選擇多門課程,每門課程可以有多個學生。 - [延伸閱讀](https://medium.com/pierceshih/%E7%AD%86%E8%A8%98-%E8%B3%87%E6%96%99%E9%97%9C%E8%81%AF%E7%9A%84%E4%B8%89%E7%A8%AE%E9%97%9C%E4%BF%82-245152c093da) ![截圖 2024-06-04 上午12.42.41](https://hackmd.io/_uploads/rJwcEdsN0.jpg) ## 補充 ACID ACID 是指資料庫管理系統 (DBMS) 在進行交易處理時必須遵守的四個基本屬性,以確保數據的可靠性和一致性。這四個屬性是: 1. **原子性 (Atomicity)** - **定義**:一個交易中的所有操作要麼全部完成,要麼全部不完成。換句話說,交易是不可分割的單位。 - **示例**:如果一筆銀行轉賬交易在過程中發生錯誤,則該交易的所有操作(扣款和入賬)都應該回滾,不應有任何部分的操作被應用。 2. **一致性 (Consistency)** - **定義**:交易執行前後,資料庫都必須處於一致的狀態。這意味著交易應該從一個一致的狀態轉換到另一個一致的狀態。 - **示例**:假設在銀行系統中,每筆交易都必須遵循會計平衡原則(資產 = 負債 + 股東權益)。一致性確保任何交易後,這個原則依然成立。 3. **隔離性 (Isolation)** - **定義**:多個交易並發執行時,彼此不應相互影響。每個交易應該被隔離,避免互相干擾,彷彿它們是按順序執行的。 - **示例**:在兩個同時進行的銀行轉賬交易中,隔離性確保它們不會讀取到彼此未提交的中間結果。 4. **持久性 (Durability)** - **定義**:一旦交易提交,對數據庫的改變應該是永久性的,即使系統崩潰也不應該丟失這些改變。 - **示例**:如果一筆銀行轉賬交易已經成功提交,即使隨後系統崩潰,這筆交易的結果(如資金的轉移)應該被永久保存,且在系統恢復後依然存在。 這四個屬性共同保證了資料庫操作的可靠性和數據的一致性,使得資料庫能夠在各種錯誤和並發環境中正常運行。