熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java數據庫設計中的14個技巧

2022-06-13   來源: Java核心技術 

  下述十四個技巧是許多人在大量的數據庫分析與設計實踐中逐步總結出來的對於這些經驗的運用讀者不能生幫硬套死記硬背而要消化理解實事求是靈活掌握並逐步做到在應用中發展在發展中應用
原始單據與實體之間的關系
         可以是一對一一對多多對多的關系在一般情況下它們是一對一的關系即一張原始單據對應且只對應一個實體在特殊情況下它們可能是一對多或多對一的關系即一張原始單證對應多個實體或多張原始單證對應一個實體這裡的實體可以理解為基本表明確這種對應關系後對我們設計錄入界面大有好處
       〖例一份員工履歷資料在人力資源信息系統中就對應三個基本表員工基本情況表社會關系表工作簡歷表這就是一張原始單證對應多個實體的典型例子
主鍵與外鍵
         一般而言一個實體不能既無主鍵又無外鍵在E?R 圖中 處於葉子部位的實體 可以定義主鍵也可以不定義主鍵(因為它無子孫) 但必須要有外鍵(因為它有父親)
         主鍵與外鍵的設計在全局數據庫的設計中占有重要地位當全局數據庫的設計完成以後有個美國數據庫設計專家說到處都是鍵除了鍵之外什麼也沒有這就是他的數據庫設計經驗之談也反映了他對信息系統核心(數據模型)的高度抽象思想因為主鍵是實體的高度抽象主鍵與外鍵的配對表示實體之間的連接
基本表的性質
         基本表與中間表臨時表不同因為它具有如下四個特性
      () 原子性基本表中的字段是不可再分解的
      () 原始性基本表中的記錄是原始數據(基礎數據)的記錄
      () 演繹性由基本表與代碼表中的數據可以派生出所有的輸出數據
      () 穩定性基本表的結構是相對穩定的表中的記錄是要長期保存的
       理解基本表的性質後在設計數據庫時就能將基本表與中間表臨時表區分開來
范式標准
        基本表及其字段之間的關系 應盡量滿足第三范式但是滿足第三范式的數據庫設計往往不是最好的設計為了提高數據庫的運行效率常常需要降低范式標准適當增加冗余達到以空間換時間的目的       〖例有一張存放商品的基本表如表所示金額這個字段的存在表明該表的設計不滿足第三范式因為金額可以由單價乘以數量得到說明金額是冗余字段但是增加金額這個冗余字段可以提高查詢統計的速度這就是以空間換時間的作法          在Rose 規定列有兩種類型數據列和計算列金額這樣的列被稱為計算列單價數量這樣的列被稱為數據列
         表 商品表的表結構
    商品名稱 商品型號 單價 數量 金額
    電視機  
通俗地理解三個范式
         通俗地理解三個范式對於數據庫設計大有好處在數據庫設計中為了更好地應用三個范式就必須通俗地理解三個范式(通俗地理解是夠用的理解並不是最科學最准確的理解)
         第一范式NF是對屬性的原子性約束要求屬性具有原子性不可再分解
    第二范式NF是對記錄的惟一性約束要求記錄有惟一標識即實體的惟一性
    第三范式NF是對字段冗余性的約束即任何字段不能由其他字段派生出來它要求字段沒有冗余          沒有冗余的數據庫設計可以做到但是沒有冗余的數據庫未必是最好的數據庫有時為了提高運行效率就必須降低范式標准適當保留冗余數據具體做法是在概念數據模型設計時遵守第三范式降低范式標准的工作放到物理數據模型設計時考慮降低范式就是增加字段允許冗余
要善於識別與正確處理多對多的關系
             若兩個實體之間存在多對多的關系則應消除這種關系消除的辦法是在兩者之間增加第三個實體這樣原來一個多對多的關系現在變為兩個一對多的關系要將原來兩個實體的屬性合理地分配到三個實體中去這裡的第三個實體實質上是一個較復雜的關系它對應一張基本表一般來講數據庫設計工具不能識別多對多的關系但能處理多對多的關系

  〖例圖書館信息系統圖書是一個實體讀者也是一個實體這兩個實體之間的關系是一個典型的多對多關系一本圖書在不同時間可以被多個讀者借閱一個讀者又可以借多本圖書為此要在二者之間增加第三個實體該實體取名為借還書它的屬性為借還時間借還標志(表示借書表示還書)另外它還應該有兩個外鍵(圖書的主鍵讀者的主鍵)使它能與圖書讀者連接
     主鍵PK的取值方法
         PK是供程序員使用的表間連接工具可以是一無物理意義的數字串 由程序自動加來實現也可以是有物理意義的字段名或字段名的組合不過前者比後者好當PK是字段名的組合時建議字段的個數不要太多多了不但索引占用空間大而且速度也慢
正確認識數據冗余
         主鍵與外鍵在多表中的重復出現 不屬於數據冗余這個概念必須清楚事實上有許多人還不清楚非鍵字段的重復出現 才是數據冗余!而且是一種低級冗余即重復性的冗余高級冗余不是字段的重復出現而是字段的派生出現
       〖例商品中的單價數量金額三個字段金額就是由單價乘以數量派生出來的它就是冗余而且是一種高級冗余冗余的目的是為了提高處理速度只有低級冗余才會增加數據的不一致性因為同一數據可能從不同時間地點角色上多次錄入因此我們提倡高級冗余(派生性冗余)反對低級冗余(重復性冗余)
