數據庫設計方法、規範與技巧 1

一、數據庫設計過程
數據庫技術是信息資源管理最有效的手段。數據庫設計是指對於一個給定的應用環境,構造最優的數據庫模式,建立數據庫及其應用系統,有效存儲數據,滿足用戶信息要求和處理要求。
數 
據庫設計中需求分析階段綜合各個用戶的應用需求(現實世界的需求),在概念設計階段形成獨立於機器特點、獨立於各個DBMS產品的概念模式(信息世界模 
型),用E-R圖來描述。在邏輯設計階段將E-R圖轉換成具體的數據庫產品支持的數據模型如關係模型,形成數據庫邏輯模式。然後根據用戶處理的要求,安全 
性的考慮,在基本表的基礎上再建立必要的視圖(VIEW)形成數據的外模式。在物理設計階段根據DBMS特點和處理的需要,進行物理存儲安排,設計索引, 
形成數據庫內模式。
1. 需求分析階段 
需求收集和分析,結果得到數據字典描述的數據需求(和數據流圖描述的處理需求)。 
需求分析的重點是調查、收集與分析用戶在數據管理中的信息要求、處理要求、安全性與完整性要求。
需求分析的方法:調查組織機構情況、調查各部門的業務活動情況、協助用戶明確對新系統的各種要求、確定新系統的邊界。 
常用的調查方法有: 跟班作業、開調查會、請專人介紹、詢問、設計調查表請用戶填寫、查閱記錄。
分析和表達用戶需求的方法主要包括自頂向下和自底向上兩類方法。自頂向下的結構化分析方法(Structured Analysis,簡稱SA方法)從最上層的系統組織機構入手,採用逐層分解的方式分析系統,並把每一層用數據流圖和數據字典描述。
數據流圖表達了數據和處理過程的關係。系統中的數據則藉助數據字典(Data Dictionary,簡稱DD)來描述。
數據字典是各類數據描述的集合,它是關於數據庫中數據的描述,即元數據,而不是數據本身。數據字典通常包括數據項、數據結構、數據流、數據存儲和處理過程五個部分(至少應該包含每個字段的數據類型和在每個表內的主外鍵)。
數據項描述={數據項名,數據項含義說明,別名,數據類型,長度, 
         取值範圍,取值含義,與其他數據項的邏輯關係} 
數據結構描述={數據結構名,含義說明,組成:{數據項或數據結構}} 
數據流描述={數據流名,說明,數據流來源,數據流去向, 
         組成:{數據結構},平均流量,高峯期流量} 
數據存儲描述={數據存儲名,說明,編號,流入的數據流,流出的數據流,   
        組成:{數據結構},數據量,存取方式} 
處理過程描述={處理過程名,說明,輸入:{數據流},輸出:{數據流}, 
          處理:{簡要說明}} 
2. 概念結構設計階段 
通過對用戶需求進行綜合、歸納與抽象,形成一個獨立於具體DBMS的概念模型,可以用E-R圖表示。 
概念模型用於信息世界的建模。概念模型不依賴於某一個DBMS支持的數據模型。概念模型可以轉換爲計算機上某一DBMS支持的特定數據模型。 
概念模型特點:
(1) 具有較強的語義表達能力,能夠方便、直接地表達應用中的各種語義知識。 
(2) 應該簡單、清晰、易於用戶理解,是用戶與數據庫設計人員之間進行交流的語言。
概念模型設計的一種常用方法爲IDEF1X方法,它就是把實體-聯繫方法應用到語義數據模型中的一種語義模型化技術,用於建立系統信息模型。
    使用IDEF1X方法創建E-R模型的步驟如下所示:
