數據庫設計的範式以及事務

數據庫設計的範式

數據庫設計的範式有好幾種,主要有第一範式(1NF),第二範式(2NF)、第三範式(3NF)、以及第四範式等。
而在本文中我主要是介紹前三種範式,即第一範式、第二範式、第三範式。

首先來看三種範式的定義:
第一範式:當關系模式R的所有屬性都不能在分解爲更基本的數據單位時,稱R是滿足第一範式的,簡記爲1NF。
第二範式:如果關係模式R滿足第一範式,並且R得所有非主屬性都完全依賴於R的每一個候選關鍵屬性,稱R滿足第二範式,簡記爲2NF。
第三範式:設R是一個滿足第一範式條件的關係模式,X是R的任意屬性集,如果X非傳遞依賴於R的任意一個候選關鍵字,稱R滿足第三範式,簡記爲3NF。

當然,看這種定義,對有些人來說,肯定是比較難以理解的。所以,我總結一下主要的內容:
第一範式就是表中每一列都是具有原子性的,也就是說不可以繼續分割。如一下情況,就是反例。學院信息這一列是可以再分的。
第一範式
第二範式說的清楚點就是在1NF基礎上消除非主屬性對主碼的部分函數依賴。即消除下面這種情況。如根據學號(sid)就可以確定學生姓名。
在這裏插入圖片描述
(這裏就要說到三種依賴關係了,這三種依賴關係在我說了第三範式之後講。)

第三範式就是說在2NF的基礎上,任何非主屬性不依賴於其他非主屬性。解決傳遞依賴問題。即如下這種問題:根據學生學號(sid)確定宿舍id(rid),根據宿舍id確定住宿費用。
在這裏插入圖片描述

函數依賴:A–>B 如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,則稱B依賴於A。
函數依賴關係有三種:
1.完全函數依賴:(A–>B) 如果通過A屬性組的值,可以確定唯一B屬性的值,則稱B依賴於A屬性組中的所有屬性值。
2.部分函數依賴: (A–>B) 如果通過A屬性組中的一個值值,可以確定唯一B屬性的值,則稱B依賴於A屬性組中的部分屬性值。
3.傳遞函數依賴:(A–>B B–>C) 如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,在通過B屬性的值可以確定唯一C屬性的值,則稱C傳遞函數依賴於A。

事務

1.基本介紹:如果一個包含多個步驟的操作被事務管理,則要不成功,要麼回滾。
2.操作

  1. 開啓事務(start transaction)
  2. 回滾 (rollback)
  3. 提交 (commit)

3.事務的隔離級別

  1. 原子性:事務是不可分割的最小單位,要麼成功,要麼失敗。
  2. 持久性:當事務提交或者回滾後,數據庫會持久化保存數據
  3. 隔離性:多個事務之間,相互獨立
  4. 一致性:事務操作前後數據總量不變

4.事務的隔離級別(瞭解)
概念:多個事務之間,相互隔離,相互獨立,但是如果多個事務操作同一批數據,則可能會引發一些問題,設置不同的隔離級別可以解決不同問題。
首先說可能存在的問題:

  • 髒讀:一個事務讀取到另一個事務沒有提交的數據
  • 不可重複讀(虛讀):在同一個事務中,兩次讀取到的數據不一樣
  • 幻讀:一個事務操作數據表中所有記錄,另外一個事務添加了一條數據,則第一個事務查詢不到自己的修改。

隔離級別:

  1. read uncommited(讀未提交)
    * 產生問題:髒讀、不可重複讀、幻讀
  2. read commit
    * 產生問題:不可重複讀、幻讀
  3. 可重複讀
    * 產生問題:幻讀
  4. Serializable(串行化)
    * 可以解決所有問題

但是需要注意的是,隔離級別從1到4的安全性越來越高,但是效率也越來越低。

最後再說八個操作:
1.查詢事務的默認提交方式:

select @@antocommit;    -- 1代表自動提交   0代表手動提交

2.修改默認提交方式:

set @@antocommit = 0;  -- mysql數據庫默認爲自動提交。

3.查詢隔離界別

select @@tx_isolaction;

4.設置隔離級別

set global transaction isolation level 級別字符串;

5.數據庫的備份

mysqldump -u用戶名 -p密碼 數據庫名稱 > 保存的路徑;

6.數據庫的還原

1.登錄數據庫
2.創建數據庫
3.使用數據庫(use db1;)
4.執行文件  (source 文件路徑;)

7.修改數據庫字符集

alter database 數據庫名稱 charactar set 字符集名稱;

8.刪除數據庫(慎用)

drop database;

如果有問題,歡迎指正! 謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章