數據庫表設計的原則攻略

創建數據庫裏最基本的應該就是建表,建索引、存儲過程等一系列操作了。談到表就不得不談到實體。

   一、數據實體

       什麼是實體,客觀存在並且可以相互區別的事物稱爲實體。這裏我們就簡單的把它理解爲一個表吧,描述實體的特性,我們就把他們稱爲了屬性。也可以說當我們把一個數據庫表當作一個實體,那麼它裏面的所有字段是不是就是一個屬性了呢?結果是肯定的。

   二、實體間的聯繫

      我想說的是,很簡單,數據庫裏表跟表間的關係莫過於三種:一對一;多對多;一對多。

      一對一其實就是說我們建的主表跟相關聯的表之間是一一對應的,比如說,我建了一個學生基本信息表:t_student,然後我又建了一個成績表,裏面有個外鍵,studentID,學生基本信息表裏的字段studentID和成績表裏的studentID就是一對一。

     一對多,也是類似,我另外建一個班級表,而每個班級有多個學生,每個學生就對應一個班級,對班級來說當然就是一對多了。

    多對多,我還舉這個例子,我建個選課表,可能有許多科目,每個科目有很多學生選,而每個學生又可以選擇多個科目。這就是多對多了。

   三、基本表的完整性

      (1) 原子性。基本表中的字段是不可再分解的。

    (2) 原始性。基本表中的記錄是原始數據(基礎數據)的記錄。

     (3) 演繹性。由基本表與代碼表中的數據,可以派生出所有的輸出數據。

    (4) 穩定性。基本表的結構是相對穩定的,表中的記錄是要長期保存的。

      這是基本表的完整性,也是它特有的。這裏我想說的是,在數據庫裏還有幾種表也是常用的那就是中間表和臨時表。

     1、中間表

        中間表是針對多對多關係的,就比如做公交查詢系統。裏面有兩個表,分別是車站表、線路表。這裏我們起個名字叫:t_busstation 、t_road,根據常識我們也知道,一個站有多個線路經過,而每個線路又有多個車站,怎麼才能將兩個表聯繫起來呢,如果是一對一,一對多,我們一個表,兩個表就可以將他們實現了,但是多對多呢,這樣我們就必須藉助中間表用來連接兩個表。一般中間表都是有一個本表的自增主鍵,還有另外兩個表的主鍵。中間表是沒有屬性的因爲它不是一個基本表。

    2、臨時表

       在本次項目中,我們就要用到臨時表,首先來看看什麼是臨時表吧。這是我從網上書上查到的。因爲我們用的是MS SQL Server 2000數據庫,而在這個數據庫裏是支持臨時表的。

      臨時表:其實就是那些以#號開頭爲名字的數據表,它主要是用來存放臨時數據的,當用戶斷開連接但沒有出去臨時表裏的數據時,系統會自動把臨時表裏的數據清空。這裏要說一點,臨時表是放在系統數據庫tempdb中的而不是當前數據庫

      臨時表總共是分兩種:本地臨時表和全局臨時表。

      (1)這裏我們需要了解的就是,在數據庫中本地臨時表是以一個#開頭的,這種臨時表只對當前的數據庫用戶可見,而其他的用戶是不可見的。當數據庫實例斷開後當然也就丟失了數據了,不管是顯式清空還是系統回收。   

       (2)還有一個就是全局臨時表。它是以“##”開頭的,而且是對於所有的用戶都是可見的,當你斷開數據庫實例連接時,只要還有別的系統項目在引用它,連着數據庫,那麼數據就存在,只有當別的系統也斷開連接時,系統纔會清除全局臨時表的數據。

   下面是建立臨時表的語句:

     本地臨時表:

    create table #student
   (
     studentID int ,
     studentName nvarchar (40),
     classID int
    )

    全局臨時表:

     create table ##student
   (
     studentID int ,
      studentName nvarchar (40).
      classID int
    )      

  這裏我們也可以用SQL語句完成:

  select * from employee into #student

 

現在就來看看三大範式。

   第一範式:如果每列(或者每個屬性)都是不可再分的最小數據單元(也稱爲最小的原子單元),則滿足第一範式.比如一個工人的基本信息表,裏面有工人的工號,性別,年齡,這些屬性都是不可分割的,所以這個表就符合了第一範式。

    第二範式: 就是在第一範式的基礎上延伸,使之表裏的每個字段都與主鍵發生關係。假如一個關係滿足第一範式,並且除了主鍵以外的其它字段,都依賴於該主鍵,則滿足第二範式.
   例如:訂單表(訂單編號、產品編號、定購日期、價格、……),"訂單編號"爲主鍵,"產品編號"和主鍵列沒有直接的關係,即"產品編號"列不依賴於主鍵列,這個列我們就可以把它刪除。

   第三範式:在第二範式的基礎上更進一步,也就是爲了實現表裏的列都與主鍵列直接相關,不是間接相關。這個我們可以用“Armstrong 公理”中的傳遞規則來推理。

   我們來看一下它的定義:

   設U是關係模式R 的屬性集,F 是R 上成立的只涉及U 中屬性的函數依賴集。若X→Y 和 Y→Z在R 上成立,則X →Z 在R 上成立。因此我們就來看在網上搜索到的例子:例如:訂單表(訂單編號,定購日期,顧客編號,顧客姓名,……),初看該表沒有問題,滿足第二範式,每列都和主鍵列"訂單編號"相關,再細看你會發現"顧客姓名"和"顧客編號"相關,"顧客編號"和"訂單編號"又相關,最後經過傳遞依賴,"顧客姓名"也和"訂單編號"相關。爲了滿足第三範式,應去掉"顧客姓名"列,放入客戶表中。

    這裏其實就是爲了說明數據庫的表裏步要出現冗餘,在顧客表裏已經有了"顧客姓名"了,而在訂單表裏就別出現了,而直接根據顧客編號相關聯就可以,否則造成資源浪費。

    以上就是三大範式。
    延伸:我們來看這三大範式:

           第一範式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;
      第二範式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
      第三範式:3NF是對字段冗餘性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗餘。

           其實在設計數據庫的時候我們最多的要遵循的就是第三範式,但是並不是越滿足第三範式數據庫就設計的越完美,這種錯誤是錯誤的。有時候增加點冗餘相反的會提高訪問速率,因此在實際的設計過程中應降低對範式的要求。

    以前對數據冗餘並不是很瞭解,在百度知道里的定義是這樣的:在一個數據集合中重複的數據稱爲數據冗餘. 但是不是說我們表的主鍵在其他表裏重複出現就是冗餘,這不是,而是爲了連接兩個表。只有非鍵字段就是既不是主鍵外鍵等約束的鍵如果重複出現,就會形成數據冗餘。數據冗餘也包括重複性冗餘和派生冗餘。比如工人表裏有"基本工資","獎金"兩列,然後還有一個"總工資"的列,這個總工資就是派生冗餘。低級的重複性冗餘一定要避免,杜絕,但是像派生冗餘還是提倡的因爲它能提高訪問的效率。

原文:http://blog.csdn.net/cjh200102/article/details/7011154

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章