2.1 第零步——初始化工程
這個階段的任務是從目的描述和範圍描述開始,確定建模目標,開發建模計劃,組織建模隊伍,收集源材料,制定約束和規範。收集源材料是這階段的重點。通過調查和觀察結果,業務流程,原有系統的輸入輸出,各種報表,收集原始數據,形成了基本數據資料表。
2.2 第一步——定義實體
實 
體集成員都有一個共同的特徵和屬性集,可以從收集的源材料——基本數據資料表中直接或間接標識出大部分實體。根據源材料名字表中表示物的術語以及具有“代 
碼”結尾的術語,如客戶代碼、代理商代碼、產品代碼等將其名詞部分代表的實體標識出來,從而初步找出潛在的實體,形成初步實體表。
2.3 第二步——定義聯繫
IDEF1X 
模型中只允許二元聯繫,n元聯繫必須定義爲n個二元聯繫。根據實際的業務需求和規則,使用實體聯繫矩陣來標識實體間的二元關係,然後根據實際情況確定出連 
接關係的勢、關係名和說明,確定關係類型,是標識關係、非標識關係(強制的或可選的)還是非確定關係、分類關係。如果子實體的每個實例都需要通過和父實體 
的關係來標識,則爲標識關係,否則爲非標識關係。非標識關係中,如果每個子實體的實例都與而且只與一個父實體關聯,則爲強制的,否則爲非強制的。如果父實 
體與子實體代表的是同一現實對象,那麼它們爲分類關係。
2.4 第三步——定義碼
通過引入交叉實體除去上一階段產生的非確定關係,然後從 
非交叉實體和獨立實體開始標識侯選碼屬性,以便唯一識別每個實體的實例,再從侯選碼中確定主碼。爲了確定主碼和關係的有效性,通過非空規則和非多值規則來 
保證,即一個實體實例的一個屬性不能是空值,也不能在同一個時刻有一個以上的值。找出誤認的確定關係,將實體進一步分解,最後構造出IDEF1X模型的鍵 
基視圖(KB圖)。
2.5 第四步——定義屬性
從源數據表中抽取說明性的名詞開發出屬性表,確定屬性的所有者。定義非主碼屬性,檢查屬性 
的非空及非多值規則。此外,還要檢查完全依賴函數規則和非傳遞依賴規則,保證一個非主碼屬性必須依賴於主碼、整個主碼、僅僅是主碼。以此得到了至少符合關 
系理論第三範式的改進的IDEF1X模型的全屬性視圖。
2.6 第五步——定義其他對象和規則
    定義屬性的數據類型、長度、精度、非空、缺省值、約束規則等。定義觸發器、存儲過程、視圖、角色、同義詞、序列等對象信息。
3. 邏輯結構設計階段 
    將概念結構轉換爲某個DBMS所支持的數據模型(例如關係模型),並對其進行優化。設計邏輯結構應該選擇最適於描述與表達相應概念結構的數據模型,然後選擇最合適的DBMS。
將E-R圖轉換爲關係模型實際上就是要將實體、實體的屬性和實體之間的聯繫轉化爲關係模式,這種轉換一般遵循如下原則: 
1)一個實體型轉換爲一個關係模式。實體的屬性就是關係的屬性。實體的碼就是關係的碼。 
2)一個m:n聯繫轉換爲一個關係模式。與該聯繫相連的各實體的碼以及聯繫本身的屬性均轉換爲關係的屬性。而關係的碼爲各實體碼的組合。 
3)一個1:n聯繫可以轉換爲一個獨立的關係模式,也可以與n端對應的關係模式合併。如果轉換爲一個獨立的關係模式,則與該聯繫相連的各實體的碼以及聯繫本身的屬性均轉換爲關係的屬性,而關係的碼爲n端實體的碼。 
4)一個1:1聯繫可以轉換爲一個獨立的關係模式,也可以與任意一端對應的關係模式合併。
5)三個或三個以上實體間的一個多元聯繫轉換爲一個關係模式。與該多元聯繫相連的各實體的碼以及聯繫本身的屬性均轉換爲關係的屬性。而關係的碼爲各實體碼的組合。  
6)同一實體集的實體間的聯繫,即自聯繫,也可按上述1:1、1:n和m:n三種情況分別處理。 
7)具有相同碼的關係模式可合併。 
爲了進一步提高數據庫應用系統的性能,通常以規範化理論爲指導,還應該適當地修改、調整數據模型的結構,這就是數據模型的優化。確定數據依賴。消除冗餘的聯繫。確定各關係模式分別屬於第幾範式。確定是否要對它們進行合併或分解。一般來說將關係分解爲3NF的標準,即:
表內的每一個值都只能被表達一次。
•?表內的每一行都應該被唯一的標識(有唯一鍵)。
表內不應該存儲依賴於其他鍵的非鍵信息。   
4. 數據庫物理設計階段 
爲邏輯數據模型選取一個最適合應用環境的物理結構(包括存儲結構和存取方法)。根據DBMS特點和處理的需要,進行物理存儲安排,設計索引,形成數據庫內模式。
5. 數據庫實施階段 
運 
用DBMS提供的數據語言(例如SQL)及其宿主語言(例如C),根據邏輯設計和物理設計的結果建立數據庫,編制與調試應用程序,組織數據入庫,並進行試 
運行。 數據庫實施主要包括以下工作:用DDL定義數據庫結構、組織數據入庫 、編制與調試應用程序、數據庫試運行  
6. 數據庫運行和維護階段 
數據庫應用系統經過試運行後即可投入正式運行。在數據庫系統運行過程中必須不斷地對其進行評價、調整與修改。包括:數據庫的轉儲和恢復、數據庫的安全性、完整性控制、數據庫性能的監督、分析和改進、數據庫的重組織和重構造。

