qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          數(shù)據(jù)庫范式設(shè)計

           在軟件開發(fā)過程中,數(shù)據(jù)庫的設(shè)計是非常重要的。可以說,良好的數(shù)據(jù)庫設(shè)計,是對用戶需求的理解的精準定位。它不僅能夠使得軟件開發(fā)起來非常便捷,而且還能夠使軟件系統(tǒng)高效運行,同時,為日后的維護或者更換數(shù)據(jù)庫提供便利。

            在最近開發(fā)系統(tǒng)的過程中,感覺收獲最大的也是關(guān)于數(shù)據(jù)庫的操作。最初開發(fā)機房收費系統(tǒng)的時候,由于沒有經(jīng)驗,而且懂得的知識也非常少,數(shù)據(jù)庫的設(shè)計根本談不上,就是感覺到數(shù)據(jù)庫中缺少某些字段的時候,直接在數(shù)據(jù)庫表中去修改字段。這樣就為自己徒增了很多工作量,相關(guān)的代碼需要一處一處去修改。

            開發(fā).NET版機房收費系統(tǒng)的數(shù)據(jù)庫設(shè)計明顯好多了,由于充分了解了需求,數(shù)據(jù)庫設(shè)計當然比上一次好上很多。不過回頭去看,數(shù)據(jù)庫的設(shè)計還是存在很多的缺陷。表中仍然存在著大量的冗余字段,增刪改后也會出現(xiàn)發(fā)生一些異常。

            在牛腩新聞發(fā)布系統(tǒng)中,由于系統(tǒng)非常小,對于數(shù)據(jù)庫的操作也就那兩下子,復(fù)雜也到不了哪里去。不過盡管如此,感覺牛老師的數(shù)據(jù)庫設(shè)計還是非常規(guī)范的。類別、評論、新聞分別放在三個表中,完全沒有冗余數(shù)據(jù)。

            廢話太多了,開始步入正題了。良好的設(shè)計能夠使程序員的工作事半功倍。

            首先,先來看官方解釋:

            第一范式是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項,同一列中不能有多個值,即是實體的某個屬性不能有多個值或者不能有重復(fù)的屬性。

            第二范式是指數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依賴。

            第三范式數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的傳遞函數(shù)依賴。

            簡單來說,第一范式是講數(shù)據(jù)庫表中數(shù)據(jù)的原子性,數(shù)據(jù)不可再分,只要是關(guān)系型數(shù)據(jù)庫都必須首先滿足第一范式。看下圖例子:圖1中三個字段不可再分,故滿足第一范式;圖2將專業(yè)、年級、班級三個字段放在一個字段里面,就不符合第一范式了。

                    

            下面再來看機房收費系統(tǒng)中的一個表設(shè)計——學生基本數(shù)據(jù)表。

          圖A

            圖A中由于每一個字段都不可再分,故它是滿足第一范式的。然而這樣的設(shè)計就會產(chǎn)生大量的冗余字段。如果一個學生注冊兩個卡,那么該學生的信息就需要重復(fù)兩次。

            第二范式就解決了上述問題。它強調(diào)其屬性必須完全依賴主鍵,實體的屬性不能僅僅依賴主關(guān)鍵字的一部分屬性。如果存在部分依賴關(guān)系,那么這個屬性和主關(guān)鍵字相應(yīng)部分應(yīng)該分離出來形成一個新的實體,實體與原始體之間是一對多的關(guān)系。

            像上面例子中,很顯然主鍵是卡號和學號聯(lián)合做主鍵,其中姓名、性別、系別、專業(yè)、年級、班級都只與學號有關(guān),只依賴學號,而不依賴卡號,這樣就不符合第二范式了。

            我們的根據(jù)第二范式的要求,將其與學生相關(guān)的信息分離出來,修改后,我們可得一下兩個表:

          圖B

            然而,僅僅滿足第二范式的數(shù)據(jù)庫是遠遠不夠的,滿足第二范式,仍然可能會出現(xiàn)傳遞依賴。圖B學生表中系別與專業(yè)存在傳遞關(guān)系。假如小紅和小明的系別都是數(shù)信學院,專業(yè)都是數(shù)學專業(yè),那么這樣數(shù)據(jù)庫中系別就重復(fù)了兩次,增加了冗余字段。

           第三范式保證了同一類事物分在一個表中,消除了傳遞依賴的現(xiàn)象。我們再根據(jù)第三范式的設(shè)計要求,將其學生表在進行分離,得到下面的表:

          圖C

            下面給出圖C的數(shù)據(jù)庫關(guān)系圖:

            好的數(shù)據(jù)庫設(shè)計,是軟件開發(fā)中非常重要的一步。三范式設(shè)計只是一個標準,對于基本表的設(shè)計,建議大家盡量按照三范式的要求進行設(shè)計;而對于臨時表的設(shè)計,我們可以適量的增加一些冗余字段,畢竟單一表的查詢檢索速度比較快,提高了系統(tǒng)性能。

          posted on 2012-04-26 09:34 順其自然EVO 閱讀(216) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 太和县| 城市| 图们市| 那曲县| 安溪县| 青田县| 阳曲县| 宕昌县| 宁都县| 洛川县| 中阳县| 南阳市| 荃湾区| 温州市| 文登市| 洛川县| 石棉县| 江华| 太康县| 庄河市| 湾仔区| 祁门县| 商城县| 皋兰县| 黄平县| 贡嘎县| 合山市| 武安市| 同心县| 铜川市| 吉安县| 双鸭山市| 萍乡市| 通州区| 平塘县| 昌图县| 潼关县| 怀柔区| 利津县| 景泰县| 汾阳市|