資料庫範式
第一範式:屬性不可再分
即表中的列的具有原子性,不可再分解,即列的資訊,不能分解, 隻要資料庫是關系型資料庫(MySQL/oracle/db2 /SQL server),就自動的滿足 1NF。 資料庫表的每一列都是不可分割的原子資料項,而不能是集合,數組,記錄等非原子資料項。如果實體中的某個屬性有多個值時,必須拆分為不同的屬性。通俗了解即一個字段隻存儲一項資訊。
第二範式:消除部分函數依賴
如果關系模型R為第一範式,并且R中的每一個非主屬性完全函數依賴于R的某個候選鍵,則稱R為第二範式模式(如果A是關系模式R的候選鍵的一個屬性,則稱A是R的主屬性,否則稱A是R的非主屬性)。
例如,在選課關系表(學号,課程号,成績,學分),關鍵字為組合關鍵字(學号,課程号),但由于非主屬性學分僅依賴于課程号,對關鍵字(學号,課程号)隻是部分依賴,而不是完全依賴,是以此種方式會導緻資料備援以及更新異常等問題,解決辦法是将其分為兩個關系模式:學生表(學号,課程号,分數)和課程表(課程号,學分),新關系通過學生表中的外關鍵字課程号聯系,在需要時進行連接配接。
第三範式:消除傳遞依賴
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3ATNxUDO0YTM1ATNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如果關系模式R是2NF,且關系模式R(U,F)中的所有非主屬性對任何候選關鍵字都不存在傳遞依賴,則稱關系R是屬于第三範式。
第三範式(3NF);符合2NF,并且,消除傳遞依賴。
上圖中符合2NF ,但存在傳遞依賴(老師——>老師職稱。一個老師一定能确定一個老師職稱)。
解決辦法:分解。投影分解:
BC範式
BC範式(BCNF)是Boyce-Codd範式的縮寫,其定義是:在關系模式中每一個決定因素都包含候選鍵,也就是說,隻要屬性或屬性組A能夠決定任何一個屬性B,則A的子集中必須有候選鍵。BCNF範式排除了任何屬性(不光是非主屬性,2NF和3NF所限制的都是非主屬性)對候選鍵的傳遞依賴與部分依賴。
比如我們有一個學生導師表,其中包含字段:學生ID,專業,導師,專業GPA,這其中學生ID和專業是聯合主鍵。
這個表的設計滿足三範式,有主鍵,不存在主鍵的部分依賴,不存在非主鍵的傳遞依賴。但是這裡存在另一個依賴關系,“專業”函數依賴于“導師”,也就是說每個導師隻做一個專業方面的導師,隻要知道了是哪個導師,我們自然就知道是哪個專業的了。
是以這個表的部分主鍵依賴于非主鍵部分,那麼我們可以進行以下的調整,拆分成2個表:
第四範式:消除多值依賴
參考資料:https://www.cnblogs.com/studyzy/p/5823224.html
資料庫外鍵
如果一個字段X在一張表(表一)中是主關鍵字,而在另外一張表(表二)中不是主關鍵字,則字段X稱為表二的外鍵;換句話說如果關系模式R1中的某屬性集不是自己的主鍵,而是關系模式R2的主鍵,則該屬性集稱為是關系模式R1的外鍵。
外鍵限制
Mysql 下,外鍵設定:
on delete 規則:
1、CASCADE:級聯
(1)所謂的級聯删除,就是删除主鍵表的同時,外鍵表同時删除。
(2)以上面的例子将就是,假如院系表中的某個院系被删除了,那麼在學生表中要想查詢這個被删除的院系号所對應的院資訊就會報錯,因為已經不存在這個系了,是以,删除院系表(主鍵表)時必須删除其他與之關聯的表,這裡就說明了外鍵的作用,保持資料的一緻性、完整性。當然反過來講,你删除學生表中的記錄,并不影響院系表中的資料,你查詢院系号也能正确查詢。是以删除外鍵表中的資料并不影響主鍵表。
2、NO ACTION(非活動,預設)、RESTRICT:限制/限制
當取值為No Action或者Restrict時,則當在主鍵表中删除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許删除。(即外鍵表限制主鍵表)
3、SET NULL
當取值為Set Null時,則當在主鍵表中删除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設定子表中該外鍵值為null(,一樣是外鍵表限制主鍵表,不過這就要求該外鍵允許取null)。
NO ACTION和RESTRICT的差別:隻有在及個别的情況下會導緻差別,前者是在其他限制的動作之後執行,後者具有最高的優先權執行。