建模工具的使用
爲加快數據庫設計速度,目前有很多數據庫輔助工具(CASE工具),如Rational公司的Rational Rose,CA公司的Erwin和Bpwin,Sybase公司的PowerDesigner以及Oracle公司的Oracle Designer等。
ERwin 
主要用來建立數據庫的概念模型和物理模型。它能用圖形化的方式,描述出實體、聯繫及實體的屬性。ERwin支持IDEF1X方法。通過使用ERwin建模 
工具自動生成、更改和分析IDEF1X模型,不僅能得到優秀的業務功能和數據需求模型,而且可以實現從IDEF1X模型到數據庫物理設計的轉變。 
ERwin工具繪製的模型對應於邏輯模型和物理模型兩種。在邏輯模型中,IDEF1X工具箱可以方便地用圖形化的方式構建和繪製實體聯繫及實體的屬性。在 
物理模型中,ERwin可以定義對應的表、列,並可針對各種數據庫管理系統自動轉換爲適當的類型。
設計人員可根據需要選用相應的數據庫設計建模工具。例如需求分析完成之後,設計人員可以使用Erwin畫ER圖,將ER圖轉換爲關係數據模型,生成數據庫結構;畫數據流圖,生成應用程序。
二、數據庫設計技巧
1. 設計數據庫之前(需求分析階段)
1) 理解客戶需求,詢問用戶如何看待未來需求變化。讓客戶解釋其需求,而且隨着開發的繼續,還要經常詢問客戶保證其需求仍然在開發的目的之中。
2) 瞭解企業業務可以在以後的開發階段節約大量的時間。
3) 重視輸入輸出。
在定義數據庫表和字段需求(輸入)時,首先應檢查現有的或者已經設計出的報表、查詢和視圖(輸出)以決定爲了支持這些輸出哪些是必要的表和字段。
舉例:假如客戶需要一個報表按照郵政編碼排序、分段和求和,你要保證其中包括了單獨的郵政編碼字段而不要把郵政編碼糅進地址字段裏。
4) 創建數據字典和ER 圖表
ER 圖表和數據字典可以讓任何瞭解數據庫的人都明確如何從數據庫中獲得數據。ER圖對錶明表之間關係很有用,而數據字典則說明了每個字段的用途以及任何可能存在的別名。對SQL 表達式的文檔化來說這是完全必要的。
5) 定義標準的對象命名規範
數據庫各種對象的命名必須規範。
2. 表和字段的設計(數據庫邏輯設計)
表設計原則
1) 標準化和規範化
數 
據的標準化有助於消除數據庫中的數據冗餘。標準化有好幾種形式,但Third Normal Form(3NF)通常被認爲在性能、擴展性和數據完整性方 
面達到了最好平衡。簡單來說,遵守3NF 標準的數據庫的表設計原則是:“One Fact in One Place”即某個表只包括其本身基本的屬 
性,當不是它們本身所具有的屬性時需進行分解。表之間的關係通過外鍵相連接。它具有以下特點:有一組表專門存放通過鍵連接起來的關聯數據。
舉例:某個存放客戶及其有關定單的3NF 數據庫就可能有兩個表:Customer 和Order。Order 表不包含定單關聯客戶的任何信息,但表內會存放一個鍵值,該鍵指向Customer 表裏包含該客戶信息的那一行。
事實上,爲了效率的緣故,對錶不進行標準化有時也是必要的。
2) 數據驅動
採用數據驅動而非硬編碼的方式,許多策略變更和維護都會方便得多,大大增強系統的靈活性和擴展性。
舉 
例,假如用戶界面要訪問外部數據源(文件、XML 文檔、其他數據庫等),不妨把相應的連接和路徑信息存儲在用戶界面支持表裏。還有,如果用戶界面執行工 
作流之類的任務(發送郵件、打印信箋、修改記錄狀態等),那麼產生工作流的數據也可以存放在數據庫裏。角色權限管理也可以通過數據驅動來完成。事實上,如 
果過程是數據驅動的,你就可以把相當大的責任推給用戶,由用戶來維護自己的工作流過程。
3) 考慮各種變化
在設計數據庫的時候考慮到哪些數據字段將來可能會發生變更。
舉例,姓氏就是如此(注意是西方人的姓氏,比如女性結婚後從夫姓等)。所以,在建立系統存儲客戶信息時,在單獨的一個數據表裏存儲姓氏字段,而且還附加起始日和終止日等字段,這樣就可以跟蹤這一數據條目的變化。