ER圖沒有標准答案
         信息系統的ER圖沒有標准答案因為它的設計與畫法不是惟一的只要它覆蓋了系統需求的業務范圍和功能內容就是可行的反之要修改ER圖盡管它沒有惟一的標准答案並不意味著可以隨意設計好的E?R圖的標准是結構清晰關聯簡潔實體個數適中屬性分配合理沒有低級冗余
視圖技術在數據庫設計中很有用
         與基本表代碼表中間表不同視圖是一種虛表它依賴數據源的實表而存在視圖是供程序員使用數據庫的一個窗口是基表數據綜合的一種形式 是數據處理的一種方法是用戶數據保密的一種手段為了進行復雜處理提高運算速度和節省存儲空間 視圖的定義深度一般不得超過三層 若三層視圖仍不夠用 則應在視圖上定義臨時表 在臨時表上再定義視圖這樣反復交迭定義 視圖的深度就不受限制了
       對於某些與國家政治經濟技術軍事和安全利益有關的信息系統視圖的作用更加重要這些系統的基本表完成物理設計之後立即在基本表上建立第一層視圖這層視圖的個數和結構與基本表的個數和結構是完全相同並且規定所有的程序員一律只准在視圖上操作只有數據庫管理員帶著多個人員共同掌握的安全鑰匙才能直接在基本表上操作請讀者想想這是為什麼?
中間表報表和臨時表
         中間表是存放統計數據的表它是為數據倉庫輸出報表或查詢結果而設計的有時它沒有主鍵與外鍵(數據倉庫除外)臨時表是程序員個人設計的存放臨時記錄為個人所用基表和中間表由DBA維護臨時表由程序員自己用程序自動維護
完整性約束表現在三個方面
         域的完整性用Check來實現約束在數據庫設計工具中對字段的取值范圍進行定義時有一個Check按鈕通過它定義字段的值城參照完整性用PKFK表級觸發器來實現用戶定義完整性它是一些業務規則用存儲過程和觸發器來實現
    防止數據庫設計打補丁的方法是三少原則
         () 一個數據庫中表的個數越少越好只有表的個數少了才能說明系統的ER圖少而精去掉了重復的多余的實體形成了對客觀世界的高度抽象進行了系統的數據集成防止了打補丁式的設計
          () 一個表中組合主鍵的字段個數越少越好因為主鍵的作用一是建主鍵索引二是做為子表的外鍵所以組合主鍵的字段個數少了不僅節省了運行時間而且節省了索引存儲空間

  () 一個表中的字段個數越少越好只有字段的個數少了才能說明在系統中不存在數據重復且很少有數據冗余更重要的是督促讀者學會列變行這樣就防止了將子表中的字段拉入到主表中去在主表中留下許多空余的字段所謂列變行就是將主表中的一部分內容拉出去另外單獨建一個子表這個方法很簡單有的人就是不習慣不采納不執行
         數據庫設計的實用原則是在數據冗余和處理速度之間找到合適的平衡點三少是一個整體概念綜合觀點不能孤立某一個原則該原則是相對的不是絕對的三多原則肯定是錯誤的試想若覆蓋系統同樣的功能一百個實體(共一千個屬性) 的ER圖肯定比二百個實體(共二千個屬性) 的ER圖要好得多
         提倡三少原則是叫讀者學會利用數據庫設計技術進行系統的數據集成數據集成的步驟是將文件系統集成為應用數據庫將應用數據庫集成為主題數據庫將主題數據庫集成為全局綜合數據庫集成的程度越高數據共享性就越強信息孤島現象就越少整個企業信息系統的全局E?R圖中實體的個數主鍵的個數屬性的個數就會越少
         提倡三少原則的目的是防止讀者利用打補丁技術不斷地對數據庫進行增刪改使企業數據庫變成了隨意設計數據庫表的垃圾堆或數據庫表的大雜院最後造成數據庫中的基本表代碼表中間表臨時表雜亂無章不計其數導致企事業單位的信息系統無法維護而癱瘓
         三多原則任何人都可以做到該原則是打補丁方法設計數據庫的歪理學說三少原則是少而精的原則它要求有較高的數據庫設計技巧與藝術不是任何人都能做到的因為該原則是杜絕用打補丁方法設計數據庫的理論依據
  提高數據庫運行效率的辦法
         在給定的系統硬件和系統軟件條件下提高數據庫系統的運行效率的辦法是
              () 在數據庫物理設計時降低范式增加冗余 少用觸發器 多用存儲過程
              () 當計算非常復雜而且記錄條數非常巨大時(例如一千萬條)復雜計算要先在數據庫外面以文件系統方式用C++語言計算處理完成之後最後才入庫追加到表中去這是電信計費系統設計的經驗
        () 發現某個表的記錄太多例如超過一千萬條則要對該表進行水平分割水平分割的做法是以該表主鍵PK的某個值為界線將該表的記錄水平分割為兩個表若發現某個表的字段太多例如超過八十個則垂直分割該表將原來的一個表分解為兩個表
        () 對數據庫管理系統DBMS進行系統優化即優化各種系統參數如緩沖區個數
        () 在使用面向數據的SQL語言進行程序設計時盡量采取優化算法
        總之要提高數據庫的運行效率必須從數據庫系統級優化數據庫設計級優化程序實現級優化這三個層次上同時下功夫


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26858.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.