數據庫範式
cpp軟件架構獅
2018-12-08
為什麼要用範式
我們在學習關係型數據庫的時候一定有感覺,關係數據庫不就是一個二維表格嗎,那麼數據庫有什麼用?
數據庫看上去像一個表格,其實不然,比如如下的訂單表,一個訂單號X2001對應一個用戶,但是還對應了兩行產品,非常不規範。
要想把這個表規範化,可以使用範式。引入範式的主要目的在於:解決冗餘的問題
第一範式
那麼如何規範化呢?可以拆分成兩個表格。
一個是訂單表
一個訂單號可以唯一的確定一行
一個是細節表,一個訂單號+產品編碼才可以唯一的確定一行。
拆分以後就可以保證一個單元格只有一個值了
所以我們說訂單表的主鍵是 (訂單號), 細節表的主鍵是(訂單號,產品編碼), 這是一個複合主鍵
第二範式
再看看訂單細節表, 產品名稱和單價 實際上並不依賴於 訂單號。
如果想添加一個新的產品, 你會發現沒法放入這張表, 因為沒有訂單號!
所以還需要再次拆分。
拆分以後,表4.1訂單細節表的主鍵還是(訂單號,產品編碼),但是剩下的屬性(數量)肯定是完全依賴於主鍵的。
表4.2產品表也類似,主鍵是產品編碼,剩下的屬性都依賴於產品編碼
所有屬性都依賴於主鍵的情況就是第二範式
第三範式
我們再回過頭來看一下表格3 訂單表,它的主鍵是訂單號,所有的屬性都依賴於主鍵,已經是第二範式。 但是我們發現,訂單號能決定用戶ID,用戶ID能決定用戶名稱,這就出現了依賴傳遞:訂單號->用戶ID->用戶名稱
那麼可以再拆分
沒有傳遞依賴了, 我們可以稱之為 第三範式
為了滿足範式要求,需要把一張大表拆分開,到時候查詢豈不是非常麻煩?是的,需要將這些表Join起來,如果數據量大的時候,連接非常耗時。有時我們需要違反範式,做點數據冗餘。
總結
總結一下:
- 第一範式:字段是不可再分的,也就是不存在一個字段中存在兩個及以上值的情況。
- 第二範式:所有屬性都依賴於主鍵,其他不相關的都拆分出去了。
- 第三範式:不存在某個列不依賴於非主鍵的列,沒有依賴傳遞了
參考
主要改編自張大胖學數據庫
相關推薦
'一文看懂oracle數據庫監控ASM磁盤組IO吞吐量教程'
"概述監控ASM磁盤組IO吞吐量是管理ASM的基礎功能,今天主要分享通過asmiostat.sh腳本和asmcmd iostat命令監控ASM磁盤組IO吞吐量,它類似於大部分Unix操作系統提供的iostat命令。一、Oracle 11gR2 Database之前的版本使用...
'“一個號碼”“一個平臺”“一套標準”“一個數據庫”8890平臺成企業群眾訴求主渠道'
"8890綜合服務平臺是推進“互聯網+政務服務”、建設一體化在線政務服務平臺的重要內容之一,今年以來,以“一個號碼”“一個平臺”“一套標準”“一個數據庫”為目標,全省8890正在成為企業群眾訴求主渠道。截至目前,省、市平臺共受理各類群眾訴求176.9萬件,辦結反饋率為89%...
'汽車銷售業者數據庫門戶大開,1.98億筆潛在車主資料曝光'
"Security Discovery本週揭露一起大規模的資料外洩事件,該公司的安全研究人員Jeremiah Fowler今年8月中,在網絡上發現了一個完全沒有密碼保護的ElasticSearch數據庫,當中存放了413GB的資料,涉及大量網站與1.98億名使用者的資料,追...
'SQLite,多個應用程序可以同時訪問單個數據庫文件嗎?'
"多個進程可以同時打開同一個數據庫。多個進程可以同時執行SELECT。但是,只有一個進程可以隨時對數據庫進行更改。SQLite使用讀/寫鎖來控制對數據庫的訪問。(在Win95 / 98 / ME下,缺少對讀寫鎖的支持,而是使用概率模擬。)但請注意:如果數據庫文件保存在NFS...
'簡單易用高性能的時序數據庫 pinusdb'
"松果時序數據庫(pinusdb)松果時序數據庫是一個開源的時間序列數據庫。以簡單、易用、高性能為目標,解決中小規模物聯網場景設備數據存儲,查詢。 松果時序數據庫服務僅包含大約3萬行C++代碼,雖然代碼量少但也提供了豐富的功能、較高的性能。性能在i3-7100, 8G 內存...
'Python Requests作者另一神作,Records通用而優雅的數據庫訪問庫'
"我們在開發過程中經常涉及與數據庫進行交互,比如MySQL、Oracle、PostgreSQL、Sqlite,一般,我們使用其對應的Python 第三方模塊,實現相關數據庫操作,如下MySQL數據庫:mysql-connector,pymysql PostgreSQL數據庫...
'易語言實用例程1:簡單的數據庫網絡操作(C/S架構)---上篇'
"學了十多年的易語言,現在已全面轉向.net(原因就不說了),但與易語言十多年感情是丟不掉的。作為引導我步入編程大門的啟蒙語言,我覺得是非常適合國人當做入門語言,當你學會易語言並能寫出一些功能程序後,再轉而學習其它更先進的語言,你會覺沒有想像中的那麼難,java、C#、PH...
推薦中...