字段設計原則
4) 每個表中都應該添加的3 個有用的字段
•?dRecordCreationDate,在VB 下默認是Now(),而在SQL Server 下默認爲GETDATE()
•?sRecordCreator,在SQL Server 下默認爲NOT NULL DEFAULT USER
•?nRecordVersion,記錄的版本標記;有助於準確說明記錄中出現null 數據或者丟失數據的原因
5) 對地址和電話採用多個字段
描述街道地址就短短一行記錄是不夠的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的靈活性。還有,電話號碼和郵件地址最好擁有自己的數據表,其間具有自身的類型和標記類別。
6) 使用角色實體定義屬於某類別的列
在需要對屬於特定類別或者具有特定角色的事物做定義時,可以用角色實體來創建特定的時間關聯關係,從而可以實現自我文檔化。
舉 
例:用PERSON 實體和PERSON_TYPE 實體來描述人員。比方說,當John Smith, Engineer 提升爲 
John Smith, Director 乃至最後爬到John Smith, CIO 的高位,而所有你要做的不過是改變兩個表PERSON 和 
PERSON_TYPE 之間關係的鍵值,同時增加一個日期/時間字段來知道變化是何時發生的。這樣,你的PERSON_TYPE 表就包含了所有 
PERSON 的可能類型,比如Associate、Engineer、Director、CIO 或者CEO 等。還有個替代辦法就是改變 
PERSON 記錄來反映新頭銜的變化,不過這樣一來在時間上無法跟蹤個人所處位置的具體時間。
7) 選擇數字類型和文本類型儘量充足
在SQL 中使用smallint 和tinyint 類型要特別小心。比如,假如想看看月銷售總額,總額字段類型是smallint,那麼,如果總額超過了$32,767 就不能進行計算操作了。
而ID 類型的文本字段,比如客戶ID 或定單號等等都應該設置得比一般想象更大。假設客戶ID 爲10 位數長。那你應該把數據庫表字段的長度設爲12 或者13 個字符長。但這額外佔據的空間卻無需將來重構整個數據庫就可以實現數據庫規模的增長了。
8) 增加刪除標記字段
在表中包含一個“刪除標記”字段,這樣就可以把行標記爲刪除。在關係數據庫裏不要單獨刪除某一行;最好採用清除數據程序而且要仔細維護索引整體性。 
3. 選擇鍵和索引(數據庫邏輯設計)
鍵選擇原則:
1) 鍵設計4 原則
•?爲關聯字段創建外鍵。
•?所有的鍵都必須唯一。
•?避免使用複合鍵。
•?外鍵總是關聯唯一的鍵字段。
2) 使用系統生成的主鍵
設計數據庫的時候採用系統生成的鍵作爲主鍵,那麼實際控制了數據庫的索引完整性。這樣,數據庫和非人工機制就有效地控制了對存儲數據中每一行的訪問。採用系統生成鍵作爲主鍵還有一個優點:當擁有一致的鍵結構時,找到邏輯缺陷很容易。
3) 不要用用戶的鍵(不讓主鍵具有可更新性)
在確定採用什麼字段作爲表的鍵的時候,可一定要小心用戶將要編輯的字段。通常的情況下不要選擇用戶可編輯的字段作爲鍵。
4) 可選鍵有時可做主鍵
把可選鍵進一步用做主鍵,可以擁有建立強大索引的能力。

索引使用原則:
索引是從數據庫中獲取數據的最高效方式之一。95%的數據庫性能問題都可以採用索引技術得到解決。
1) 
邏輯主鍵使用唯一的成組索引,對系統鍵(作爲存儲過程)採用唯一的非成組索引,對任何外鍵列採用非成組索引。考慮數據庫的空間有多大,表如何進行訪問,還有這些訪問是否主要用作讀寫。
2) 
大多數數據庫都索引自動創建的主鍵字段,但是可別忘了索引外鍵,它們也是經常使用的鍵,比如運行查詢顯示主表和所有關聯表的某條記錄就用得上。
3) 
不要索引memo/note 字段,不要索引大型字段(有很多字符),這樣作會讓索引佔用太多的存儲空間。
4) 
不要索引常用的小型表
不要爲小型數據表設置任何鍵,假如它們經常有插入和刪除操作就更別這樣作了。對這些插入和刪除操作的索引維護可能比掃描表空間消耗更多的時間。

4. 數據完整性設計(數據庫邏輯設計)
1) 
完整性實現機制:
實體完整性:主鍵
參照完整性:
父表中刪除數據:級聯刪除;受限刪除;置空值
父表中插入數據:受限插入;遞歸插入
父表中更新數據:級聯更新;受限更新;置空值
DBMS對參照完整性可以有兩種方法實現:外鍵實現機制(約束規則)和觸發器實現機制
用戶定義完整性:
    NOT NULL;CHECK;觸發器
