SQL三大正規化三個例子搞定

2022-06-18 16:48:13 字數 2259 閱讀 1579

第一正規化(1nf)

(必須有主鍵,列不可分)

資料庫表中的任何欄位都是單一屬性的,不可再分

create table aa(id int,nameage varchar(100)) 

insert aa values(1,''無限-女'') 

沒有達到第一正規化 

create table aa(id int,name varcahr(10),age char(2)) 

insert aa values(1,''無限'',''女'') 

達到第一正規化

第二正規化(2nf)

資料庫表中非關鍵字段對任一候選關鍵字段的 都不存在部分函式依賴

(當乙個表是復合主鍵時,非主鍵的字段不依賴於部分主鍵(即必須依賴於全部的主鍵字段))

create table sci(

sno int(32),cno int(32),grade int(32),credit int(32),

primary key sno,cno

)課程(cno)1---1學分(credit)

學生(sno)n---n課程(cno)

學生+課程--->分數(grade)

scisno cno grade credit

1    1   60     80

2    1    90     80

3   1    70     80

.   .   .      .

.   .   .     .

.    .   .     .

如此以來,學分被大量重複儲存,資料冗餘

如要某課程學分,則要大量重複操作

如要加新課程,由於sno和cno共同做為主鍵,則在加入新課程時,必須有人選該課

如某學生某課程結業,則該學生其它課程資訊也同時被刪除了

總之這種設計不太好吧,非關鍵字屬性credit僅函式依賴於cno,也就是credit部分依賴組合關鍵字(sno,cno)而不是完全依賴

解決分成兩個關係模式 sc1(sno,cno,grade),c2(cno,credit)。新關係包括兩個關係模式,它們之間通過sc1中的外關鍵字cno相聯絡,需要時再進行自然聯接,恢復了原來的關係

第三正規化(3nf)

關係模式r(u,f)中的所有非主屬性對任何候選關鍵字都不存在傳遞依賴

例----s1(sno,sname,dno,   dname, location)

學號 姓名   所在系 系名稱 系位址 

關鍵字sno決定各個屬性。由於是單個關鍵字,沒有部分依賴的問題,肯定是2nf。但這關係肯定有大量的冗餘,有關學生所在的幾個屬性dno,dname,location將重複儲存,插入,刪除和修改時也將產生類似以上例的情況。 

原因:關係中存在傳遞依賴造成的。即sno 1->1 dno。 而dno 1->n sno卻不存在,而dno -> location存在, 因此關鍵遼 sno 對 location 函式決定是通過傳遞依賴 sno -> location 實現的。也就是說,sno不直接決定非主屬性location。 

解決目地:每個關係模式中不能留有傳遞依賴。 

解決方法:分為兩個關係 s(sno,sname,dno),d(dno,dname,location) 

注意:關係s中不能沒有外關鍵字dno。否則兩個關係之間失去聯絡

鮑依斯-科得正規化(bcnf)

在3nf的基礎上,庫表中任何欄位對任一候選關鍵字段的傳遞函式依賴都不存在

倉庫管理關係表為storehousemanage(倉庫id, 儲存物品id, 管理員id, 數量),且管理員1---1倉庫;倉庫1---n物品。這個資料庫表中存在如下決定關係:

(倉庫id, 儲存物品id) →(管理員id, 數量)

(管理員id, 儲存物品id) → (倉庫id, 數量)

所以,(倉庫id, 儲存物品id)和(管理員id, 儲存物品id)都是storehousemanage的候選關鍵字,表中的唯一非關鍵字段為數量,它是符合第三正規化的。但是,由於存在如下決定關係:

(倉庫id) → (管理員id)

(管理員id) → (倉庫id)

即存在關鍵字段決定關鍵字段的情況,所以其不符合bcnf正規化

解決:把倉庫管理關係表分解為二個關係表:

倉庫管理:storehousemanage(倉庫id, 管理員id)

倉庫:storehouse(倉庫id, 儲存物品id, 數量)

python sorted三個例子

例1.按照元素出現的次數來排序 seq 2,4,3,1,2,2,3 按次數排序 seq2 sorted seq,key lambda x seq.count x print seq2 4,1,3,3,2,2,2 改進 第一優先按次數,第二優先按值 seq3 sorted seq,key lambda...

儲存過程三個例子

例項1 統計每年入職的員工個數。可能sql select to char hiredate,yyyy from emp set serveroutput on declare cursor cemp is select to char hiredate,yyyy from emp phiredate...

colorlog的三個例子

import logging from logging.handlers import rotatingfilehandler from colorlog import coloredformatter 第一步 建立乙個日誌收集器logger logger logging.getlogger aut...