SQL三大范式

第一范式(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)

sci

sno 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, 數量)

轉載于:https://www.cnblogs.com/soundcode/p/7249363.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253911.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253911.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253911.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring3向Spring4升級過程中quartz修改

為什么80%的碼農都做不了架構師?>>> 問題 nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name ... 原因 org.spri…

Socket編程知識必學/SELECT 編程

Select在Socket編程中還是比較重要的,可是對于初學Socket的人來說都不太愛用Select寫程序,他們只是習慣寫諸如 connect、accept、recv或recvfrom這樣的阻塞程序(所謂阻塞方式block,顧名思義,就是進程或是線程執行到這些…

EasyUI--messager

1.    alert 方法 <script type"text/javascript">$( function(){$.messager.alert("調用messager","文本內容") ;});</script> 這里還可以通過icon添加相應的圖標及info加入回調函數 <script type"text/javascript&quo…

ROS與navigation教程——基本導航調整指南

說明&#xff1a; 介紹如何調整機器人上的ROS導航包 步驟&#xff1a; (1) 機器人導航需要那些準備? 在調整新機器人上的導航包時遇到的大部分問題都在本地規劃器調諧參數之外的區域。機器人的里程計&#xff0c;定位&#xff0c;傳感器以及有效運行導航的其他先決條件常常…

小程序跨行跨列多列復雜表格實現

今天來實現個跨行跨列多列表格。 如圖&#xff0c;這是個列數不確定&#xff0c;有的單元格還要跨行跨列的復雜表格。 這里暫時最多支持4列&#xff0c;列數再多就放不下了。 實現原理 實現原理比較簡單&#xff0c;通過多個嵌套的循環將數據取出。 上面的例子中&#xff0c;最…

Redis學習第八課:Redis高級實用特性(一)

Redis高級實用特性 注&#xff1a;我學習的環境是vmware7.1 ubantu10.10 redis 3.0.2 1、安全性 設置客戶端連接后進行任何其他指定前需要的密碼。因為redis速度相當快&#xff0c;一個外部用戶可以在一秒鐘進行很多次的密碼嘗試&#xff0c;這就需要設定非常強大的密碼來防止…

分布式緩存的面試題9

1、面試題 如何保證緩存與數據庫的雙寫一致性&#xff1f; 2、面試官心里分析 你只要用緩存&#xff0c;就可能會涉及到緩存與數據庫雙存儲雙寫&#xff0c;你只要是雙寫&#xff0c;就一定會有數據一致性的問題&#xff0c;那么你如何解決一致性問題&#xff1f; 3、面試題剖析…

ROS與navigation教程——概述

navigation是ROS的二維導航功能包&#xff0c;簡單來說&#xff0c;就是根據輸入的里程計等傳感器的信息流和機器人的全局位置&#xff0c;通過導航算法&#xff0c;計算得出安全可靠的機器人速度控制指令。 代碼庫&#xff1a;https://github.com/ros-planning/navigation 代…

Linux下c開發 之 線程通信與pthread_cond_wait()的使用

pthread_cond_wait() /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock); pthread_cond_wait(&qready, &qlock);pthread_mutex_unlock(&qlock);/*****************************************************/The mutex passed …

ROS與navigation教程——ACML參數配置

<launch> <!--//后為wiki官網的參數說明 &#xff08;&#xff09;中為粗讀算法參數說明及理解 面臨的問題常用地圖有2種&#xff1a;1.基于特征&#xff0c;僅指明在指定位置&#xff08;地圖中包含的對象的位置&#xff09;的環境的形狀。特征表示使得調節對象的位置…

【設計模式】單例模式 Singleton Pattern

通常我們在寫程序的時候會碰到一個類只允許在整個系統中只存在一個實例&#xff08;Instance&#xff09; 的情況&#xff0c; 比如說我們想做一計數器&#xff0c;統計某些接口調用的次數&#xff0c;通常我們的數據庫連接也是只期望有一個實例。Windows系統的系統任務管理器…

修改輸入框placeholder的默認樣式

一般網頁中都用到input的placeholder屬性&#xff0c;想讓這個默認樣式和網頁保持一致&#xff0c;就需要重新設定樣式&#xff0c;百度百度&#xff1a; :-moz-placeholder { / color: #000; opacity:1; }支持/* Mozilla Firefox 4 to 18 * ::-moz-placeholder { color: #000;…

進程及線程通信總結

上文我們介紹了如何建立一個簡單的多線程程序&#xff0c;多線程之間不可避免的需要進行通信 。相比于進程間通信來說&#xff0c;線程間通信無疑是相對比較簡單的。 首先我們來看看最簡單的方法&#xff0c;那就是使用全局變量&#xff08;靜態變量也可以&#xff09;來進行通…

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系統&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1網絡配置 1.1路由器 設置無線路由器并連接兩臺計算機/機器人。為這兩臺計算機設置靜態IP地址。相互測試ping命令和ssh。 1.2主機 …

Docker入門

1. Docker簡介: docker是一個基于LXC的高級容器引擎。簡單地說&#xff0c;docker是一個輕量級的虛擬解決方案&#xff0c;或者說它是一個超輕量級的虛擬機&#xff08;容器&#xff09;。 Docker是一個開源的引擎&#xff0c;可以輕松的為任何應用創建一個輕量級的、可移植的、…

樂器庫的混合

每臺微機一個聲卡&#xff0c;也就是一片D/A&#xff0c;驅動按波特率、采樣位數、采樣通道傳輸給D/A&#xff0c;輸出模擬音頻。播放時僅一種與硬件支持格式對應&#xff0c;其他需驅動&#xff08;有損&#xff09;變換到硬件支持格式。每個應用都可單獨播放聲音&#xff0c;…

kafka認知--(1)

文檔參考&#xff1a;http://kafka.apache.org/documentation.html 下載代碼&#xff1a; tar -xzf kafka_2.11-0.11.0.0.tgz cd kafka_2.11-0.11.0.0 啟動 bin/zookeeper-server-start.sh config/zookeeper.properties 創建topic&#xff08;主題為test&#xff0c;只有一個分…

帶頭尾指針的list的C實現

一、緣起 很早寫了一個帶頭尾指針的list&#xff0c;該list支持從尾部插入元素&#xff0c;在任意位置刪除元素&#xff0c;最近用這個list時發現一個bug&#xff0c;修正了&#xff0c;并加了幾個接口函數。貼出來&#xff0c;希望對C的初學者有用。 二、基本說明 2.1、數據結…

Gmapping——從原理到實踐

概述 在SLAM中&#xff0c;機器人位姿和地圖都是狀態變量&#xff0c;我們需要同時對這兩個狀態變量進行估計&#xff0c;即機器人獲得一張環境地圖的同時確定自己相對于該地圖的位置。我們用x表示機器人狀態&#xff0c;m表示環境地圖&#xff0c;z表示傳感器觀測情況&#xf…

關于git分支

1.關于git分支 git的“分支”乍一聽是一個特別容易讓人產生錯覺的概念&#xff0c;以為它和樹枝一樣是分叉的枝節&#xff0c;其實Git中的分支本質上是個指向commit對象的指針,每次commit&#xff0c;git都把它們串成一條時間線&#xff0c;這條時間線就是一個分支。 2.直接切換…