




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 附件二國家發(fā)展改革委網(wǎng)上辦公系統(tǒng)二期項(xiàng)目數(shù)據(jù)庫設(shè)計(jì)規(guī)范編制單位:北京xxxx信息產(chǎn)業(yè)股份有限公司編 制 人:編制日期:二一一年四月國家發(fā)展改革委網(wǎng)上辦公系統(tǒng)二期項(xiàng)目-數(shù)據(jù)庫設(shè)計(jì)規(guī)范目 錄第1章前言11.1 目的11.2 內(nèi)容11.3 適用范圍11.4 總體原則1第2章數(shù)據(jù)庫的設(shè)計(jì)方法及流程32.1 設(shè)計(jì)方法32.2 設(shè)計(jì)流程42.2.1 需求分析階段42.2.2 概念結(jié)構(gòu)設(shè)計(jì)階段52.2.3 邏輯設(shè)計(jì)階段52.2.4 物理設(shè)計(jì)階段52.2.5 數(shù)據(jù)庫實(shí)施階段62.2.6 數(shù)據(jù)庫運(yùn)行維護(hù)階段62.2.7 建模工具6第3章數(shù)據(jù)庫設(shè)計(jì)規(guī)范73.1 數(shù)據(jù)庫規(guī)范化的五個(gè)要求73.1.1 要求一:表中應(yīng)
2、該避免可為空的列73.1.2 要求二:表不應(yīng)該有重復(fù)的值或者列73.1.3 要求三:表中記錄應(yīng)該有一個(gè)唯一的標(biāo)識符83.1.4 要求四:數(shù)據(jù)庫對象要有統(tǒng)一的前綴名83.1.5 要求五:盡量只存儲單一實(shí)體類型的數(shù)據(jù)93.2 對象命名規(guī)范93.2.1 規(guī)則93.2.2 表命名規(guī)范103.2.3 字段命名規(guī)范103.2.4 索引命名規(guī)范113.2.5 分區(qū)命名規(guī)范123.2.6 視圖/物化視圖命名規(guī)范123.2.7 觸發(fā)器/函數(shù)/存儲過程命名規(guī)范123.3 數(shù)據(jù)庫編程規(guī)范133.3.1 書寫規(guī)范133.3.2 注釋規(guī)范153.3.3 語法規(guī)范193.3.4 sql性能規(guī)范213.3.4.1 批量操作
3、,避免頻繁使用commit213.3.4.2 避免動態(tài)sql,要使用綁定變量方式213.3.4.3 避免不必要的排序233.3.4.4 用where子句替換having子句233.3.4.5 用“=”替代“”233.3.4.6 刪除表中所有記錄時(shí)用truncate替代delete233.3.4.7 用union-all 代替union243.3.4.8 用(not) exists替代(not) in。243.3.4.9 使用decode函數(shù)來減少處理時(shí)間。243.3.4.10 使用表的別名(alias)。253.3.4.11 盡量減少對表的查詢次數(shù)。253.3.4.12 用表連接替換exist
4、s。263.3.4.13 避免使用distinct,可以用exists替換distinct。263.3.4.14 避免使用耗費(fèi)資源的操作273.3.4.15 避免對索引列使用數(shù)據(jù)庫函數(shù)、計(jì)算表達(dá)式等等273.3.4.16 在查詢條件中,避免不必要的類型轉(zhuǎn)換。273.3.4.17 盡量避免字段與“null”比較283.3.4.18 在索引列上使用(!=)和 like 將不會使用索引。283.3.4.19 用case語句合并多重掃描283.3.5 job使用規(guī)范293.4 索引使用規(guī)范293.4.1 創(chuàng)建索引原則293.4.2 索引使用建議303.4.2.1 避免對條件字段進(jìn)行操作303.4.2.
5、2 避免隱式轉(zhuǎn)換303.4.2.3 盡量避免 “”303.4.2.4 避免where子句中的is null和is not null313.4.2.5 數(shù)據(jù)分布不均勻列的索引使用313.4.2.6 需要時(shí)利用hint強(qiáng)制指定索引313.4.2.7 屏蔽無用索引323.4.2.8 like子句盡量前端匹配323.4.2.9 使用基于函數(shù)的索引323.4.2.10 使用分區(qū)索引333.4.2.11 使用位圖索引333.4.2.12 使用復(fù)合索引333.4.2.13 少數(shù)情況下用全表掃描替代索引掃描343.4.3 總結(jié)343.5 分區(qū)表使用規(guī)范353.6 物理設(shè)計(jì)規(guī)范353.6.1 環(huán)境配置353.6
6、.2 數(shù)據(jù)庫配置353.6.2.1 數(shù)據(jù)庫名與全局名353.6.2.2 數(shù)據(jù)庫sid363.6.2.3 數(shù)據(jù)庫連接類型363.6.2.4 sga配置363.6.2.5 pga配置363.6.2.6 數(shù)據(jù)庫字符集363.6.3 其他參數(shù)配置363.6.3.1 db_files363.6.3.2 db_block_size363.6.3.3 sga_target373.6.4 控制文件373.6.4.1 冗余373.6.4.2 參數(shù)配置373.6.5 日志文件373.6.5.1 日志文件大小373.6.5.2 日志文件組數(shù)量373.6.5.3 日志成員數(shù)量373.6.6 表空間及數(shù)據(jù)文件設(shè)計(jì)原則3
7、83.6.6.1 永久表空間383.6.6.2 undo表空間383.6.6.3 臨時(shí)表空間383.6.6.4 系統(tǒng)表空間38第4章數(shù)據(jù)庫安全規(guī)范394.1 用戶密碼規(guī)范394.2 用戶權(quán)限規(guī)范434.2.1 不同應(yīng)用分配不同帳號434.2.2 刪除或鎖定無關(guān)帳號434.2.3 限制sysdba遠(yuǎn)程登錄434.2.4 限制業(yè)務(wù)用戶權(quán)限434.2.5 對用戶的屬性進(jìn)行控制,434.2.6 啟用數(shù)據(jù)字典保護(hù)434.3 數(shù)據(jù)庫監(jiān)聽規(guī)范434.3.1 需要時(shí)為監(jiān)聽設(shè)置密碼434.3.2 需要時(shí)設(shè)置信任ip集44第5章數(shù)據(jù)庫評審455.1 評審范圍455.2 評審標(biāo)準(zhǔn)45 iv 第1章 前言1.1 目的
8、為規(guī)范國家發(fā)展改革委網(wǎng)上辦公系統(tǒng)二期項(xiàng)目(以下簡稱“發(fā)改委二期項(xiàng)目)的數(shù)據(jù)庫設(shè)計(jì),特制定數(shù)據(jù)庫設(shè)計(jì)規(guī)范。通過該規(guī)范,我們希望達(dá)到以下目標(biāo):1. 制定數(shù)據(jù)庫設(shè)計(jì)規(guī)范,作為發(fā)改委二期項(xiàng)目范圍內(nèi)統(tǒng)一的數(shù)據(jù)庫設(shè)計(jì)、規(guī)劃、開發(fā)以及維護(hù)人員的技術(shù)參考資料。2. 更好的完成發(fā)改委二期項(xiàng)目的數(shù)據(jù)庫設(shè)計(jì)與開發(fā),以及后期的數(shù)據(jù)庫維護(hù)。3. 從數(shù)據(jù)庫的設(shè)計(jì)原則、設(shè)計(jì)文檔幾方面明確數(shù)據(jù)庫設(shè)計(jì)的規(guī)范思想及命名規(guī)則、代碼書寫規(guī)則。4. 根據(jù)對一般業(yè)務(wù)系統(tǒng)的分析,將數(shù)據(jù)庫和程序系統(tǒng)統(tǒng)一進(jìn)行整體描述,展示數(shù)據(jù)庫的表之間以及與程序模塊間的關(guān)系。5. 規(guī)定除數(shù)據(jù)庫設(shè)計(jì)所遵循的范式外的一些適用原則,在遵循數(shù)據(jù)庫設(shè)計(jì)范式的基礎(chǔ)上,合
9、理地劃分表,添加狀態(tài)和控制字段等,并明確數(shù)據(jù)庫設(shè)計(jì)中的注釋規(guī)范。1.2 內(nèi)容本規(guī)范主要根據(jù)發(fā)改委二期項(xiàng)目數(shù)據(jù)庫性能特點(diǎn),描述數(shù)據(jù)庫環(huán)境配置、數(shù)據(jù)庫物理設(shè)計(jì)、數(shù)據(jù)庫邏輯設(shè)計(jì)、視圖、存儲過程、應(yīng)用程序設(shè)計(jì)等方面的設(shè)計(jì)規(guī)范。1.3 適用范圍適用于國家發(fā)展改革委網(wǎng)上辦公系統(tǒng)二期項(xiàng)目數(shù)據(jù)庫建設(shè)。1.4 總體原則本規(guī)范采用以下的原則:1. 所有名稱都采用英文,且準(zhǔn)確無誤。2. 每個(gè)表必須有主鍵,一般的主鍵都是自動編號的。 3. 主鍵與對應(yīng)的外鍵名字要一致。 4. 字段命名為表名+字段名,如article_id,采用小寫加下劃線完成。 5. 表與表之間的關(guān)聯(lián)默認(rèn)采用id實(shí)現(xiàn)。 6. 日期采用datetime
10、。布爾值采用bit類型,數(shù)據(jù)是true和false 7. 一般情況,不使用數(shù)據(jù)庫提供的表與表之間的關(guān)系與約束 ,而應(yīng)使用程序來判別關(guān)系。如刪除一行會同時(shí)牽涉到兩個(gè)表,就按照順序使用代碼來完成。 8. 文本字段默認(rèn)設(shè)置varchar(50),默認(rèn)情況大文本采用varchar(max),因?yàn)関archar是可變長度的,不會浪費(fèi)。 9. 表與表的關(guān)聯(lián)是發(fā)生在一對多或多對多的情況下,一對一就用一個(gè)表。 10. 數(shù)據(jù)源控件(編程需要訪問的)盡量不放在模板中,訪問麻煩; 11. 所有的sql語句字段都要寫全,不使用星號來代替; 12. 1.縮寫的原則:1.通用的縮寫,例如pwd,就一定要縮寫 ;2.太長了
11、,如unity currency,就縮寫,其他的情況不允許縮寫。3縮寫一定要在注釋部分將全稱寫出來第2章 數(shù)據(jù)庫的設(shè)計(jì)方法及流程2.1 設(shè)計(jì)方法數(shù)據(jù)庫設(shè)計(jì)方法目前可分為四類:直觀設(shè)計(jì)法、規(guī)范設(shè)計(jì)法、計(jì)算機(jī)輔助設(shè)計(jì)法和自動化設(shè)計(jì)法。其中,新奧爾良法是目前公認(rèn)的比較完整和權(quán)威的一種規(guī)范設(shè)計(jì)法。新奧爾良法將數(shù)據(jù)庫設(shè)計(jì)分成需求分析(分析用戶需求)、概念設(shè)計(jì)(信息分析和定義)、邏輯設(shè)計(jì)(設(shè)計(jì)實(shí)現(xiàn))和物理設(shè)計(jì)(物理數(shù)據(jù)庫設(shè)計(jì))。目前,常用的規(guī)范設(shè)計(jì)方法大多起源于新奧爾良法,并在設(shè)計(jì)的每一階段采用一些輔助方法來具體實(shí)現(xiàn)。以下是兩種常用的規(guī)范設(shè)計(jì)方法:一、 基于e-r模型的數(shù)據(jù)庫設(shè)計(jì)方法。該方法是由p.p.s
12、.chen于1976年提出的數(shù)據(jù)庫設(shè)計(jì)方法,其基本思想是在需求分析的基礎(chǔ)上,用e-r(實(shí)體聯(lián)系)圖構(gòu)造一個(gè)反映現(xiàn)實(shí)世界實(shí)體之間聯(lián)系的企業(yè)模式,然后再將此企業(yè)模式轉(zhuǎn)換成基于某一特定的dbms的概念模式。二、 基于3nf的數(shù)據(jù)庫設(shè)計(jì)方法。該方法是由satre提出的結(jié)構(gòu)化設(shè)計(jì)方法,其基本思想是在需求分析的基礎(chǔ)上,確定數(shù)據(jù)庫模式中的全部屬性和屬性間的依賴關(guān)系,將它們組織在一個(gè)單一的關(guān)系模式中,然后再分析模式中不符合3nf的約束條件,將其進(jìn)行投影分解,規(guī)范成若干個(gè)3nf關(guān)系模式的集合。 其具體設(shè)計(jì)步驟分為五個(gè)階段: a) 設(shè)計(jì)企業(yè)模式,利用規(guī)范化得到的3nf關(guān)系模式畫出企業(yè)模式; b) 設(shè)計(jì)數(shù)據(jù)庫的概念
13、模式,把企業(yè)模式轉(zhuǎn)換成dbms所能接受的概念模式,并根據(jù)概念模式導(dǎo)出各個(gè)應(yīng)用的外模式; c) 設(shè)計(jì)數(shù)據(jù)庫的物理模式(存儲模式); d) 對物理模式進(jìn)行評價(jià); e) 實(shí)現(xiàn)數(shù)據(jù)庫。2.2 設(shè)計(jì)流程以規(guī)范性設(shè)計(jì)為例,把數(shù)據(jù)庫設(shè)計(jì)流程分為以下幾個(gè)階段:a. 需求分析階段:綜合各個(gè)用戶的應(yīng)用需求(現(xiàn)實(shí)世界的需求)。b. 概念設(shè)計(jì)階段:形成獨(dú)立于機(jī)器和各dbms產(chǎn)品的概念模式(信息世界模型),用e-r圖來描述。c. 邏輯設(shè)計(jì)階段:將e-r圖轉(zhuǎn)換成具體的數(shù)據(jù)庫產(chǎn)品支持的數(shù)據(jù)模型,如關(guān)系模型,形成數(shù)據(jù)庫邏輯模式。然后根據(jù)用戶處理的要求,安全性的考慮,在基本表的基礎(chǔ)上再建立必要的視圖(view)形成數(shù)據(jù)的外模式
14、。d. 物理設(shè)計(jì)階段:根據(jù)dbms特點(diǎn)和處理的需要,進(jìn)行物理存儲安排,設(shè)計(jì)索引,形成數(shù)據(jù)庫內(nèi)模式。e. 數(shù)據(jù)庫實(shí)施階段f. 數(shù)據(jù)庫運(yùn)行與維護(hù)階段2.2.1 需求分析階段需求收集和分析,得到數(shù)據(jù)字典描述的數(shù)據(jù)需求和數(shù)據(jù)流圖描述的處理需求。需求分析的重點(diǎn):調(diào)查、收集與分析用戶在數(shù)據(jù)管理中的信息要求、處理要求、安全性與完整性要求。需求分析的方法:調(diào)查組織機(jī)構(gòu)情況、各部門的業(yè)務(wù)活動情況、協(xié)助用戶明確對新系統(tǒng)的各種要求、確定新系統(tǒng)的邊界。常用的調(diào)查方法有: 跟班作業(yè)、開調(diào)查會、請專人介紹、詢問、設(shè)計(jì)調(diào)查表請用戶填寫、查閱記錄。分析和表達(dá)用戶需求的方法:主要包括自頂向下和自底向上兩類方法。采用逐層分解的方
15、式分析系統(tǒng),并把每一層用數(shù)據(jù)流圖和數(shù)據(jù)字典描述。數(shù)據(jù)流圖(data flow diagram,dfd)表達(dá)了數(shù)據(jù)和處理過程的關(guān)系。系統(tǒng)中的數(shù)據(jù)則借助數(shù)據(jù)字典(data dictionary,簡稱dd)來描述。2.2.2 概念結(jié)構(gòu)設(shè)計(jì)階段概念模型用于信息世界的建模。概念模型不依賴于某一個(gè)dbms支持的數(shù)據(jù)模型。通過對用戶需求進(jìn)行綜合、歸納與抽象,形成一個(gè)獨(dú)立于具體dbms的概念模型,可以用e-r圖表示。概念模型可以轉(zhuǎn)換為計(jì)算機(jī)上某一dbms支持的特定數(shù)據(jù)模型。概念模型特點(diǎn):1) 具有較強(qiáng)的語義表達(dá)能力,能夠方便、直接地表達(dá)應(yīng)用中的各種語義知識。2) 應(yīng)該簡單、清晰、易于用戶理解,是用戶與數(shù)據(jù)庫設(shè)
16、計(jì)人員之間進(jìn)行交流的語言。2.2.3 邏輯設(shè)計(jì)階段將概念結(jié)構(gòu)轉(zhuǎn)換為某個(gè)dbms所支持的數(shù)據(jù)模型(例如關(guān)系模型),并對其進(jìn)行優(yōu)化。將e-r圖轉(zhuǎn)換為關(guān)系模型實(shí)際上就是要將實(shí)體、實(shí)體的屬性和實(shí)體之間的聯(lián)系轉(zhuǎn)化為關(guān)系模式,這種轉(zhuǎn)換一般遵循如下原則:一個(gè)實(shí)體型轉(zhuǎn)換為一個(gè)關(guān)系模式,實(shí)體的屬性就是關(guān)系的屬性,實(shí)體的碼就是關(guān)系的碼。一個(gè)多對多的聯(lián)系轉(zhuǎn)換為一個(gè)關(guān)系模式,兩個(gè)實(shí)體的碼和聯(lián)系本身的屬性就是關(guān)系的屬性,兩個(gè)實(shí)體的碼就是關(guān)系的碼。數(shù)據(jù)模型的優(yōu)化,確定數(shù)據(jù)依賴,消除冗余的聯(lián)系,確定各關(guān)系模式分別屬于第幾范式。確定是否要對它們進(jìn)行合并或分解。一般來說將關(guān)系分解為3nf的標(biāo)準(zhǔn)。2.2.4 物理設(shè)計(jì)階段為邏輯數(shù)
17、據(jù)模型選取一個(gè)最適合應(yīng)用環(huán)境的物理結(jié)構(gòu)(包括存儲結(jié)構(gòu)和存取方法)。根據(jù)dbms特點(diǎn)和處理的需要,進(jìn)行物理存儲安排,設(shè)計(jì)索引,形成數(shù)據(jù)庫內(nèi)模式。2.2.5 數(shù)據(jù)庫實(shí)施階段運(yùn)用dbms提供的數(shù)據(jù)語言(例如sql)及其宿主語言(例如c),根據(jù)邏輯設(shè)計(jì)和物理設(shè)計(jì)的結(jié)果建立數(shù)據(jù)庫,編制與調(diào)試應(yīng)用程序,組織數(shù)據(jù)入庫,并進(jìn)行試運(yùn)行。 數(shù)據(jù)庫實(shí)施主要包括以下工作:用ddl定義數(shù)據(jù)庫結(jié)構(gòu)、組織數(shù)據(jù)入庫 、編制與調(diào)試應(yīng)用程序、數(shù)據(jù)庫試運(yùn)行。2.2.6 數(shù)據(jù)庫運(yùn)行維護(hù)階段在數(shù)據(jù)庫系統(tǒng)運(yùn)行過程中必須不斷地對其進(jìn)行評價(jià)、調(diào)整與修改。內(nèi)容包括:數(shù)據(jù)庫的轉(zhuǎn)儲和恢復(fù)、數(shù)據(jù)庫的安全性、完整性控制、數(shù)據(jù)庫性能的監(jiān)督、分析和改進(jìn)、
18、數(shù)據(jù)庫的重組織和重構(gòu)造。2.2.7 建模工具為加快數(shù)據(jù)庫設(shè)計(jì)速度,目前有很多數(shù)據(jù)庫輔助工具(case工具),如rational公司的rational rose,ca公司的erwin和bpwin,sybase公司的powerdesigner以及oracle公司的oracle designer等。第3章 數(shù)據(jù)庫設(shè)計(jì)規(guī)范3.1 數(shù)據(jù)庫規(guī)范化的五個(gè)要求3.1.1 要求一:表中應(yīng)該避免可為空的列 雖然表中允許空列,但是,空字段是一種比較特殊的數(shù)據(jù)類型。數(shù)據(jù)庫在處理的時(shí)候,需要進(jìn)行特殊的處理。如此的話,就會增加數(shù)據(jù)庫處理記錄的復(fù)雜性。當(dāng)表中有比較多的空字段時(shí),在同等條件下,數(shù)據(jù)庫處理的性能會降低許多。所以
19、,雖然在數(shù)據(jù)庫表設(shè)計(jì)的時(shí)候,允許表中具有空字段,但是,我們應(yīng)該盡量避免。若確實(shí)需要的話,我們可以通過一些折中的方式,來處理這些空字段,讓其對數(shù)據(jù)庫性能的影響降低到最少。一是通過設(shè)置默認(rèn)值的形式,來避免空字段的產(chǎn)生。二是若一張表中,允許為空的列比較多,接近表全部列數(shù)的三分之一。而且,這些列在大部分情況下,都是可有可無的。若數(shù)據(jù)庫管理員遇到這種情況,建議另外建立一張副表,以保存這些列。然后通過關(guān)鍵字把主表跟這張副表關(guān)聯(lián)起來。將數(shù)據(jù)存儲在兩個(gè)獨(dú)立的表中使得主表的設(shè)計(jì)更為簡單,同時(shí)也能夠滿足存儲空值信息的需要。3.1.2 要求二:表不應(yīng)該有重復(fù)的值或者列如進(jìn)銷存管理中,還需要對客戶的聯(lián)系人進(jìn)行管理。而
20、一個(gè)客戶的聯(lián)系人可能有多個(gè),為了解決這個(gè)問題,有多種實(shí)現(xiàn)方式。若設(shè)計(jì)不合理的話在,則會導(dǎo)致重復(fù)的值或者列。我們可以這么設(shè)計(jì),把客戶信息、聯(lián)系人都放入同一張表中。為了解決多個(gè)聯(lián)系人的問題,可以設(shè)置第一聯(lián)系人、第一聯(lián)系人電話、第二聯(lián)系人、第二聯(lián)系人電話等等。若還有第三聯(lián)系人、第四聯(lián)系人等等,則往往還需要加入更多的字段。可是這么設(shè)計(jì)的話,會產(chǎn)生一系列的問題。如客戶的采購員流動性比較大,在一年內(nèi)換了六個(gè)采購員。直接修改又不利于追蹤。所以,在數(shù)據(jù)庫設(shè)計(jì)的時(shí)候要盡量避免這種重復(fù)的值或者列的產(chǎn)生。建議,若數(shù)據(jù)庫管理員遇到這種情況,可以改變一下策略。如把客戶聯(lián)系人另外設(shè)置一張表。然后通過客戶id把供應(yīng)商信息表
21、跟客戶聯(lián)系人信息表連接起來。也就是說,盡量將重復(fù)的值放置到一張獨(dú)立的表中進(jìn)行管理。然后通過視圖或者其他手段把這些獨(dú)立的表聯(lián)系起來。3.1.3 要求三:表中記錄應(yīng)該有一個(gè)唯一的標(biāo)識符在數(shù)據(jù)庫表設(shè)計(jì)的時(shí)候,數(shù)據(jù)庫管理員應(yīng)該養(yǎng)成一個(gè)好習(xí)慣,用一個(gè)id號來唯一的標(biāo)識行記錄,而不要通過名字、編號等字段來對紀(jì)錄進(jìn)行區(qū)分。每個(gè)表都應(yīng)該有一個(gè)id列,任何兩個(gè)記錄都不可以共享同一個(gè)id值。另外,這個(gè)id值最好有數(shù)據(jù)庫來進(jìn)行自動管理,而不要把這個(gè)任務(wù)給前臺應(yīng)用程序。否則的話,很容易產(chǎn)生id值不統(tǒng)一的情況。另外,在數(shù)據(jù)庫設(shè)計(jì)的時(shí)候,最好還能夠加入行號。id號是用戶不能夠維護(hù)的。但是,行號用戶就可以維護(hù)。這是在實(shí)際應(yīng)
22、用程序設(shè)計(jì)中對id列的一個(gè)有效補(bǔ)充。3.1.4 要求四:數(shù)據(jù)庫對象要有統(tǒng)一的前綴名一個(gè)比較復(fù)雜的應(yīng)用系統(tǒng),其對應(yīng)的數(shù)據(jù)庫表往往以千計(jì)。若讓數(shù)據(jù)庫管理員看到對象名就了解這個(gè)數(shù)據(jù)庫對象所起的作用,恐怕會比較困難。而且在數(shù)據(jù)庫對象引用的時(shí)候,數(shù)據(jù)庫管理員也會為不能迅速找到所需要的數(shù)據(jù)庫對象而頭疼。建議:在開發(fā)數(shù)據(jù)庫之前,最好能夠花一定的時(shí)間,去制定一個(gè)數(shù)據(jù)庫對象的前綴命名規(guī)范。最常用的是根據(jù)前臺應(yīng)用程序的模塊來定義后臺數(shù)據(jù)庫對象前綴名。需要注意的是,這個(gè)命名規(guī)范應(yīng)該在數(shù)據(jù)庫管理員與前臺應(yīng)用程序開發(fā)者之間達(dá)成共識,并且嚴(yán)格按照這個(gè)命名規(guī)范來定義對象名。其次,表、視圖、函數(shù)等最好也有統(tǒng)一的前綴。如視圖可
23、以用v為前綴,而函數(shù)則可以利用f為前綴。如此數(shù)據(jù)庫管理員無論是在日常管理還是對象引用的時(shí)候,都能夠在最短的時(shí)間內(nèi)找到自己所需要的對象。3.1.5 要求五:盡量只存儲單一實(shí)體類型的數(shù)據(jù)實(shí)體類型跟數(shù)據(jù)類型不是一回事,要注意區(qū)分。如現(xiàn)在有一個(gè)圖書館里系統(tǒng),有圖書基本信息、作者信息兩個(gè)實(shí)體對象。若用戶要把這兩個(gè)實(shí)體對象信息放在同一張表中也是可以的。如可以把表設(shè)計(jì)成圖書名字、圖書作者等等。可是如此設(shè)計(jì)的話,會給后續(xù)的維護(hù)帶來不少的麻煩。如當(dāng)后續(xù)有圖書出版時(shí),則需要為每次出版的圖書增加作者信息,這無疑會增加額外的存儲空間,也會增加記錄的長度。而且若作者的情況有所改變,如住址改變了以后,則還需要去更改每本書
24、的記錄。同時(shí),若這個(gè)作者的圖書從數(shù)據(jù)庫中全部刪除之后,這個(gè)作者的信息也就蕩然無存了。很明顯,這不符合數(shù)據(jù)庫設(shè)計(jì)規(guī)范化的需求。遇到這種情況時(shí),建議可以把上面這張表分解成三種獨(dú)立的表,分別為圖書基本信息表、作者基本信息表、圖書與作者對應(yīng)表等等。如此設(shè)計(jì)以后,以上遇到的所有問題就都引刃而解了。3.2 對象命名規(guī)范3.2.1 規(guī)則【規(guī)則-1】:oracle數(shù)據(jù)庫對象的名字由字母、數(shù)字和一些連接符組成。1、多個(gè)單詞之間用連接符分開,連接符用“_”字符,不建議使用其他的字符;2、例如:存儲過程:sp_create_accbak_table【規(guī)則-2】:oracle數(shù)據(jù)庫對象的名字長度不超過30個(gè)字符。1、
25、如果超過30個(gè)字符,可以縮寫,但一定要采用標(biāo)準(zhǔn)的縮寫,常用標(biāo)準(zhǔn)縮寫見附件。如果表或者是字段的名稱僅有一個(gè)單詞,那么建議不使用縮寫,而是用完整的單詞;2、例如:表:atp_para_cfg【規(guī)則-3】:在創(chuàng)建數(shù)據(jù)庫對象時(shí),不要使用引號。1、說明:oracle數(shù)據(jù)庫自動轉(zhuǎn)換為大寫字符;避免使用系統(tǒng)保留字作為數(shù)據(jù)庫對象的名稱。2、例:建存儲過程sp_set_process_status時(shí)寫法正確寫法:create or replace procedure sp_set_process_status end sp_set_process_status;錯(cuò)誤寫法:create or replace pr
26、ocedure “sp_set_process_status” end sp_set_process_status;3.2.2 表命名規(guī)范表的命名遵循數(shù)據(jù)庫對象命名的一般規(guī)則:【規(guī)則-1】:要求表的命名盡量采用標(biāo)準(zhǔn)的翻譯,能準(zhǔn)確地表達(dá)該表的中文含義,能根據(jù)英文猜測到表的用途。例:gsm_user 用戶資料表、user_imei 用戶imei信息?!疽?guī)則-2】對于一些特定作用的表,除了遵循普通表命名規(guī)范外,增加特定后綴表示。例:配置歷史表表示為xxx_cfg_his。3.2.3 字段命名規(guī)范字段命名遵循數(shù)據(jù)庫對象命名的一般規(guī)則: 【規(guī)則-1】:字段的命名由英文單詞(或縮寫)和下劃線“_”組成,多
27、個(gè)單詞之間用下劃線分開。例:user_id、package_code等?!疽?guī)則-2】:要求字段名能表達(dá)字段的含義。例如:fail(fail):失敗記錄表history( his):歷史identity(id):id號【規(guī)則-3】:字段長度,根據(jù)業(yè)務(wù)需要定義字典長度,對字符型字段,盡量用varchar2類型,不要用char、varchar類型?!疽?guī)則-4】:如果相同字段在不同的表中出現(xiàn),要使用相同的命名,且必須保證他們的類型和長度是相同的。例:gsm_user的字段gsm_user_id,和表user_package的字段gsm_user_id,長度和類型一致。3.2.4 索引命名規(guī)范【規(guī)則-1
28、】:idx_表名縮寫_字段名縮寫。例:clerk_operating_detail表checkout_srl列上的索引命名:idx_cod_checkout_srl?!疽?guī)則-2】:如果是復(fù)合索引,字段名縮寫至少要包含復(fù)合索引的頭兩個(gè)字段名的縮寫。例如:clerk_operating_detail表(operator_id,checkout_srl)列上的復(fù)合索引命名為:idx_cod_opid_chksrl;【規(guī)則-3】:如果是主鍵索引,以“pkx”為索引前綴。例:clerk_operating_detail表(operating_srl,code_county)上的主鍵索引命名為:pkx_c
29、od_opsrl_codecty?!疽?guī)則-4】:給表增加主鍵時(shí)要顯式指定約束的名字,并且要指定using index tablespace 參數(shù)。例:alter table clerk_operating_detailadd constraint pkx_cod_opsrl_codecty -主鍵約束名,也是索引名primary key (operating_srl, code_county) using index tablespace ;不能寫成alter table clerk_operating_detail add primary key (operating_srl, code_c
30、ounty);如果不顯式指定約束名系統(tǒng)將隨機(jī)分配一個(gè)約束名字(同時(shí)也是主鍵索引的名字) 如果不指定using index tablespace 參數(shù),索引會建在該用戶默認(rèn)的表空間上,不利于數(shù)據(jù)庫性能和系統(tǒng)維護(hù)。3.2.5 分區(qū)命名規(guī)范表名各單詞第一個(gè)字母的縮寫_p例1:bill_adjust_seq 表的分區(qū)名為:bas_p01bas_p13例2:按月份分區(qū)的分區(qū)分區(qū)命名:表名各單詞第一個(gè)字母的縮寫_p(年月),如clerk_operating_detail表分區(qū)名為:cod_p0507cod_p0512;注:cod是表的簡稱,0507是指2005年7月的分區(qū)。3.2.6 視圖/物化視圖命名規(guī)
31、范【規(guī)則-1】:視圖的命名規(guī)范遵循普通表的命名規(guī)范,并在視圖前加上“v_”前綴,表示是視圖。例:v_cardinfo?!疽?guī)則-2】:物化視圖命名規(guī)則:mv_源表名_源數(shù)據(jù)庫。例:mv_gsm_user_11, mv_gsm_user_21, mv_gsm_user_41,分別表示從zwdb1,zwdb2和zwdb4復(fù)制過來的gsm_user表的數(shù)據(jù)。3.2.7 觸發(fā)器/函數(shù)/存儲過程命名規(guī)范【規(guī)則-1】:觸發(fā)器的命名規(guī)則:trg_表名_說明:其中表名為觸發(fā)源表名,ins/upd/del表示insert/update/delete觸發(fā)器。例如:trg_msn_member_del,觸發(fā)器的含義為
32、:create or replace trigger ti_msn_member_delbefore delete on msn_member for each rowdeclare beginend【規(guī)則-2】:存儲過程的命名以“sp_”打頭說明:其他規(guī)范遵循普通表的命名規(guī)范,要求名字能表達(dá)存儲過程的用途。例:sp_pre_score_modify、sp_create_scp_operation?!疽?guī)則-3】:函數(shù)的命名以“fn_”打頭說明:其他規(guī)范遵循普通表的命名規(guī)范,要求名字能表達(dá)函數(shù)的用途。例:fn_get_packname、fn_check_brand_package。3.3 數(shù)據(jù)庫
33、編程規(guī)范3.3.1 書寫規(guī)范【規(guī)則-1】:所有代碼統(tǒng)一使用小寫字母書寫。例:create or replace procedure sp_check_package( i_package_code number, i_user_id number, o_flag out number ) is begin o_flag := 0; end sp_check_package;/【規(guī)則-2】:確保變量和參數(shù)在類型和長度上與表數(shù)據(jù)列類型和長度相匹配。說明:如果與表數(shù)據(jù)列寬度不匹配,則當(dāng)較寬或較大的數(shù)據(jù)傳進(jìn)來時(shí)會產(chǎn)生運(yùn)行異常?!疽?guī)則-3】:參數(shù)和變量的命名符合如下規(guī)范:1、傳入?yún)?shù)以“i_”為前綴;2
34、、傳出參數(shù)以“o_”為前綴;3、變量以“v_”為前綴4、例如:create or replace procedure sp_get_global(i_operator_id in number, i_session_id in number, o_flag out number) is v_cityid varchar(2); v_region_level number(1);begin.end;【規(guī)則-4】:程序塊中的begin、end獨(dú)立成行?!疽?guī)則-5】:程序塊采用縮進(jìn)風(fēng)格書寫,保證代碼清晰易讀,風(fēng)格一致,縮進(jìn)格數(shù)統(tǒng)一。例: beginupdate cfg_cdr_refresh set
35、 change_time=sysdate where cfg_type=5;if sql%rowcount = 0 theninsert into cfg_cdr_refresh(cfg_type,change_time,state)values(5,sysdate,0);end if; end trg_cfg_city_host_qry_all;【規(guī)則-6】:不允許把多個(gè)語句寫在一行中,即一行只寫一條語句?!疽?guī)則-7】:同一條語句占用多于一行時(shí),每行的第一個(gè)關(guān)鍵字應(yīng)當(dāng)左對齊,例:select * into v_gsm_user from gsm_userwhere msisdn = to_n
36、umber(trim(i_phone_number)and user_city = i_city_id;【規(guī)則-8】:對于 insert values 和 update 語句,一行寫一個(gè)字段,字段后面緊跟注釋(注釋語句左對齊),values 和 insert 左對齊,左括號和右括號與 insert、values 左對齊例:insert into table_name(user_id,-用戶 id,主鍵user_name,-用戶名login_name -登錄名)values( v_user_id,v_user_name,v_login_name)【規(guī)則-9】:相對獨(dú)立的程序塊之間需加空行。例:-
37、判斷套餐是否可增加成員并獲得專網(wǎng)標(biāo)志 begin select use_date, decode(package_type, 1000, 1, 0) exceptionend;-如果為手機(jī)號碼if i_number_type = 0 thenbegin end;【規(guī)則-10】:超過110列的語句要分行書寫,長表達(dá)式應(yīng)在低優(yōu)先級操作符處換行,操作符或關(guān)鍵字放在新行之首。例:v_exchangeable_score := (v_score_phone_score + v_score_bounty_score + v_score_gift_score - v_score_alr_excg_score
38、)+ (v_pre_score_phone_score + v_pre_score_bounty_score - v_pre_score_alr_excg_score)3.3.2 注釋規(guī)范【規(guī)則-1】:所有變量定義都要加上注釋,說明變量的用途及含義。例:create or replace procedure sp_sms_zoneas v_city number(2); -監(jiān)控信息變量 v_db number(2); -數(shù)據(jù)庫代碼 v_total number(10) :=0; -發(fā)送總數(shù) v_succ number(10) :=0; -成功數(shù) v_fail number(10) :=0; -
39、沒有發(fā)送數(shù) v_srl number(10) ; -記錄流水o_flag number; -調(diào)用sp_send_query_sms返回的標(biāo)識 end sp_sms_zone;/【規(guī)則-2】:注釋內(nèi)容要清晰、明了,含義準(zhǔn)確,防止注釋二義性。例:正確:ret_code out integer,-返回代碼(0 成功 ,其它:錯(cuò)誤,參見:錯(cuò)誤代碼定義);錯(cuò)誤:ret_code out integer,-返回代碼【規(guī)則-3】:對存儲過程的任何修改,都需要在注釋最后添加修改人、修改日期及修改原因等信息。例:/*修改原因:修改積分兌換和積分轉(zhuǎn)贈修改人:* 修改時(shí)間:2006-01-05*/【規(guī)則-4】:對程
40、序分支必須書寫注釋。例:-如果為手機(jī)號碼if i_number_type = 0 thenbegin end;【規(guī)則-5】:在代碼的功能、意圖層次上進(jìn)行注釋,幫助維護(hù)人員理解代碼。例:case rdm_type1 when 1 then -積分獎勵 . . when 2 then -扣減(停用) . . when 3 then -積分兌換 . .end case;【規(guī)則-6】:代碼注釋應(yīng)放在描述的代碼上方或右方相近位置,不可放在下面。例:-查詢轉(zhuǎn)出用戶的積分信息sp_score_query( s_user_id, -用戶id rdm_city_id, -地市id )【規(guī)則-7】:注釋與所描述的
41、內(nèi)容進(jìn)行同樣的縮排。例:-未達(dá)到可兌換標(biāo)準(zhǔn)if v_score_change_flag=0 then -對于兌換類型為961的,取消1000分門限的限制。 if rdm_type2 = 961 or rdm_type2 = 962 then end if;end if;【規(guī)則-8】:函數(shù)應(yīng)對返回的代碼進(jìn)行詳細(xì)描述。例:create or replace function fn_check_brand_package( i_package number, i_user_id number, i_brand_id number := 0, i_pay_mode number := 0 ) retu
42、rn number isresult number(1):=0; -0表示沒有限制 ,其他表示有品牌限制 end fn_check_brand_package;【規(guī)則-9】:在程序塊的結(jié)束行右方加注釋,以表示程序塊結(jié)束。例:-未達(dá)到可兌換標(biāo)準(zhǔn)if v_score_change_flag=0 then end if;-未達(dá)到可兌換標(biāo)準(zhǔn)處理結(jié)束【規(guī)則-10】:統(tǒng)一文件頭的注釋。例:create or replace procedure sysmgmt.sp_encrypt3(i_pwdin varchar2,o_new_pwdout varchar2,o_flag out number) is /
43、*功能描述:密碼加密腳本,本存儲過程用于把指定的明文密碼轉(zhuǎn)化為密文參數(shù)描述:pwd:輸入明文密碼,new_pwd:輸出的密文,o_flag:輸出結(jié)果的狀態(tài)(0:right,1:error)修改歷史: 2005-12-28 *,修改加密方式為密鑰方式; 2005-05-16 *,修改加密算法;2005-01-01 *,創(chuàng)建腳本;*/bl1varchar(1);bl2varchar(1);begin end;3.3.3 語法規(guī)范【規(guī)則-1】:存儲過程的in、out參數(shù)應(yīng)按類別分開書寫,不要交叉。例:create or replace procedure sp_create_scp( i_gsm_u
44、ser_id number, -用戶號碼 i_order_code number, -命令代碼 i_operation_type number, -工單類型 i_operating_srl number, -操作流水 o_operation_srl out number, -工單流水(返回參數(shù)) o_flag out number, -成功 0 ,失敗 1 o_msg out varchar2 )begin end;【規(guī)則-2】:存儲過程中變量的聲明應(yīng)集中在is和begin關(guān)鍵字之間申明例:create or replace procedure sp_create_scp( )is v_use
45、r gsm_user%rowtype; -用戶信息 v_value varchar2(30); ncnt number(5):=0; npriority number(2):=0;begin end;【規(guī)則-3】:盡可能使用相關(guān)表字段類型來定義相關(guān)的變量,如%type,%rowtype。說明:一般變量,都可能會用于表的查詢條件,或增加記錄的值;當(dāng)字段數(shù)據(jù)類型發(fā)生變更時(shí),對應(yīng)的變量無需修改。例:v_user gsm_user%rowtype; -用戶信息select * from gsm_user where gsm_user_id = v_user;當(dāng)gsm_usre_id的類型變成字符型時(shí),
46、該段代碼無需修改?!疽?guī)則-4】:確保所有的變量和參數(shù)都用到,沒有用到的變量和參數(shù)要刪除。【規(guī)則-5】:存儲過程有多個(gè)分支返回時(shí),若有事務(wù)控制,需確保各個(gè)分支都結(jié)束事務(wù)。異常時(shí),應(yīng)該在exception中捕捉異常,并進(jìn)行事務(wù)處理?!疽?guī)則-6】:存儲過程:不要在異常部分,進(jìn)行正常的業(yè)務(wù)處理。說明:從程序的易讀性、易維護(hù)性考慮,不要在異常處理部分,包含正常的業(yè)務(wù)處理部分。例:(不好的寫法)exceptionwhen no_data_found then-沒有找到記錄,則重新查找其他數(shù)據(jù)select * from .end;【規(guī)則-7】:原則上不要使用動態(tài) sql,如果必須使用,需綁定變量,綁定變量寫
47、法:query_string :=select pr_template from bssp.bssp_process_template where process_id=:ora_process_id for update; execute immediate query_string into lob using 38880003;【規(guī)則-8】:代碼中的異常捕獲返回結(jié)果,要加上oracle的異常sqlerrm(oracle的一個(gè)session級的全局變量)。例:exception when others thenrollback; oresult :=1; omsg := others|su
48、bstr(sqlerrm,200);end;【規(guī)則-10】:捕捉到異常后需要rollback回滾事務(wù)。例:exception when others thenrollback; oresult :=1; omsg := others|sqlerrm;end;3.3.4 sql性能規(guī)范3.3.4.1 批量操作,避免頻繁使用commit頻繁的commit會導(dǎo)致物理i/o增大,同時(shí)會產(chǎn)生log file sync等待,但長時(shí)間不提交將帶來更多的性能問題。建議小于3秒的事務(wù)可以一次提交,大于3秒的操作盡可能3秒左右提交一次。實(shí)際應(yīng)用中使用commit時(shí)必須保證事務(wù)的完整性。3.3.4.2 避免動態(tài)sq
49、l,要使用綁定變量方式為了不重復(fù)解析相同的sql語句,在第一次解析之后,oracle將sql語句緩存在內(nèi)存中,當(dāng)你執(zhí)行一個(gè)sql語句時(shí),如果它和之前的執(zhí)行過的語句完全相同,oracle就能很快獲得內(nèi)存中相同語句的執(zhí)行計(jì)劃,然后就直接執(zhí)行該語句,而不需要進(jìn)行解析。如果沒有使用綁定變量,雖然語句結(jié)構(gòu)相同,但因傳入的變量不一樣導(dǎo)致語句不相同,oracle還是需要對每條結(jié)構(gòu)相同的語句重新解析一遍,同時(shí)在內(nèi)存中緩存該語句,導(dǎo)致共享池中存放了n條結(jié)構(gòu)相同的語句,達(dá)不到共享的目的,又浪費(fèi)了大量的內(nèi)存空間,如果語句執(zhí)行的太頻繁,會導(dǎo)致數(shù)據(jù)庫無法申請共享內(nèi)存而出錯(cuò)。java代碼示例:a. 未使用綁定變量:.tr
50、y string ssql = select * from my_table where field=1; pstmt = connection.preparestatement(ssql); pstmt.executeupdate(); /執(zhí)行動態(tài)sql語句 .b. 使用綁定變量:.trystring ssql = select * from my_table where field=?;pstmt = connection.preparestatement(ssql);pstmt.setstring(1, scode); /scode為傳入變量 pstmt.executeupdate();
51、 /執(zhí)行動態(tài)sql語句 .c/c+代碼示例a. 未使用綁定變量:/處理傳入的參數(shù),構(gòu)造動態(tài)sql語句 sprintf(sztmp1, select to_char(apply_date, yyyymmddhh24miss), from user_smscall where (gsm_user_id = %s ) , ora_gsm_user_id); exec sql prepare sql from :sqlstmt; /prepare /定義游標(biāo)exec sql declare user_smscall_cu_1 cursor for sql;exec sql open user_smscall_cu_1;b. 使用綁定變量:/處理傳入的參數(shù),構(gòu)造動態(tài)sql語句 sprintf(sztmp1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司生日會文案策劃方案
- 公司班組拓展活動方案
- 公司端午節(jié)DIY包粽子活動方案
- 公司摘橙子活動方案
- 公司花園種植活動方案
- 公司科技展廳策劃方案
- 公司組織游玩兒活動方案
- 公司組織游戲策劃方案
- 公司猜照片活動策劃方案
- 2025年中級會計(jì)考試試卷及答案
- 《詳述腦卒中及其治療:抗擊腦卒中的策略與護(hù)理課件》
- 2025-2030中國柴油發(fā)動機(jī)行業(yè)市場發(fā)展分析及前景趨勢與投資研究報(bào)告
- 夏季防火安全常識培訓(xùn)
- 人教部編版八年級下冊關(guān)雎教案設(shè)計(jì)
- (四調(diào))武漢市2025屆高中畢業(yè)生四月調(diào)研考試 數(shù)學(xué)試卷(含答案詳解)
- DB31T 1564-2025企業(yè)實(shí)驗(yàn)室危險(xiǎn)化學(xué)品安全管理規(guī)范
- 氟斑牙的健康宣教
- 2025版校園食堂日管控、周排查、月調(diào)度記錄表
- 2024年生活方式酒店研究報(bào)告
- ISO 37001-2025 反賄賂管理體系要求及使用指南(中文版-雷澤佳譯-2025)
- 特種設(shè)備安全管理的應(yīng)急預(yù)案編制
評論
0/150
提交評論