轉載:數據庫邏輯設計原則

數據庫邏輯設計原則
 
2.1 命名規範 2.1.1 表屬性規範 2.1.1.1 表名 前綴爲Tbl_ 。數據表名稱必須以有特徵含義的單詞或縮寫組成,中間可以用“_”分割,例如:tbl_pstn_detail。表名稱不能用雙引號包含。 2.1.1.2 表分區名 前綴爲p 。分區名必須有特定含義的單詞或字串。 例如 :tbl_pstn_detail 的分區p2004100101表示該分區存儲 2004100101時段的數據。 2.1.1.3 字段名 字段名稱必須用字母開頭,採用有特徵含義的單詞或縮寫,不能用雙引號包含。 2.1.1.4 主鍵名 前綴爲PK_。主鍵名稱應是 前綴+表名+構成的字段名。如果複合主鍵的構成字段較多,則只包含第一個字段。表名可以去掉前綴。 2.1.1.5 外鍵名 前綴爲FK_。外鍵名稱應是 前綴+ 外鍵表名 + 主鍵表名 + 外鍵表構成的字段名。表名可以去掉前綴。 2.1.2 索引 4.1.2.1 普通索引 前綴爲IDX_。索引名稱應是 前綴+表名+構成的字段名。如果複合索引的構成字段較多,則只包含第一個字段,並添加序號。表名可以去掉前綴。 2.1.2.2 主鍵索引 前綴爲IDX_PK_。索引名稱應是 前綴+表名+構成的主鍵字段名,在創建表時候用using index指定主鍵索引屬性。 2.1.2.3 唯一所以 前綴爲IDX_UK_。索引名稱應是 前綴+表名+構成的字段名。 2.1.2.4 外鍵索引 前綴爲IDX_FK_。索引名稱應是 前綴+表名+構成的外鍵字段名。 2.1.2.5 函數索引 前綴爲IDX_func_。索引名稱應是 前綴+表名+構成的特徵表達字符。 2.1.2.6 蔟索引 前綴爲IDX_clu_。索引名稱應是 前綴+表名+構成的簇字段。 2.1.3 視圖 前綴爲V_。按業務操作命名視圖。 2.1.4 實體化視圖 前綴爲MV_。按業務操作命名實體化視圖。 2.1.5 存儲過程 前綴爲Proc_ 。按業務操作命名存儲過程 2.1.6 觸發器 前綴爲Trig_ 。觸發器名應是 前綴 + 表名 + 觸發器名。 2.1.7 函數 前綴爲Func_ 。按業務操作命名函數 2.1.8 數據包 前綴爲Pkg_ 。按業務操作集合命名數據包。 2.1.9 序列 前綴爲Seq_ 。按業務屬性命名。 2.1.10 表空間 2.1.10.1 公用表空間 前綴爲Tbs_ 。 根據存儲的特性命名,例如: tbs_parameter 。 2.1.10.2 專用表空間 Tbs_<表名稱>_nn。該表空間專門存儲指定的某一個表,或某一表的若干個分區的數據 2.1.11 數據文件 <表空間名>nn.dbf 。nn =1,2,3,4,…等。 2.1.12 普通變量 前綴爲Var_ 。 存放字符、數字、日期型變量。 2.1.13 遊標變量 前綴爲Cur_ 。存放遊標記錄集。 2.1.14 記錄型變量 前綴爲Rec_ 。 存放記錄型數據。 2.1.15 表類型變量 前綴爲Tab_ 。 存放表類型數據。 2.1.16 數據庫鏈 前綴爲dbl_ 。 表示分佈式數據庫外部鏈接關係。 2.2 命名 2.2.1 語言 命名應該使用英文單詞,避免使用拼音,特別不應該使用拼音簡寫。命名不允許使用中文或者特殊字符。 英文單詞使用用對象本身意義相對或相近的單詞。選擇最簡單或最通用的單詞。不能使用毫不相干的單詞來命名 當一個單詞不能表達對象含義時,用詞組組合,如果組合太長時,採用用簡或縮寫,縮寫要基本能表達原單詞的意義。 當出現對象名重名時,是不同類型對象時,加類型前綴或後綴以示區別。 2.2.2 大小寫 名稱一律大寫,以方便不同數據庫移植,以及避免程序調用問題。 2.2.3 單詞分隔 命名的各單詞之間可以使用下劃線進行分隔。 2.2.4 保留字 命名不允許使用SQL保留字。 2.2.5 命名長度 表名、字段名、視圖名長度應限制在20個字符內(含前綴)。 2.2.6 字段名稱 同一個字段名在一個數據庫中只能代表一個意思。比如telephone在一個表中代表“電話號碼”的意思,在另外一個表中就不能代表“手機號碼”的意思。 不同的表用於相同內容的字段應該採用同樣的名稱,字段類型定義。 2.3 數據類型 2.3.1 字符型 固定長度的字串類型採用char,長度不固定的字串類型採用varchar。避免在長度不固定的情況下采用char類型。如果在數據遷移等出現以上情況,則必須使用trim()函數截去字串後的空格。 2.3.2 數字型 數字型字段儘量採用number類型。 2.3.3 日期和時間 2.3.3.1 系統時間 由數據庫產生的系統時間首選數據庫的日期型,如DATE類型。 2.3.3.2 外部時間 由數據導入或外部應用程序產生的日期時間類型採用varchar類型,數據格式採用:YYYYMMDDHH24MISS。 2.3.3.3 大字段 如無特別需要,避免使用大字段(blob,clob,long,text,image等)。 2.3.3.4 唯一鍵 對於數字型唯一鍵值,儘可能用系列sequence產生。 2.4 設計 2.4.1 範式 如 無性能上的必須原因,應該使用關係數據庫理論,達到較高的範式,避免數據冗餘,但是如果在數據量上與性能上無特別要求,考慮到實現的方便性可以有適當的數 據冗餘,但基本上要達到3NF.如非確實必要,避免一個字段中存儲多個標誌的做法。如11101表示5個標誌的一種取值。這往往是增加複雜度,降低性能的 地方。 2.4.2 表設計 2.4.2.1 邏輯段設計原則 2.4.2.1.1 Tablespace 每個表在創建時候,必須指定所在的表空間,不要採用默認表空間以防止表建立在系統表空間上導致性能問題。對於事務比較繁忙的數據表,必須存放在該表的專用表空間中。 2.4.2.1.2 Pctused 默認pctused導致數據庫物理空間利用率非常低40%左右;對於update比較少或update不導致行增大的表,pctused可設置在60—85之間;對於update能夠導致行增大的表,update設置在40—70之間 2.4.2.1.3 Initrans 對於需要並行查詢或者在RAC數據庫中需要並行處理的表,initrans設置爲2的倍數,否則,不設該值。 2.4.2.1.4 Storage 2.4.2.1.4.1 Initial 儘量減少表數據段的extents數量,initial的大小盡量接近數據段的大小64K,128K,… ,1M,2M,4M,8M,16M ,…,等按2的倍數進行圓整。例如表或分區數據段大小爲28M,則initial取32M。 2.4.2.1.4.2 Next 表 或分區擴展extents的大小,按上述方法進行圓整。當表或分區數據段無法按Initial接近值進行圓整的情況下,其大小可以按 Initial+Next進行圓整。此時,必須設置Minextents=2。例如:表或分區數據段大小爲150M,則Initial=128M; Next=32M,Minextents=2。 2.4.2.1.4.3 Minextents 該參數表示表創建時候Extents的初始數量,一般取1—2。 2.4.2.1.4.4 Pctincrease 表示每個擴展Extents的增長率,設置pctincrease=0能夠獲得較好的存儲性能。 2.4.2.2 特殊表設計原則 2.4.2.2.1 分區表 對 於數據量比較大的表,根據表數據的屬性進行分區,以得到較好的性能。如果表按某些字段進行增長,則採用按字段值範圍進行範圍分區;如果表按某個字段的幾個 關鍵值進行分佈,則採用列表分區;對於靜態表,則採用hash分區或列表分區;在範圍分區中,如果數據按某關鍵字段均衡分佈,則採用子分區的複合分區方 法。 2.4.2.2.2 聚蔟表 如果某幾個靜態表關係比較密切,則可以採用聚蔟表的方法。 2.4.2.3 完整性設計原則 2.4.2.3.1 主鍵約束 關聯表的父表要求有主健,主健字段或組合字段必須滿足非空屬性和唯一性要求。對於數據量比較大的父表,要求指定索引段。 2.4.2.3.2 外鍵關聯 對於關聯兩個表的字段,一般應該分別建立主鍵、外鍵。實際是否建立外鍵,根據對數據完整性的要求決定。爲了提高性能,對於數據量比較大的標要求對外健建立索引。對於有要求級聯刪除屬性的外鍵,必須指定on delete cascade 。 2.4.2.3.3 NULL值 對於字段能否null,應該在sql建表腳本中明確指明,不應使用缺省。由於NULL值在參加任何運算中,結果均爲NULL。所以在應用程序中必須利用nvl()函數把可能爲NULL值得字段或變量轉換爲非NULL的默認值。例如:NVL(sale,0)。 2.4.2.3.4 Check條件 對於字段有檢查性約束,要求指定check規則。 2.4.2.3.5 觸發器 觸發器是一種特殊的存儲過程,通過數據表的DML操作而觸發執行,起作用是爲確保數據的完整性和一致性不被破壞而創建,實現數據的完整約束。 觸發器的before或after事務屬性的選擇時候,對錶操作的事務屬性必須與應用程序事務屬性保持一致,以避免死鎖發生。在大型導入表中,儘量避免使用觸發器。 2.4.2.4 註釋 表、字段等應該有中文名稱註釋,以及需要說明的內容。 2.4.3 索引設計 對於查詢中需要作爲查詢條件的字段,可以考慮建立索引。最終根據性能的需要決定是否建立索引。對於複合索引,索引字段順序比較關鍵,把查詢頻率比較高的字段排在索引組合的最前面。在分區表中,儘量採用local分區索引以方便分區維護。 除非時分區local索引,否則在創建索引段時候必須指定指定索引段的tablespace、storage屬性,具體參考4.4.2.1內容。 2.4.4 視圖設計 視圖是虛擬的數據庫表,在使用時要遵循以下原則: 從一個或多個庫表中查詢部分數據項; 爲簡化查詢,將複雜的檢索或字查詢通過視圖實現; 提高數據的安全性,只將需要查看的數據信息顯示給權限有限的人員; 視圖中如果嵌套使用視圖,級數不得超過3級; 由於視圖中只能固定條件或沒有條件,所以對於數據量較大或隨時間的推移逐漸增多的庫表,不宜使用視圖;可以採用實體化視圖代替。 除特殊需要,避免類似Select * from [TableName] 而沒有檢索條件的視圖; 視圖中儘量避免出現數據排序的SQL語句。 2.4.5 包設計 存 儲過程、函數、外部遊標必須在指定的數據包對象PACKAGE中實現。存儲過程、函數的建立如同其它語言形式的編程過程,適合採用模塊化設計方法;當具體 算法改變時,只需要修改需要存儲過程即可,不需要修改其它語言的源程序。當和數據庫頻繁交換數據是通過存儲過程可以提高運行速度,由於只有被授權的用戶才 能執行存儲過程,所以存儲過程有利於提高系統的安全性。 存儲過程、函數必須檢索數據庫表記錄或數據庫其他對象,甚至修改(執行 Insert、Delete、Update、Drop、Create等操作)數據庫信息。如果某項功能不需要和數據庫打交道,則不得通過數據庫存儲過程或 函數的方式實現。在函數中避免採用DML或DDL語句。 在數據包採用存儲過程、函數重載的方法,簡化數據包設計,提高代碼效率。存儲過程、函數必須有相應的出錯處理功能。 2.4.6 安全性設計 4.4.6.1 管理默認用戶 在生產環境中,必須嚴格管理sys和system用戶,必須修改其默認密碼,禁止用該用戶建立數據庫應用對象。刪除或鎖定數據庫測試用戶scott 。 2.4.6.2 數據庫級用戶權限設計 必須按照應用需求,設計不同的用戶訪問權限。包括應用系統管理用戶,普通用戶等,按照業務需求建立不同的應用角色。 用戶訪問另外的用戶對象時,應該通過創建同義詞對象synonym進行訪問。 2.4.6.3 角色與權限 確定每個角色對數據庫表的操作權限,如創建、檢索、更新、刪除等。每個角色擁有剛好能夠完成任務的權限,不多也不少。在應用時再爲用戶分配角色,則每個用戶的權限等於他所兼角色的權限之和。 2.4.6.4 應用級用戶設計 應用級的用戶帳號密碼不能與數據庫相同,防止用戶直接操作數據庫。用戶只能用帳號登陸到應用軟件,通過應用軟件訪問數據庫,而沒有其它途徑操作數據庫。 2.4.6.5 用戶密碼管理 用戶帳號的密碼必須進行加密處理,確保在任何地方的查詢都不會出現密碼的明文。 2.5 SQL編寫 2.5.1 字符類型數據 SQL中的字符類型數據應該統一使用單引號。特別對純數字的字串,必須用單引號,否則會導致內部轉換而引起性能問題或索引失效問題。利用trim(),lower()等函數格式化匹配條件。 2.5.2 複雜sql 對於非常複雜的sql(特別是有多層嵌套,帶子句或相關查詢的),應該先考慮是否設計不當引起的。對於一些複雜SQL可以考慮使用程序實現。 USER_TAB_COMMENTS 數據字典 Comment on 可加註解 2.5.3 高效性 2.5.3.1 避免In子句 使用In 或 not In子句時,特別是當子句中有多個值時,且查詢數據表數據較多時,速度會明顯下降。可以採用連接查詢或外連接查詢來提高性能。 Char 比 varchar 查詢時高詢 在進行查詢及建立索引時,char比varchar的效率要高,當然varchar在存儲上比char要好 2.5.3.2 避免嵌套的Select子句 這個實際上是In子句的特例。 2.5.3.3 避免使用Select * 語句 如果不是必要取出所有數據,不要用*來代替,應給出字段列表,注:不含select count(*)。 2.5.3.4 避免不必要的排序 不必要的數據排序大大的降低系統性能。 2.5.4 健壯性 2.5.4.1 Insert語句 使用Insert語句一定要給出要插入值的字段列表,這樣即使更改了表結構加了字段也不會影響現有系統的運行。 2.5.4.2 Count(*)、Count(*)、count(distinct id)的區別 Select count(*) from testtab 得到表testtab的記錄數 select count(id) from testtab 得到表testtab id字段非空記錄數 select count(distinct id) from testtab 得到表testtab id字段值非相同記錄數 2.5.4.3 Not null 爲字段類型性質的約束 本約束功能在後期無語法使期失效,可使用修改字段類型方式 alter table modify 字段名 類型 not null alter table modify 字段名 類型 2.5.4.4 外鍵值可用null的問題 外鍵列如沒有明確說明not null,可插入null記錄(而null是在外部表的記錄中沒有的),如無可插null記錄的想法,要對外鍵字段加not null約束。 2.5.4.5 序列 sequence 跳號的問題 sequence 因回滾,系統崩潰(使用cache 內的值將認爲已用),多表引用都將使其跳號,所以不能用於爲連續序號 utl_row.cast_to_row 2.5.4.6 unicn\ intersect\ minus 使用ordey by的注意事項 以上語句進行連表操作,而表同表的字段順序的類型相同但字段標題名可不同,使用ordey by時後面如果是字段名,要求所有的表的字段標題名相同,否則用字段的順序號 select id,name,year from user1 union select no,name,to_number(null) year from user2 order by 1,name,year 2.5.5 安全性 2.5.5.1 Where 條件 無論在使用Select,還是使用破壞力極大的Update和Delete語句時,一定要檢查Where條件判斷的完整性,不要在運行時出現數據的重大丟失。如果不確定,最好先用Select語句帶上相同條件來果一下結果集,來檢驗條件是否正確。 2.5.6 完整性 有 依賴關係的表,例如主外鍵關係表,在刪除父表時必須級聯刪除其子表相應數據,或則按照某種業務規則轉移該數據。9I中表中字段縮小及變類型,字段爲空或表 空,varchar和char長度不變可任意改,字段名和表名可字段可用 ALTER TABLE table SET UNUSED (column) 設定爲不可用,注意無命令再設爲可用
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
閱讀(446) | 評論(0) | 轉發(0) |
給主人留下些什麼吧!~~
評論熱議
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章