2) 用約束而非商務規則強制數據完整性
採用數據庫系統實現數據的完整性。這不但包括通過標準化實現的完整性而且還包括數據的功能性。在寫數據的時候還可以增加觸發器來保證數據的正確性。不要依賴於商務層保證數據完整性;它不能保證表之間(外鍵)的完整性所以不能強加於其他完整性規則之上。
3) 強制指示完整性
在有害數據進入數據庫之前將其剔除。激活數據庫系統的指示完整性特性。這樣可以保持數據的清潔而能迫使開發人員投入更多的時間處理錯誤條件。
4) 使用查找控制數據完整性
控制數據完整性的最佳方式就是限制用戶的選擇。只要有可能都應該提供給用戶一個清晰的價值列表供其選擇。這樣將減少鍵入代碼的錯誤和誤解同時提供數據的一致性。某些公共數據特別適合查找:國家代碼、狀態代碼等。
5) 採用視圖
爲了在數據庫和應用程序代碼之間提供另一層抽象,可以爲應用程序建立專門的視圖而不必非要應用程序直接訪問數據表。這樣做還等於在處理數據庫變更時給你提供了更多的自由。
5. 其他設計技巧
1) 避免使用觸發器
觸發器的功能通常可以用其他方式實現。在調試程序時觸發器可能成爲干擾。假如你確實需要採用觸發器,你最好集中對它文檔化。
2) 使用常用英語(或者其他任何語言)而不要使用編碼
在創建下拉菜單、列表、報表時最好按照英語名排序。假如需要編碼,可以在編碼旁附上用戶知道的英語。
3) 保存常用信息
讓 
一個表專門存放一般數據庫信息非常有用。在這個表裏存放數據庫當前版本、最近檢查/修復(對Access)、關聯設計文檔的名稱、客戶等信息。這樣可以實 
現一種簡單機制跟蹤數據庫,當客戶抱怨他們的數據庫沒有達到希望的要求而與你聯繫時,這樣做對非客戶機/服務器環境特別有用。
4) 包含版本機制
在數據庫中引入版本控制機制來確定使用中的數據庫的版本。時間一長,用戶的需求總是會改變的。最終可能會要求修改數據庫結構。把版本信息直接存放到數據庫中更爲方便。 
5) 編制文檔
對所有的快捷方式、命名規範、限制和函數都要編制文檔。
採用給表、列、觸發器等加註釋的數據庫工具。對開發、支持和跟蹤修改非常有用。
對數據庫文檔化,或者在數據庫自身的內部或者單獨建立文檔。這樣,當過了一年多時間後再回過頭來做第2 個版本,犯錯的機會將大大減少。
6) 測試、測試、反覆測試
建立或者修訂數據庫之後,必須用用戶新輸入的數據測試數據字段。最重要的是,讓用戶進行測試並且同用戶一道保證選擇的數據類型滿足商業要求。測試需要在把新數據庫投入實際服務之前完成。
7) 檢查設計
在開發期間檢查數據庫設計的常用技術是通過其所支持的應用程序原型檢查數據庫。換句話說,針對每一種最終表達數據的原型應用,保證你檢查了數據模型並且查看如何取出數據。
三、數據庫命名規範
1. 實體(表)的命名
1) 
 表以名詞或名詞短語命名,確定表名是採用複數還是單數形式,此外給表的別名定義簡單規則(比方說,如果表名是一個單詞,別名就取單詞的前4 個字母;如 
果表名是兩個單詞,就各取兩個單詞的前兩個字母組成4 個字母長的別名;如果表的名字由3 個單詞組成,從頭兩個單詞中各取一個然後從最後一個單詞中再取 
出兩個字母,結果還是組成4 字母長的別名,其餘依次類推)
對工作用表來說,表名可以加上前綴WORK_ 後面附上採用該表的應用程序的名字。在命名過程當中,根據語義拼湊縮寫即可。注意,由於ORCLE會將字段名稱統一成大寫或者小寫中的一種,所以要求加上下劃線。
舉例:
定義的縮寫 Sales: Sal 銷售;
Order: Ord 訂單;
Detail: Dtl 明細;
則銷售訂單明細表命名爲:Sal_Ord_Dtl;
2) 如果表或者是字段的名稱僅有一個單詞,那麼建議不使用縮寫,而是用完整的單詞。
舉例:
定義的縮寫 Material Ma 物品;
物品表名爲:Material, 而不是 Ma.
但是字段物品編碼則是:Ma_ID;而不是Material_ID
3) 所有的存儲值列表的表前面加上前綴Z
目的是將這些值列表類排序在數據庫最後。
4) 所有的冗餘類的命名(主要是累計表)前面加上前綴X
冗餘類是爲了提高數據庫效率,非規範化數據庫的時候加入的字段或者表
5) 關聯類通過用下劃線連接兩個基本類之後,再加前綴R的方式命名,後面按照字母順序羅列兩個表名或者表名的縮寫。
關聯表用於保存多對多關係。
如果被關聯的表名大於10個字母,必須將原來的表名的進行縮寫。如果沒有其他原因,建議都使用縮寫。
舉例:表Object與自身存在多對多的關係,則保存多對多關係的表命名爲:R_Object;
表 Depart和Employee;存在多對多的關係;則關聯表命名爲R_Dept_Emp
2. 屬性(列)的命名
1) 
 採用有意義的列名,表內的列要針對鍵採用一整套設計規則。每一個表都將有一個自動ID作爲主健,邏輯上的主健作爲第一組候選主健來定義,如果是數據庫自 
