###### tags: `Database` # SQL 2 <font color=red>ACID</font> 刪除資料問題解決方法 - 拒絕刪除 - 連動其他連結資料刪除 - 設定指向此資料的元素為 NULL Update 問題 - 沒改到 primary/foreign key 大多沒事 - 如改到,比照刪除步驟, --- ## Relation Model 符號 ### - 條件篩選 :::warning 進行條件篩選,相當於 `WHERE` $$\sigma_{<slelect\_condition>}(R)$$ ::: :::info ex : $\sigma_{salary>100\ and \ id=10}(employees)$ ::: <br> ### - 選擇 Column :::warning 取 column,相當於 `SELECT FROM` $$\pi_{<column>}(R)$$ ::: :::info ex : $\pi_{salary,id,name}(employees)$ ::: <br> ### - 連結其他 Table :::warning $[\ \bowtie\ ]$ 用來連結其他的 Table 資訊,相當於 `JOIN [Table_B] ON (col_a=col_b)` $$(R_A)\bowtie_{col\_a=col\_b}(R_B)$$ ::: :::info ex : $(EMPLOYEES) \bowtie_{department\_id=department\_id} (DEPARTMENT)$ ::: <br> ### - 計算統計值 & Group By :::warning 利用 function 可以計算統計值, 也可以加上 Group By 計算 group 過後的統計值 ( 如不用 group by 可不加 ),相當於 `SELECT 統計值`、`GROUP BY` $$_{<group \ 元素>}F_{<function\ \ list>}(R)$$ ::: :::info $\leftarrow F_{\ MIN\ salary,\ AVG\ salary\ }(EMPLOYEES)$ ::: <br> ### - 子 Table 設置 :::warning 利用 $[\leftarrow]$ 代表將 SELECT 出的元素當作一個子表格,放置到變數中 $$子表格名稱\ \leftarrow\ <SELECT\ Attribute>$$ ::: :::info ex : $EMDE \leftarrow (EMPLOYEES) \bowtie_{department\_id=department\_id} (DEPARTMENT)$ ::: --- <br> ## 資料庫的問題 ### (1). Redundant 資訊 - **Refundant 資訊** : 指兩 Attribute 包含相同意義的資訊 // ex : 居住地區 vs 郵遞區號 ### (2). Update Anomalies - **Update Anomalies** : 指在更新資料的時候發生的錯誤 - Insert - Deletion - Modification ``` ex : KK 與 JJ 共用一支手機號碼,如果想刪除 KK 手機號碼資料, 在查找做刪除時,可能會不小心刪除到 JJ 的資料 ``` ### (3). NULL 值 - **NULL 值** : 就是資料中包含 NULL,會浪費空間且無法對此 attribute 用 Join - **避免方法** : 避免使用有 NULL 值的資料,如無法避免則不要讓此 attribute 代表的元素 ### (4). Spurious Tuples - **Spurious Tuples** : 指在對兩 Relation(Table) 做 Join 後,出現了因錯誤匹配而產生的多餘資料 - [詳細解說](https://www.geeksforgeeks.org/spurious-tuples-in-dbms/) - **避免方法** : 避免 attribute 有相同重複的資料,因為當對重複資料做 Join,就很容易出現 Spurious Tuples <br> ## Functional Dependency - **用途** : - 方便用來分析 Relation 中的關係 - 可以容易的看出上述的"資料庫的問題" - **定義** : 定義一個關係要找到一個 X 集合可以去對應到一個 Y 集合 $$X\rightarrow Y$$ ``` ex : X={學號} -> Y={姓名、生日} X={學號、課程代碼} -> Y={分數} ``` --- <br> ## Normalize **用途** : 可以利用正規化資料庫,來解決上述的"資料庫的問題" ### (1). Key 介紹 : - **Super Key** : 具有 [唯一性] 的屬性集合,在 Tabel 中不會有重複的值 ex : {學號ID}、{學號+修課代碼}、{學號+姓名} - **Candidate Key** : 是 Super Key 的一種,但還要符合 [最小性],就是不能有多餘的屬性 ex : {學號+姓名} 不是 Candidate Key,因為姓名是多餘的屬性 - **Primary Key** : 算一種 Candidate Key 但每個 Tabel 只有一個,通常會要有以下條件 - 不可有 NULL - 不太會改變。 ex : 身分證字號,但像住址可能會改變就無法做 Primary Key - **Alternate Key** : 通常不是 Primary Key 的 Candidate Key 就算是 Alternate Key - **Foreign Key** : Tabel 中用來連結其他 Tabel 的 Key, 通常 Foreign Key 會是其他 Tabel 的 Primary Key <br> > <font color=blue>### Candidate 和 Primary Key 是相對性質的 ### > ex : {學號+修課代碼} 對某些資料可能是 Candidate Key,但有些資料可能只用 {學號} > </font> <br> ### (2). 第一正規化 [ 1NF ] - **定義** : 將有多個值的 attribute 做處理 - **方法** : - 方法一 : 直接將每個值分割成一筆資料 Tuple, 但這個方法容易造成前面說的 "Spurious Tuples" - 方法二 : 將多值的資料分割出去為一個新的 Table :::info ![](https://i.imgur.com/vwAL0yW.png) ::: <br> ### (3). 第二正規化 [ 2NF ] - **定義** : 消除 Candidate Key 的部分相依,就是移除多餘 Candidate Key 對應資料,某資料可能只需要 Candidate Key 集合中的其中一個 Key, 對他來說其餘都是多餘的 Key,所以要分割出去 - **方法** : 將相對應的 Candidate Key 與資料分隔出去 :::info ![](https://i.imgur.com/tBMrzpc.png) ::: <br> ### (4). 第三正規化 [ 3NF ] - **定義** : 消除 transitively dependency (傳遞相依), "傳遞相關"就是和非 Candidate Key 的 attribute 間的相關 ( 但此關係是與 Candidate Key 間接相關 **Candi->X, X->Y** ) - **方法** : 把除 Candidate Key 以外的相關資料分割為新的 Table, 但與 Candidate Key 間接相關的那個 attribute 還是會保留 :::info ![](https://i.imgur.com/Mr4qgHu.png =350x200) ::: <br> ### (5). 第 3.5 正規化 [ 3.5NF ] ( Boyce-Codd NF ) - **定義** : ~~移除叛徒~~,移除非 Key 獲取 Candidate Key 的關係 也就是當今天有非 Candidate Key 可用來得到 Candidate Key 時就要移除 - **方法** : 將非 Key 獲取 Candidate Key 的關係,分割成新的 Table :::info ![](https://i.imgur.com/nTN3hUi.png) ::: <br>