整理了下網上關於資料庫的一些IDEA ..
三大正規化
第一正規化 :
所謂第一正規化(1NF)指的是在關係模型中,對列新增的一個規範要求,所有的列都應該是原子性的,即資料庫表的每一列都是不可分割的原子數字項,而不是集合、陣列、記錄等非原子資料項。
雖然第一正規化要求各列要儲存原子性,不能再分,但是這種要求和我們的需求是相關聯的。
第二正規化 :
所謂第二正規化(2NF)指的是在(1NF)的基礎上,非Key屬性必須完全依賴於主鍵,要求實體的屬性完全依賴於主關鍵字。
所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。
第三正規化 :
第三正規化(3NF)的目標就是確保表中各列與主鍵列直接相關,而不是間接相關。即各列與主鍵列都是一種直接依賴關係,則滿足第三正規化。
第三正規化的目標就是確保表中各列與主鍵列直接相關,而不是間接相關。即各列與主鍵列都是一種直接依賴關係,則滿足第三正規化.
總結:
1NF: 欄位是最小的的單元不可再分
2NF:滿足1NF,表中的欄位必須完全依賴於全部主鍵而非部分主鍵 (一般我們都會做到),一張表的欄位必須是跟主鍵相關的,不把無關資料放進來。
3NF:滿足2NF,非主鍵外的所有欄位必須互不依賴,就是各種資訊只在一個地方儲存,不出現在多張表中。
4NF:滿足3NF,消除表中的多值依賴。
事務
特性 | 說明 |
---|---|
原子性 Atomic | 表示組成一個事務的多次資料庫操作是一個不可分割的原子單元,只有所有的操作都執行成功,才提交整個事務 。 事務中的任何一次資料庫操作失敗,已經執行操作都必須回滾,讓資料庫返回到操作前的狀態 |
一致性 Consistency | 事務操作後,資料庫所處的狀態和它的業務規則是一致的 。比如 A 賬戶轉賬到 B 賬戶,不管操作是否異常, A 賬戶與 B 賬戶的總額是不變的。 |
隔離性 Consistency | 在併發運算元據時,不同的事務擁有各自的資料空間,它們的操作既可能地不對對方產生干擾。資料庫規定了多種事務隔離級別,不同的隔離級別對應不同的干擾程度 。 隔離級別越高,資料一致性越好,但併發性越差。 |
永續性 Durability | 一旦事務提交成功,事務中所有的資料都必須被持久化到資料庫中 。 即使在提交事務後資料庫發生崩潰,那麼當資料庫重啟時,也必須保證能夠根據日誌恢復資料 。 |
併發性
資料庫中的相同資料,可能同時被多個事務所訪問。所以,如果沒有采取必要的隔離措施,就會導致各種併發問題,從而破壞資料的完整性 。
併發問題可以歸結為 5 類,包括 3 類資料讀問題(髒讀 、 不可重複度 、 幻讀)和 2 類資料更新問題(第一類丟失更新和第二類丟失更新)。
1 髒讀
A 事務讀取了 B 事務尚未提交的更改資料,並在此資料的基礎上進行操作 。 如果此時 B 事務回滾,那麼 A 事務之前讀到的資料就是髒資料。
時間序列 | 事務 A | 事務 B |
---|---|---|
1 | 開始事務 | 開始事務 |
2 | - | 查詢賬戶餘額(100 元) |
3 | - | 取出 50 元 |
4 | 查詢賬戶餘額(50 元)【髒讀】 | - |
5 | - | 回滾事務(賬戶餘額:100 元) |
6 | 存入 100 元 | - |
7 | 提交事務(賬戶餘額:150 元) | - |
這裡因為發生髒讀,導致賬戶損失了 50 元(事務 A 存款 100 元,事務 B 無影響,再加上原來的賬戶餘額 100 元,最後的賬戶餘額應該是 200 元才是)。
2 不可重複讀
不可重複讀指的是事務在不同的時間點,讀取到的資料不同。
時間序列 | 事務 A | 事務 B |
---|---|---|
1 | 開始事務 | 開始事務 |
2 | - | 查詢賬戶餘額(100 元) |
3 | 查詢賬戶餘額(100 元) | - |
4 | - | 取款 10 元 |
5 | - | 提交事務(賬戶餘額:90 元) |
6 | 查詢賬戶餘額(90 元) | - |
在時間序列 6,與在時間序列 3 時查詢到的餘額不同,發生不可重複讀現象。
3 幻讀
幻象讀一般發生在計算統計資料的事務中 。 A 事務讀取了 B 事務提交的新增資料,這時 A 事務將出現幻象讀的問題 。
假設在同一個事務中,兩次統計名某銀行支行所有賬戶的總金額,在兩次統計過程中,剛好新增了一個存款賬戶 。那麼,這兩次統計的總金額肯定會不一致 。
時間序列 | 事務 A | 事務 B |
---|---|---|
1 | 開始事務 | 開始事務 |
2 | 統計(總金額:10 w) | - |
3 | - | 新增存款賬戶(金額:1 w) |
4 | - | 提交事務(總金額:11 w) |
5 | 統計(總金額:11 w)幻讀 | - |
4 不可重複讀與幻讀比較
比較 | 不可重複讀 | 幻讀 |
---|---|---|
讀取物件 | 讀到其它事務已經提交的修改或刪除資料。 | 讀到其它事務已經提交的新增資料。 |
採取措施 | 對所要操作的資料新增行級鎖,避免這些資料發生變化。 | 對所要操作的資料所在表新增表級鎖,即將整張表鎖定(在 Oracle 中,是以多版本資料的方式實現的)。 |
5 第一類丟失更新
A 事務回滾時,把 B 事務中已經提交的更新資料給覆蓋咯 。
時間序列 | 事務 A | 事務 B |
---|---|---|
1 | 開始事務 | 開始事務 |
2 | 查詢賬戶餘額(100 元) | - |
3 | - | 查詢賬戶餘額(100 元) |
4 | - | 取款 10 元 |
5 | - | 提交事務(賬戶餘額:90 元) |
6 | 存入 10 元 | - |
7 | 提交事務(賬戶餘額:110 元) | - |
這個問題影響很大。這個例子中,賬戶餘額應該還是 100 元(取款 10 元,存入 10 元,實際對賬戶無影響),但因為存在第一類丟失更新,導致銀行損失 10 元。如果事務 A 先提交,那麼賬戶將損失 10 元。
6 第二類丟失更新
A 事務提交後覆蓋了 B 事務已經提交的資料,導致 B 事務所做操作丟失。
時間序列 | 事務 A | 事務 B |
---|---|---|
1 | 開始事務 | 開始事務 |
2 | - | 查詢賬戶餘額:100 元 |
3 | 查詢賬戶餘額:100 元 | - |
4 | - | 取款 10 元 |
5 | - | 提交事務(賬戶餘額:90 元) |
6 | 存款 10 元 | - |
7 | 提交事務(賬戶餘額:110 元) | - |
上述示例,直接導致銀行損失 10 元。如果 A 事務先提交,那麼將導致賬戶損失 10 元。
本作品採用《CC 協議》,轉載必須註明作者和本文連結