動生成的編碼,統一命名爲:ID;如果是自定義的邏輯上的編碼則用縮寫加“ID”的方法命名。如果鍵是數字類型,你可以用_NO 作爲後綴;如果是字符類 
型則可以採用_CODE 後綴。對列名應該採用標準的前綴和後綴。
舉例:銷售訂單的編號字段命名:Sal_Ord_ID;如果還存在一個數據庫生成的自動編號,則命名爲:ID。
2) 所有的屬性加上有關類型的後綴,注意,如果還需要其它的後綴,都放在類型後綴之前。
注: 數據類型是文本的字段,類型後綴TX可以不寫。有些類型比較明顯的字段,可以不寫類型後綴。
3) 採用前綴命名
給每個表的列名都採用統一的前綴,那麼在編寫SQL表達式的時候會得到大大的簡化。這樣做也確實有缺點,比如破壞了自動錶連接工具的作用,後者把公共列名同某些數據庫聯繫起來。
3. 視圖的命名
1) 視圖以V作爲前綴,其他命名規則和表的命名類似;
2) 命名應儘量體現各視圖的功能。
4. 觸發器的命名
觸發器以TR作爲前綴,觸發器名爲相應的表名加上後綴,Insert觸發器加 
_I ,Delete觸發器加 _D ,Update觸發器加 _U 
,如:TR_Customer_I,TR_Customer_D,TR_Customer_U。
5. 存儲過程名
存儲過程應以 UP_ 
開頭,和系統的存儲過程區分,後續部分主要以動賓形式構成,並用下劃線分割各個組成部分。如增加代理商的帳戶的存儲過程爲 UP_Ins_Agent_Account 

6. 變量名
變量名採用小寫,若屬於詞組形式,用下劃線分隔每個單詞,如@my_err_no。
7. 命名中其他注意事項
1)  以上命名都不得超過30個字符的系統限制。變量名的長度限制爲29(不包括標識字符@)。
2)  數據對象、變量的命名都採用英文字符,禁止使用中文命名。絕對不要在對象名的字符之間留空格。
3) 小心保留詞,要保證你的字段名沒有和保留詞、數據庫系統或者常用訪問方法衝突
5) 
保持字段名和類型的一致性,在命名字段併爲其指定數據類型的時候一定要保證一致性。假如數據類型在一個表裏是整數,那在另一個表裏可就別變成字符型了。


 

隨着計算機技術越來越廣泛地應用於國民經濟的各個領域,在計算機硬件不斷微型化的同時,應用系統向着複雜化、大型化的方向發展。數據庫是整個系統的核心,它的設計直接關係系統執行的效率和系統的穩定性。因此在軟件系統開發中,數據庫設計應遵循必要的數據庫範式理論,以減少冗餘、保證數據的完整性與正確性。只有在合適的數據庫產品上設計出合理的數據庫模型,才能降低整個系統的編程和維護難度,提高系統的實際運行效率。雖然對於小項目或中等規模的項目開發人員可以很容易地利用範式理論設計出一套符合要求的數據庫,但對於一個包含大型數據庫的軟件項目,就必須有一套完整的設計原則與技巧。


 

一、成立數據小組


 

 


 

大型數據庫數據元素多,在設計上有必要成立專門的數據小組。由於數據庫設計者不一定是使用者,對系統設計中的數據元素不可能考慮周全,數據庫設計出來後,往往難以找到所需的庫表,因此數據小組最好由熟悉業務的項目骨幹組成。


 

 


 

數據小組的職能並非是設計數據庫,而是通過需求分析,在參考其他相似系統的基礎上,提取系統的基本數據元素,擔負對數據庫的審覈。審覈內容包括審覈新的數據庫元素是否完全、能否實現全部業務需求;對舊數據庫(如果存在舊系統)的分析及數據轉換;數據庫設計的審覈、控制及必要調整。


 

二、設計原則


 

1.規範命名。所有的庫名、表名、域名必須遵循統一的命名規則,並進行必要說明,以方便設計、維護、查詢。


 

 


 

2.控制字段的引用。在設計時,可以選擇適當的數據庫設計管理工具,以方便開發人員的分佈式設計和數據小組的集中審覈管理。採用統一的命名規則,如果設計的字段已經存在,可直接引用;否則,應重新設計。


 

 


 

3.庫表重複控制。在設計過程中,如果發現大部分字段都已存在,開發人員應懷疑所設計的庫表是否已存在。通過對字段所在庫表及相應設計人員的查詢,可以確認庫表是否確實重複。


 

 


 

