這是萌芽站長的學業筆記,課程為資管系「資料庫管理」。由於課堂中一下子提及太多專有名詞,來不及做詳細整理,因此一直拖延這篇發佈的時間,不過希望能幫助到您學習!我整理的非常詳細!有任何錯誤都可以在本文末的留言區留下您的想法與建議!
本篇文章著重基礎知識與資料庫設計的說明,文章第四章節列出非常多提問與回答,一定能幫助您更了解資料庫這個領域,SQL 語法及軟體使用教學將另寫文章說明唷!😉
📝 想用 SQL 建立資料庫?看這篇:SQL 語法建立資料庫、資料表及其欄位、資料練習
📝 想用 SQL 做查詢?看這篇:SQL 查詢(SQL Query)的基本語法
▲ 首圖,心血來潮畫個 3D 的資料庫!覺得以後我會搞更多這種 3D 物件!😂
廢話不多說,直接進入本文章節目錄:
本文章節目錄
一、資料庫(DataBase)簡介
二、資料庫(DataBase) & 資料結構(Data Structure) 關係是什麼?
三、何謂正規化(Normalization)?
四、鍵值(Keys)
五、資料庫領域的常見問題
一、資料庫(DataBase)簡介
資料庫,英文:DataBase,通常放於伺服器提供儲存資料的用途,也方便人們追蹤事物,配合後台程式,如:PHP、ASP、JSP 等來連線到資料庫進行存取,再加上前端網頁設計與撰寫,就可以形成一個完整的網站。除此之外,資料庫也能當作一般業務及商務使用,例如:進銷存、校務系統、借書系統等。通常我們使用 SQL 來操作資料庫,可以做新增、修改、刪除、查詢。MySQL 是一種常見的資料庫管理系統(DBMS),本文主軸也會是它,它有 MySQL Workbench 這個圖像化操作介面可以使用,相當方便!😉 關聯式資料庫是最常用的資料庫類型,本文主軸也是關聯式資料庫。
二、資料庫(DataBase) & 資料結構(Data Structure) 關係是什麼?
資料結構(Data Structure)是一種將組織資料的方式,且通常存放或處理於 RAM 或暫存記憶體,而資料庫(DataBase)的觀念是組織的資料集合,並將這些資料儲存或處理於永久儲存空間(硬碟)。如有必要,資料結構中的資料也可以保存到資料庫中永久儲存。
三、何謂正規化(Normalization)?⏏
將資料表細分成更多表格,讓一個表格只陳述一種事實為止,這一連串調整的動作就叫做正規化。
ℹ️ 正規化(Normalization)
1️⃣ 當成鍵值的欄位不可重複
2️⃣ 資料重複出現的欄位拆開到另一個 table
3️⃣ 欄位的關聯(Relation)要明確
↘️ 選課資料:學號(連接"學生基本資料表")、課程(連接"課程基本資料表")
ℹ️ 反正規化(Denormalization)
正規化只是創建資料表的原則,如果過度正規化,會導致查詢來自於多個資料表的大量資料時造成效能下降。因此,若要以查詢(select)的效能為考量,必須進行適當的反正規化,即將原來的第三正規化降級成第二正規化,或者將第二正規化降級成第一正規化。
ℹ️ 正規化步驟(基礎第一正規化~第三正規化)
※ 必須逐步動作,不可跳過。
※ 現在資料庫設計最多滿足 3NF 就差不多足夠了!
先給個初始的資料表做稍後說明與調整用:
學號 | 姓名 | 班級 | 班導 | 課程1 | 課程2 | 課程3 |
001 | 萌萌 | 資管二甲 | 陳教授 | A01 | A02 | A03 |
002 | 芽芽 | 資傳一乙 | 黃教授 | B01 | B02 | B03 |
1️⃣ 第一正規化(First Normal Form, 1NF)
每個欄位只能含有一個值,要刪除重複的欄位。
根據現有的資料表,後面課程1~3明顯重複欄位,必須先設法移除掉這個狀況,更改後如下:
學號 | 姓名 | 班級 | 班導 | 課程# |
001 | 萌萌 | 資管二甲 | 陳教授 | A01 |
001 | 萌萌 | 資管二甲 | 陳教授 | A02 |
001 | 萌萌 | 資管二甲 | 陳教授 | A03 |
002 | 芽芽 | 資傳一乙 | 黃教授 | B01 |
002 | 芽芽 | 資傳一乙 | 黃教授 | B02 |
002 | 芽芽 | 資傳一乙 | 黃教授 | B03 |
2️⃣ 第二正規化(Second Normal Form, 2NF)
資料表必須滿足第一正規化條件,且非主鍵欄位必須都要對主鍵有「完全地功能性相依」。每個非主鍵屬性必須獨立於任意一個候選鍵的任意一部分屬性。如果有哪些資料只和一個鍵的一部份有關的話,就得把它們獨立出來變成另一個資料表。
根據現在的資料表,要調整重複的資料,調整結果如下:
1. 學生:
學號 | 姓名 | 班級 | 班導 |
001 | 萌萌 | 資管二甲 | 陳教授 |
002 | 芽芽 | 資傳一乙 | 黃教授 |
2. 選課:
學號 | 課程# |
001 | A01 |
001 | A02 |
001 | A03 |
002 | B01 |
002 | B02 |
002 | B03 |
3️⃣ 第三正規化(Third normal form, 3NF)
資料表必須滿足第一正規化與第二正規化條件,且非主鍵欄位之間沒有「完全地功能性相依」,也就是說非主鍵屬性之間應該是獨立無關的。
根據現有的資料表,我們要刪除不依賴索引鍵的資料:
1. 學生:
學號 | 姓名 | 班級 |
001 | 萌萌 | 資管二甲 |
002 | 芽芽 | 資傳一乙 |
2. 班級資料:
班級 | 班導 |
資管二甲 | 陳教授 |
資傳一乙 | 黃教授 |
這樣就完成三個正規化啦!切記這只是生成資料表的原則並非規定唷!
※ Boyce-Codd(Boyce-Codd normal form,縮寫 BCNF),是資料庫規格化的一種正規形式。是在第三正規化的基礎上加上稍微更嚴格約束,每個 BCNF 關係都滿足第三正規化。BCNF 去除了屬性間的不必要的函式依賴。簡單來說,滿足 3NF 並且每個決定性屬性都是候選鍵就是符合 BCNF。
※ 補充:決定性屬性(Determinant)的值具有不重複性,且可決定所有其他屬性的值。
四、鍵值(Keys)⏏
關係鍵(這裡說的鍵值)是一個表中的一個或幾個屬性,是關聯式資料庫的重要組成部分。
主鍵(Primary Key)
資料庫表中對儲存資料物件予以唯一和完整標識的資料列或屬性的組合。一個資料表只能有一個主鍵,且主鍵的取值不能為空值(Null)。
※ 獨一索引(Unique key)是 VFP 為了與舊版相容而設計的。
Ex: 身分證字號、學號等。
超鍵(Super Key)
資料庫關聯式設計中能夠唯一標示多元組(即「行」)的屬性集,即成為超鍵必要符合唯一性。
候選鍵(Candidate Key)
成為候選鍵必要符合唯一性與最小性,且每個鍵值都只能對應至唯一的一筆記錄。候選鍵為決定性屬性(Determinant),用於確定所有其他欄位之間的關係。
Ex: 身分證字號、學號﹑姓名(假設無同名同姓者)
➡ 候選鍵 = 主鍵 + 交替鍵
替代鍵(Alternate Key)
在候選鍵中不是主鍵的其他候選鍵都是替代鍵。
外部鍵、外鍵(Foreign Key)
接收由另一個資料表的主鍵傳來的資料,換句話說,資料表裡的某一欄,它參照到另一個資料表的主鍵。
次要鍵、次鍵(Secondary Key)
候選鍵之外的鍵值,主要的功能是提供資料索引。
代理鍵(Surrogate Key)
當資料表中的候選鍵都不適合當主鍵時,例如資料太長,或是意義層面太多,就會請一個無意義的但唯一的欄位來代為作主鍵。
自然鍵(Natural Key)
與代理鍵相反,它是在自然生活中唯一確定一個事物的標識(代號)。身分證號(假設絕無重複)就是一個自然鍵,用於確定一個人。
複合鍵(Composite Key)
若無候選鍵,可由多個欄位合起來組成一個鍵值,且能對應至唯一的一筆記錄。
五、資料庫領域的常見問題 ⏏
課本習題列入我們期中考範圍,因此我就自行將課本習題中的題目翻譯成中文,只將自己覺得重要的提問提出來,答案有參考網路資料解答,但通通都有經過我的理解與修正唷!僅供參考。
Q1:當多個用戶同時處理資料庫時可能會出現什麼問題?
A1:當一個資料庫由多個用戶同時使用時,一個用戶的工作可能會干擾另一個用戶的工作。管理多用戶資料庫可說是相當重要。
Q2:為何數位儀表板(Digital dashboard)和資料探勘程式(Data mining applications)不同於交易處理程式(Transaction processing applications)?
A2:數位儀表板和資料探勘程式不會生成新資料,而是用於匯總現有資料以向管理者提供有用的訊息。
Q3:什麼是結構化查詢語言(SQL),為什麼它很重要?
A3:SQL 是一種特定目的程式語言,用於管理關聯式資料庫管理系統,它是一個國際公認的標準語言。
Q4:DBMS 代表什麼?
A4:DataBase Management System,縮寫:DBMS,中文為資料庫管理系統,如:MySQL 等。
Q5:DBMS 的功能是什麼?
A5:DBMS 用於創建、處理和管理它控制下的資料庫。
Q6:簡單列出五個 DBMS 產品?
A6:有三個 DBMS 產品供應商:Microsoft(Microsoft Access 和 SQL Server),Oracle Corporation(Oracle 資料庫和 MySQL)和 IBM(DB2)。
Q7:資料庫(DataBase)與資料庫管理系統(DBMS)有何不同呢?
A7:資料庫是個儲存資料的地方,但是如果只是將資料儲存到電腦或伺服器中,其效用並不大,因此,我們還需要有一套能夠幫助我們更方便地管理及操作資料庫內資料的軟體,這個軟體就是所謂的「資料庫管理系統(DBMS)」。
Q8:為什麼資料庫被認為是自描述(Self-Describing)的?
A8:資料庫被認為是自描述的,因為它包含對自身的描述,舉例來說,資料庫中的資料表,每個表中的列以及每列中儲存的資料類型。
Q9:什麼是元資料(metadata)? 該術語與資料庫有何關係?
A9:元資料,英文為 metadata,還被翻譯成「詮釋資料」,它是描述其他資料的資料,其實就是直指資料庫管理系統之綱要(schema)。
Q10:在資料表中儲存元資料(metadata)有什麼好處?
A10:在資料表中儲存元資料的優點是我們可以查詢元資料以確定資料庫的結構。
Q11:資料庫應用程式使用的語言是什麼?
A11:Structured Query Language(SQL),即結構化查詢語言。
Q12:定義資料庫設計?
A12:依據資料庫模型組織資料,設計者必須確定儲存哪些資料以及資料元素們如何相互關聯。有了這些訊息,它們就可以開始將資料與資料庫模型相匹配。
Q13:提供兩個方法讓已存在的資料可以生成(設計)資料庫。
A13:(一)使用來自非資料庫的來源(如電子表格或文本文件)的資料/(二)將現有資料庫中的資料提取出來。
Q14:什麼是資料倉儲(Data Warehouse)?什麼是資料市集(英語:Data Mart)?
A14:資料倉儲是一種資訊系統的資料儲存理論,此理論強調利用某些特殊資料儲存方式,讓所包含的資料,特別有利於分析處理,以產生有價值的資訊並依此作決策。資料市集是資料倉儲(Data Warehouse)的一種特殊形式,通常具有特定於某個主題的版本。
Q15:什麼是資料庫集成(Database Integration)?
A15:資料庫集成是將不同來源與格式的資料庫以邏輯上或物理上進行集成(合併)的過程。
Q16:什麼是資料庫遷移(Database Migration)?
A16:資料庫遷移是將一個電腦儲存空間的資料庫藉由選擇、準備、提取和永久轉換資料,並將其傳輸到另一個電腦儲存空間的過程。
Q17:列出三個早期的個人電腦 DBMS 產品。
A17:dBase、R:base 和 Paradox。
Q18:什麼是 OODBMS?
A18:Object-Oriented Database Management System,即物件導向資料庫管理系統。
Q19:OODBMS 產品為何不成功的原因?
A19:OODBMS 產品並不成功,因為:(一)將以關係格式儲存轉換為物件導向格式的資料成本很高/(二)OODBMS 產品相對於商業資料處理的關聯式 DBMS 產品缺乏實質性優勢。
Q20:HTTP 的哪些特徵是資料庫處理程式需要注意的?
A20:HTTP 是無狀態的協定,這意味著 HTTP 不維護客戶端和服務器之間的網路連線。許多資料庫的交互是多階段的,需要客戶端和服務器之間的連續連線。
Q21:什麼是 XML?比爾·蓋茲對 XML 有何評論?
A21:XML 是 HTML 的一種變形,目的在克服使用 HTML 交換文本所產生的固有問題。比爾·蓋茲說:「XML 是網際網路時代的通用語言」。
(萌芽站長插嘴:但實際上因為整個網頁與瀏覽器的發展,XML 並未成為主流,現在主流網頁採用的皆是 HTML)
Q22:什麼是 NoSQL 運動?舉例依賴 NoSQL 資料庫的應用。
A22:NoSQL 運動實際上是一個「不僅是關聯式資料庫(Not Only Relational Database)」運動,因為它提倡不同於關聯式的資料庫設計。Facebook 和 Twitter 就是使用 NoSQL 資料庫,現在許多組織都使用 SQL 和 NoSQL 資料庫。
Q23:舉兩個非關聯式資料表的例子。
A23:這邊就直接舉例啦!
1️⃣ 課本 (ISBN, 書名, 作者)
只要作者欄位內有多個作者就是非關聯式資料表了!
2️⃣ 學生 (學號, 姓名, 性別, 興趣)
只要興趣欄位內有多個興趣就是非關聯式資料表了!
Q24:什麼是複合式決定性屬性(Composite Determinant)?
A24:由多個屬性組成函數依賴關係的決定性屬性。
Q25:哪種鍵值有兩個或多個欄位?
A25:複合鍵(Composite Key),若無候選鍵,可由多個欄位合起來組成一個鍵值,且能對應至唯一的一筆記錄。
Q26:什麼是候選鍵(Candidate Key)?
A26:候選鍵為決定性屬性(Determinant),用於確定所有其他欄位之間的關係。
Q27:什麼是主鍵(Primary Key)? 解釋實體完整限制(Entity Integrity Constraint)對主鍵的重要性。
A27:主鍵是從候選鍵選擇出來的一個鍵值,是識別關聯式欄位的主要方法。主鍵的每一筆資料(行,直向欄位)都是被要求為獨一無二的值, 這是關聯式資料庫正常運行的基本要求。
Q28:什麼時候使用代理鍵(Surrogate Key)?
A28:在當資料表中的候選鍵都不適合當主鍵時,例如資料太長,或是意義層面太多,就會請一個無意義的但唯一的欄位來代為作主鍵。
Q29:哪些正規化與功能相依性(Functional Dependencies)有關?
A29:1NF、2NF、3NF 和 BCNF。補充:屬性間的關係就是所謂的功能相依性(Functional Dependencies)。
Q30:多值依賴(Multivalued dependencies)是什麼?
A30:舉例來說,假設有三個屬性:課程、老師、教科書,添加了課程就要有老師,添加了老師就要有教科書。如果要將 BCNF 繼續往下做到第四規格化(4NF),就要有這個多值依賴的特徵。
Q31:當您收到一組表格時,您應該採取哪些步驟來評估其結構和內容?
A31:
- 計算列數並檢查欄位
- 檢查資料(值)並與使用者面談以確定:
○ 多值依賴(Multivalued Dependencies)
○ 功能相依性(Functional Dependencies)
○ 候選鍵(Candidate Key)
○ 主鍵(Primary Key)
○ 外部鍵、外鍵(Foreign Key)
- 評估資料會是完整且有效的。
Q32:敘述資料庫正規化(Normalized Tables)的優點。
A32:消除修改異常、減少重複的資料、消除資料完整性問題、節省文件空間。
Q33:敘述資料庫正規化(Normalized Tables)的缺點。
A33:1️⃣ 需要更複雜的 SQL 來查詢多個子表格與使用多個 join/2️⃣ 增加 DBMS 的額外工作量,使軟體效率變差。
Q34:SQL 語法練習題
假設您獲得了這個表格:
EMPLOYEE_DEPARTMENT (EmployeeNumber, EmployeeLastName, EmployeeFirstName, Email, DepartmentName, BudgetCode)
並且您希望將此表轉換為兩個表:
DEPARTMENT (DepartmentName, BudgetCode)
EMPLOYEE (EmployeeNumber, EmployeeLastName, EmployeeFirstName, Email, DepartmentName)
編寫輸出 EMPLOYEE 和 DEPARTMENT 表格所需的 SQL 語法,使用 EMPLOYEE_DEPARTMENT 表格的資料。
A34:
INSERT INTO DEPARTMENT
SELECT DISTINCT DepartmentName, BudgetCode
FROM EMPLOYEE_DEPARTMENT;
INSERT INTO EMPLOYEE
SELECT EmployeeNumber, EmployeeLastName, EmployeeFirstName, Email, DepartmentName
FROM EMPLOYEE_DEPARTMENT;
Q35:解釋為何不將郵遞區號放入 BCNF。
A35:郵遞區號幾乎沒變,假設如果有人輸入了錯誤的城市,則郵遞區號將不一致。
Q36:為何將自定義重複表(Customized Duplicated Table)當作是反正規化(Denormalization)的案例?
A36:因為每次創建重複表時都會遇到資料完整性問題(Data Integrity Issues)。
Q37:解釋多值、多欄位引起的問題。
A37:如果銀行帳戶訊息只有三個欄位,假設一個人有四個銀行帳戶,那麼您就遇到了問題。此外,如果您要查詢數據並且正在查找特定的銀行帳戶,則必須查詢每個欄位,這是非常辛苦的。
Q38:為什麼外鍵(Foreign Key)中的值不一致會導致特別麻煩?
A38:當外鍵資料編碼不一致或拼寫錯誤時,關聯將丟失或錯誤。
Q39:什麼是空值(Null Value)? 它有什麼問題?
A39:空值表示變數具有未知值,不同於零值。若要解決邏輯問題,您擁有變數的已知值越多,就越容易解決問題。
文章結束囉!這真的是萌芽站長很用心整理的,真心希望可以幫助到你了解資料庫唷!🙏 🥰
更新日誌:
2019/04/10(三):首次發文,完成「資料庫(DataBase)簡介」、「資料庫(DataBase) & 資料結構(Data Structure) 關係是什麼?」、「何謂正規化(Normalization)?」和「資料庫領域的常見問題(Q1~Q22)」四個章節。
2019/04/12(五):新增「鍵值(Keys)」章節及更新「資料庫領域的常見問題(Q23~Q39)」章節。
留言區 / Comments
萌芽論壇