MySQL數據分析-(6)數據庫設計之規範化

你們好,我是jacky,很高興繼續跟你們學習MySQL數據分析這門課,上次課咱們介紹了E-R圖,咱們要給手機銷售公司設計數據庫,那麼同一個項目,10個設計人員可能設計出10種不一樣的E-R圖;由於不一樣的設計人員會從不一樣的角度,標識出不一樣的實體,而每一個實體又包含不一樣的屬性,天然設計出的下E-R圖也就不一樣了;
正是由於有這個緣由,因此咱們天然就要想辦法找出一個E-R圖設計優劣或者說好壞的標準,你們說是否是,有了這個標準,咱們才能找出最優的設計數據庫的方案,那麼,這個標準就是數據的三大範式;
這裏,我估計確定會有朋友抱怨了,說jacky,你講的太理論了,必定不實操啊,彆着急,jacky從這節課開始就給你們用SQL語句來舉例,而且經過對數據庫設計三大範式的講解,咱們才能更好的理解SQL語句背後的含義,jacky的課程不會向其餘課程同樣,只告訴你SQL語句是什麼,我必定要告訴你SQL語句爲何要這樣來寫,好,言歸正傳,開始咱們三大範式的講解;mysql

(一)模擬建立數據庫

1.如何處理數據冗餘

好,在沒有教授SQL語句以前,咱們還不知道怎樣用SQL語句在數據庫中建立表,咱們如今文件夾中,用excel這個二維表來模擬這個過程;sql

  • 第一步,咱們建立一個命名爲手機銷售公司數據庫的文件夾,這個數據庫裏是否是能夠放不少表,是吧,咱們先放一個員工表,能夠吧,記錄和存儲這家公司的員工信息;

數據分析-jacky

  • 咱們看這張表有什麼問題?數據庫

    • 咱們發如今部門這列,有4條記錄都出現了「開發部」,在數據庫裏,咱們把數據重複的現象叫作「數據冗餘」,由於存在重複的數據,咱們就有必要簡化;
  • 下面的問題是:咱們該怎樣把重複的數據作簡化呢,咱們經常使用的方法是分類存儲,好,對於上面的員工表,咱們拆分紅兩張表,員工表以外,咱們在建立一張部門編碼表;服務器

好,經過這樣拆分表的方法,咱們就解決了數據重複冗繁的問題;
上面,將咱們講的知識理論化,就是數據庫設計的第一範式(1NF):若是二維表中有的列包含多種信息,咱們能夠把它抽取出來成爲一個單獨的表;markdown

2.如何保證數據能夠快速查找數據

2.1 問題的提出

咱們之因此要建立數據庫,就是由於能夠方便咱們隨時調用數據庫中的數據庫,那麼,在咱們實際工做中,數據庫中的數據網網都是海量的,拿咱們上面那個用戶表,如何表中的姓名列,咱們的數據是海量的,好比說有十幾萬表,或幾百萬條,咱們要篩選出jacky這個姓名,咱們在Excel中,是否是使用查找,是吧,若是電腦配置不夠高,咱們用查找仍是比較卡的;那麼在數據庫中,咱們SQL語句中where來查找,速度也是比較慢的;這裏jacky還沒開始教你們用SQL語句呢,是吧,這裏我用SQL語句給你們演示一下這個過程,你們能看懂,就看懂,看不懂不要緊,下面的課程都是圍繞SQL語句來說的,今天就是給你們一個預熱和印象;數據庫設計

2.2 SQL語句預熱和演示

好,下面jacky就跟你們演示怎樣查詢才能提供數據的查詢效率和速度,而後引出主鍵的概念,最後給你們總結數據庫第二範式和第三範式;學習

#1.打開MySQL客戶端
#1.1 鏈接服務器
sudo /usr/local/mysql/support-files/mysql.server start #1.2 鏈接MySQL客戶端 mysql -u root -p #2.建立使用數據庫 use test;

#3.建立表
create table staff( nid int not null auto_increment, name char(10), index(nid));

#4.向建立的表中插入數據
insert into staff(name)values('jacky');

#5.查看新建立表中的數據
select * from staff;

#6.查找name列中jacky的字段
#6.1 不經過主鍵查找;
select * from staff where name='jacky';
#6.2 經過主鍵查找;
select * from staff where nid=1;
  • 經過上面的這段代碼,在沒講SQL 之間,jacky只想告訴你們用where name=’jacky’來在海量數據中查詢數據是沒有效率的,因此在數據庫設計時,就會設置主鍵,也就是nid列,下面jacky就跟你們總價下主鍵是什麼;

(二)主鍵,咱們不同

好,如今jacky跟你們總結一下主鍵,你們能夠思考一下:若是在表中存儲了不少行數據,就會引起這樣的問題:如何判斷表中沒有重複的數據行?如何判斷一個員工的信息沒有被輸入兩次?
這時就須要這樣一個列,這個列的值用來惟一標識表中的每一行,這樣的列就是主鍵;
主鍵就是主要的鍵,一張表只能有一個主鍵,是惟一的,不能重複不能爲空(null),通常狀況下會將自增列設置爲主鍵;編碼

  • 下面jacky給有基礎的同窗一個引伸吧,就是主鍵和惟一列的區別,零基礎的朋友能夠略過,後面的課程咱們還會提到spa

  • 這裏主鍵要跟惟一列區別,惟一能夠爲null,對於惟一列,一張表能夠有多個;主鍵和惟一列都叫索引,雖然有不少不少的約束,可是它們的好處特別明顯,就是查找速度特別特別的快;設計

下面這張表,好比說這張表是海量數據,若是咱們查找jacky這個字段,咱們用name=jacky來查找,可能須要幾秒鐘;可是查詢nid=2,可能咱們用0.00000秒就能查詢到;

nid name address
1 andy
2 jacky
3 lucky
  • 總結主鍵和惟一列的兩大功能:

    • (1)約束;

    • (2)索引

      • 加速查找

(三)三範式總結

3.1 第一範式(1NF)

  • 數據庫的列不可分割,若是有的列包含多種信息,能夠把它抽取出來成爲一個單獨的表;

3.2 第二範式(2NF)

  • 數據表中的每一行,都應該有惟一的標識,即每一行都應有主鍵區分

3.3 第三範式(3NF)

  • 數據表中的全部非關鍵字段,必須依賴於主鍵

3.4 三範式的核心邏輯

  • 數據庫的核心思想

    • 爲了數據的存儲
  • 三範式的核心思想

    • 不要出現冗餘數據(用最少的空間存儲最多的信息),第二範式是避免了冗餘行的出現,第三範式是避免了冗餘列的出現;
相關文章
相關標籤/搜索