4.併發控制。設計中應進行併發控制,即對於同一個庫表,在同一時間只有一個人有控制權,其他人只能進行查詢。


 

 


 

5.必要的討論。數據庫設計完成後,數據小組應與相關人員進行討論,通過討論來熟悉數據庫,從而對設計中存在的問題進行控制或從中獲取數據庫設計的必要信息。


 

 


 

6.數據小組的審覈。庫表的定版、修改最終都要通過數據小組的審覈,以保證符合必要的要求。


 

 


 

7.頭文件處理。每次數據修改後,數據小組要對相應的頭文件進行修改(可由管理軟件自動完成),並通知相關的開發人員,以便進行相應的程序修改。


 

三、設計技巧


 

1.分類拆分數據量大的表。對於經常使用的表(如某些參數表或代碼對照表),由於其使用頻率很高,要儘量減少表中的記錄數量。例如,銀行的戶主賬表原來設計成一張表,雖然可以方便程序的設計與維護,但經過分析發現,由於數據量太大,會影響數據的迅速定位。如果將戶主賬表分別設計爲活期戶主賬、定期戶主賬及對公戶主賬等,則可以大大提高查詢效率。


 

 


 

2.索引設計。對於大的數據庫表,合理的索引能夠提高整個數據庫的操作效率。在索引設計中,索引字段應挑選重複值較少的字段;在對建有複合索引的字段進行檢索時,應注意按照複合索引字段建立的順序進行。例如,如果對一個5萬多條記錄的流水錶以日期和流水號爲序建立複合索引,由於在該表中日期的重複值接近整個表的記錄數,用流水號進行查詢所用的時間接近3秒;而如果以流水號爲索引字段建立索引進行相同的查詢,所用時間不到1秒。因此在大型數據庫設計中,只有進行合理的索引字段選擇,纔能有效提高整個數據庫的操作效率。


 

 


 

3.數據操作的優化。在大型數據庫中,如何提高數據操作效率值得關注。例如,每在數據庫流水錶中增加一筆業務,就必須從流水控制表中取出流水號,並將其流水號的數值加一。正常情況下,單筆操作的反應速度尚屬正常,但當用它進行批量業務處理時,速度會明顯減慢。經過分析發現,每次對流水控制表中的流水號數值加一時都要鎖定該表,而該表卻是整個系統操作的核心,有可能在操作時被其他進程鎖定,因而使整個事務操作速度變慢。對這一問題的解決的辦法是,根據批量業務的總筆數批量申請流水號,並對流水控制表進行一次更新,即可提高批量業務處理的速度。另一個例子是對插表的優化。對於大批量的業務處理,如果在插入數據庫表時用普通的Insert語句,速度會很慢。其原因在於,每次插表都要進行一次I/O操作,花費較長的時間。改進後,可以用Put語句等緩衝區形式等滿頁後再進行I/O操作,從而提高效率。對大的數據庫表進行刪除時,一般會直接用Delete語句,這個語句雖然可以進行小表操作,但對大表卻會因帶來大事務而導致刪除速度很慢甚至失敗。解決的方法是去掉事務,但更有效的辦法是先進行Drop操作再進行重建。


 

 


 

4.數據庫參數的調整。數據庫參數的調整是一個經驗不斷積累的過程,應由有經驗的系統管理員完成。以Informix數據庫爲例,記錄鎖的數目太少會造成鎖表的失敗;邏輯日誌的文件數目太少會造成插入大表失敗等,這些問題都應根據實際情況進行必要的調整。


 

 


 

5.必要的工具。在整個數據庫的開發與設計過程中,可以先開發一些小的應用工具,如自動生成庫表的頭文件、插入數據的初始化、數據插入的函數封裝、錯誤跟蹤或自動顯示等,以此提高數據庫的設計與開發效率。


 

 


 

6.避免長事務。對單個大表的刪除或插入操作會帶來大事務,解決的辦法是對參數進行調整,也可以在插入時對文件進行分割。對於一個由一系列小事務順序操作共同構成的長事務(如銀行交易系統的日終交易),可以由一系列操作完成整個事務,但其缺點是有可能因整個事務太大而使不能完成,或者,由於偶然的意外而使事務重做所需的時間太長。較好的解決方法是,把整個事務分解成幾個較小的事務,再由應用程序控制整個系統的流程。這樣,如果其中某個事務不成功,則只需重做該事務,因而既可節約時間,又可避免長事務。


 

 


 

7.適當超前。計算機技術發展日新月異,數據庫的設計必須具有一定前瞻性,不但要滿足當前的應用要求,還要考慮未來的業務發展,同時必須有利於擴展或增加應用系統的處理功能。


 

 相對於中小型數據庫,大型數據庫的設計與開發要複雜得多,因此在設計、開發過程中,除了要遵循數據庫範式理論、增加系統的一致性和完整性外,還要在總體上根據具體情況進行分佈式設計,緊緊把握集中控制、統一審覈的基本原則,保證數據庫設計結構緊湊、分佈平衡、定位迅速。在數據庫操作上,要採用一定的技巧提高整個應用系統的執行效率,並注意適當超前,以適應不斷變化的應用及系統發展的要求。


 

消耗在準備利用Oracle執行計劃機制提高查詢性能新的SQL語句的時間是Oracle 
SQL語句執行時間的最重要的組成部分。但是通過理解Oracle內部產生執行計劃的機制,你能夠控制Oracle花費在評估連接順序的時間數量,並且能在大體上提高查詢性能。 


 

準備執行SQL語句


 

當SQL語句進入Oracle的庫緩存後,在該語句準備執行之前,將執行下列步驟:


 

1) 語法檢查:檢查SQL語句拼寫是否正確和詞序。


 

2) 語義分析:覈實所有的與數據字典不一致的表和列的名字。


 

3) 輪廓存儲檢查:檢查數據字典,以確定該SQL語句的輪廓是否已經存在。


 

4) 生成執行計劃:使用基於成本的優化規則和數據字典中的統計表來決定最佳執行計劃。


 

5) 建立二進制代碼:基於執行計劃,Oracle生成二進制執行代碼。


 

一 
旦爲執行準備好了SQL語句,以後的執行將很快發生,因爲Oracle認可同一個SQL語句,並且重用那些語句的執行。然而,對於生成特殊的SQL語句, 
或嵌入了文字變量的SQL語句的系統,SQL執行計劃的生成時間就很重要了,並且前一個執行計劃通常不能夠被重用。對那些連接了很多表的查詢, 
Oracle需要花費大量的時間來檢測連接這些表的適當順序。


 

評估表的連接順序


 

在SQL 
語句的準備過程中,花費最多的步驟是生成執行計劃,特別是處理有多個表連接的查詢。當Oracle評估表的連接順序時,它必須考慮到表之間所有可能的連 
接。例如:六個表的之間連接有720(6的階乘,或6 * 5 * 4 * 3 * 2 * 1 = 
720)種可能的連接線路。當一個查詢中含有超過10個表的連接時,排列的問題將變得更爲顯著。對於15個表之間的連接,需要評估的可能查詢排列將超過1 
萬億(準確的數字是1,307,674,368,000)種。


 

使用optimizer_search_limit參數來設定限制


 

通 
過使用optimizer_search_limit參數,你能夠指定被優化器用來評估的最大的連接組合數量。使用這個參數,我們將能夠防止優化器消耗不 
定數量的時間來評估所有可能的連接組合。如果在查詢中表的數目小於optimizer_search_limit的值,優化器將檢查所有可能的連接組合。


 

例 如:有五個表連接的查詢將有120(5! = 5 * 4 * 3 * 2 * 1 = 
120)種可能的連接組合,因此如果optimizer_search_limit等於5(默認值),則優化器將評估所有的120種可能。 
optimizer_search_limit參數也控制着調用帶星號的連接提示的閥值。當查詢中的表的數目比 
optimizer_search_limit小時,帶星號的提示將被優先考慮。


 

另一個工具:參數optimizer_max_permutations


 

初始化參數optimizer_max_permutations定義了優化器所考慮組合數目的上限,且依賴於初始參數optimizer_search_limit。optimizer_max_permutations的默認值是80,000。 


 

參 
數optimizer_search_limit和optimizer_max_permutations一起來確定優化器所考慮的組合數目的上限:除非 
(表或組合數目)超過參數optimizer_search_limit 或者 
optimizer_max_permutations設定的值,否則優化器將生成所有可能的連接組合。一旦優化器停止評估表的連接組合,它將選擇成本最 低的組合。 


 

使用ordered提示指定連接順序


 

你 
能夠設定優化器所執行的評估數目的上限。但是即使採用有很高價值的排列評估,我們仍然擁有使優化器可以儘早地放棄複雜的查詢的重要機會。回想一下含有15 
個連接查詢的例子,它將有超過1萬億種的連接組合。如果優化器在評估了80,000個組合後停止,那麼它才僅僅評估了0.000006%的可能組合,而且 
或許還沒有爲這個巨大的查詢找到最佳的連接順序。


 

在Oracle 
SQL中解決此問題的最好的方法是手工指定表的連接順序。爲了儘快創建最小的解決方案集,這裏所遵循的規則是將表結合起來,通常優先使用限制最嚴格的WHERE子句來連接表。 


 

下面的代碼是一個查詢執行計劃的例子,該例子在emp表的關聯查詢上強制執行了嵌套的循環連接。注意,我已經使用了ordered提示來直接最優化表的評估順序,最終它們表現在WHERE子句上。 

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