数据库设计(三)——数据库设计规范
一、數(shù)據(jù)庫設(shè)計規(guī)范簡介
1、數(shù)據(jù)庫設(shè)計規(guī)范化的要求
A、表中應(yīng)該避免可為空的列
B、表不應(yīng)該有重復(fù)的值或者列
C、表中記錄應(yīng)該有一個唯一的標(biāo)識符
D、數(shù)據(jù)庫對象要有統(tǒng)一的前綴名
E、盡量只存儲單一實(shí)體類型的數(shù)據(jù)
2、數(shù)據(jù)庫設(shè)計規(guī)范化的目的
A、消滅重復(fù)數(shù)據(jù)。
B、避免編寫不必要的,用來使重復(fù)數(shù)據(jù)同步的代碼。
C、保持表的瘦身,以及減從一張表中讀取數(shù)據(jù)時需要進(jìn)行的讀操作數(shù)量。
D、最大化聚集索引的使用,從而可以進(jìn)行更優(yōu)化的數(shù)據(jù)訪問和聯(lián)結(jié)。
E、減少每張表使用的索引數(shù)量,因?yàn)榫S護(hù)索引的成本很高。
二、數(shù)據(jù)庫表設(shè)計規(guī)范
1、規(guī)范化與反規(guī)范化
規(guī)范化的優(yōu)點(diǎn)是減少了數(shù)據(jù)冗余,節(jié)約了存儲空間,相應(yīng)邏輯和物理的I/O次數(shù)減少,同時加快了增、刪、改的速度。但完全規(guī)范化的設(shè)計并不總能生成最優(yōu)的性能,因?yàn)閷?shù)據(jù)庫查詢通常需要更多的連接操作,從而影響到查詢的速度,而且范式越高性能就會越差。出于性能和方便管理的考慮,原則上表設(shè)計應(yīng)滿足第三范式。有時為了提高某些查詢或應(yīng)用的性能而可以破壞規(guī)范規(guī)則,即反規(guī)范化。
數(shù)據(jù)應(yīng)當(dāng)按兩種類別進(jìn)行組織:頻繁訪問的數(shù)據(jù)和頻繁修改的數(shù)據(jù)。對于頻繁訪問但是不頻繁修改的數(shù)據(jù),內(nèi)部設(shè)計應(yīng)當(dāng)物理不規(guī)范化。對于頻繁修改但并不頻繁訪問的數(shù)據(jù),內(nèi)部設(shè)計應(yīng)當(dāng)物理規(guī)范化。比較復(fù)雜的方法是將規(guī)范化的表作為邏輯數(shù)據(jù)庫設(shè)計的基礎(chǔ),然后再根據(jù)整個應(yīng)用系統(tǒng)的需要,物理地非規(guī)范化數(shù)據(jù)。
2、數(shù)據(jù)表分類說明
根據(jù)應(yīng)用的實(shí)際需要和特點(diǎn),可以將數(shù)據(jù)表進(jìn)行如下分類:
基本數(shù)據(jù)表:描述業(yè)務(wù)實(shí)體的基本信息。例如,人員基本信息、單位基本信息等。
標(biāo)準(zhǔn)編碼表:描述屬性的列表值。例如,職稱、民族、狀態(tài)等。
業(yè)務(wù)數(shù)據(jù)表:記錄業(yè)務(wù)發(fā)生的過程和結(jié)果。例如,人員調(diào)動登記、變更通知單等。
系統(tǒng)信息表:存放與系統(tǒng)操作、業(yè)務(wù)控制有關(guān)的參數(shù)。例如,用戶信息、權(quán)限、用戶配置信息等。
統(tǒng)計數(shù)據(jù)表:存放業(yè)務(wù)數(shù)據(jù)統(tǒng)計值。例如,通知單統(tǒng)計、人員類別統(tǒng)計等。
臨時處理表:存放業(yè)務(wù)處理過程中的中間結(jié)果。
其他類型表:存放應(yīng)用層的日志、消息記錄等。
3、字段設(shè)計規(guī)范
(1)一般來說,應(yīng)該使用能正確存儲和表示數(shù)據(jù)的最小類型。如果不確定需要什么數(shù)據(jù)類型,則選擇不會超出范圍的最小類型。
(2)選擇更簡單的數(shù)據(jù)類型。例如,比較整數(shù)的代價小于比較字符,因?yàn)樽址团判蛞?guī)則使字符比較更復(fù)雜。
(3)盡可能把字段定義為NOT NULL。對于字段能否NULL,應(yīng)該在SQL建表腳本中明確指明,不應(yīng)使用缺省。
(4)一個表中的字段不要太多,理論上不要超過80個。
(5)數(shù)據(jù)庫中所有布爾型中數(shù)值0表示為假;數(shù)值1表示為真
(6)當(dāng)字段定義為字符串類型時使用VARCHAR2而不用NVARCHAR
(7)字段盡可能有默認(rèn)值,字符型的默認(rèn)值為一個空字符值串,數(shù)字型的默認(rèn)值為數(shù)值0。
4、鍵設(shè)計規(guī)范
(1)為關(guān)聯(lián)字段創(chuàng)建外鍵。
(2)所有的鍵都必須唯一。
(3)盡可能避免使用復(fù)合鍵。
(4)外鍵總是關(guān)聯(lián)唯一的鍵字段。
(5)盡可能使用系統(tǒng)生成(如序列SEQUENCE產(chǎn)生)的主鍵。
(6)可選鍵有時可做主鍵。
(7)一個表中組合主鍵的字段個數(shù)盡可能少。
5、索引設(shè)計規(guī)范
(1)如果一列出現(xiàn)在表達(dá)式或函數(shù)中,不會使用該列上的索引
(2)要索引外鍵
(3)對于索引選擇性高的列使用B-Tree索引
(4)對于索引選擇性低的列使用位圖索引
(5)HASH索引只適用于相等比較
(6)不要索引大型字段(有很多字符的字段)
(7)不要索引常用的小型表
6、LOB設(shè)計規(guī)范
如無特別需要,避免使用大字段(BLOB、CLOB、LONG等)。如使用時必須使用BLOB或CLOB類型。
三、完整性設(shè)計規(guī)范
采用數(shù)據(jù)庫系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)的完整性,不但包括通過標(biāo)準(zhǔn)化實(shí)現(xiàn)的完整性而且還包括數(shù)據(jù)的功能性。在寫數(shù)據(jù)的時候還可以增加觸發(fā)器來保證數(shù)據(jù)的正確性。不要依賴于應(yīng)用程序保證數(shù)據(jù)完整性,它不能保證表之間(外鍵)的完整性。
1、主鍵約束
每個表要求有主健,主健字段或組合字段必須滿足非空屬性和唯一性要求。
2、外鍵約束
(1)對于關(guān)聯(lián)兩個表的字段,一般應(yīng)該分別建立主鍵、外鍵。實(shí)際是否建立外鍵,根據(jù)對數(shù)據(jù)完整性的要求決定。
(2)根據(jù)需要適當(dāng)設(shè)置父表數(shù)據(jù)修改時對子表的影響:
父表中刪除數(shù)據(jù):級聯(lián)刪除;受限刪除;置空值。
父表中插入數(shù)據(jù):受限插入;遞歸插入。
父表中更新數(shù)據(jù):級聯(lián)更新;受限更新;置空值。
3、NULL值
由于NULL值在參加任何運(yùn)算時,結(jié)果均為NULL,所以必須利用NVL()函數(shù)把可能為NULL值得字段或變量轉(zhuǎn)換為非NULL的默認(rèn)值。
4、CHECK條件
對于字段有檢查性約束,要求指定CHECK規(guī)則。
5、觸發(fā)器
觸發(fā)器是一種特殊的存儲過程,通過對表的DML操作而觸發(fā)執(zhí)行,是為確保數(shù)據(jù)的完整性和一致性不被破壞而創(chuàng)建,實(shí)現(xiàn)數(shù)據(jù)的完整約束。選擇觸發(fā)器的BEFORE或AFTER事務(wù)屬性的時候,對表操作的事務(wù)屬性必須與應(yīng)用程序事務(wù)屬性保持一致,以避免死鎖發(fā)生。在大量修改數(shù)據(jù)時,盡量避免使用觸發(fā)器。
6、視圖
為了在數(shù)據(jù)庫和應(yīng)用程序之間提供另一層抽象,可以為應(yīng)用程序建立專門的視圖而不必非要應(yīng)用程序直接訪問表。這樣做還在處理數(shù)據(jù)庫變更時提供了更多的自由。視圖是虛擬的數(shù)據(jù)庫表,在使用時要遵循以下原則:
為簡化查詢,將復(fù)雜的檢索或子查詢通過視圖實(shí)現(xiàn)。
提高數(shù)據(jù)的安全性,只將需要查看的數(shù)據(jù)信息顯示給權(quán)限有限的人員。
視圖中如果嵌套使用視圖,級數(shù)不要超過3級。
由于視圖中只能固定條件或沒有條件,所以對于數(shù)據(jù)量較大或隨時間的推移逐漸增多的表,不宜使用視圖,可以采用實(shí)體化視圖代替。
除特殊需要,避免類似SELECT * FROM [TableName] 而沒有檢索條件的視圖。
視圖中盡量避免出現(xiàn)數(shù)據(jù)排序的SQL語句。
四、安全性設(shè)計規(guī)范規(guī)范
1、管理默認(rèn)用戶
在生產(chǎn)環(huán)境中,必須嚴(yán)格管理SYS和SYSTEM用戶,必須修改其默認(rèn)密碼,禁止用該用戶建立應(yīng)用數(shù)據(jù)庫對象。刪除或鎖定SCOTT等默認(rèn)安裝但不使用的用戶。
2、數(shù)據(jù)庫級用戶權(quán)限設(shè)計
必須按照應(yīng)用需求,設(shè)計不同的用戶訪問權(quán)限。包括應(yīng)用系統(tǒng)管理用戶,普通用戶等,按照業(yè)務(wù)需求建立不同的應(yīng)用角色。用戶訪問另外的用戶對象時,應(yīng)該通過創(chuàng)建同義詞對象SYNONYM進(jìn)行訪問。
3、角色與權(quán)限
確定每個角色對數(shù)據(jù)庫表的操作權(quán)限,如創(chuàng)建、檢索、更新、刪除等。每個角色擁有剛好能夠完成任務(wù)的權(quán)限,不多也不少。在應(yīng)用時再為用戶分配角色,則每個用戶的權(quán)限等于他所兼角色的權(quán)限之和。
4、應(yīng)用級用戶設(shè)計
應(yīng)用級的用戶帳號密碼不能與數(shù)據(jù)庫相同,防止用戶直接操作數(shù)據(jù)庫。用戶只能用帳號登錄到應(yīng)用軟件,通過應(yīng)用軟件訪問數(shù)據(jù)庫,而沒有其它途徑操作數(shù)據(jù)庫。
5、用戶密碼管理
用戶帳號的密碼必須進(jìn)行加密處理,確保在任何地方查詢都不會出現(xiàn)密碼的明文。
五、SQL語句設(shè)計規(guī)范
1、字符類型數(shù)據(jù)
SQL中的字符類型數(shù)據(jù)應(yīng)該統(tǒng)一使用單引號。特別對純數(shù)字的字符串,必須用單引號,否則會導(dǎo)致內(nèi)部轉(zhuǎn)換而引起性能問題或索引失效問題。利用TRIM(),LOWER()等函數(shù)格式化匹配條件。
2、復(fù)雜SQL
對于非常復(fù)雜的SQL(特別是有多層嵌套,帶子句或相關(guān)子查詢的),應(yīng)該先考慮是否設(shè)計不當(dāng)引起的。對于一些復(fù)雜SQL可以考慮使用程序?qū)崿F(xiàn)。
3、避免IN子句
使用 IN 或 NOT IN 子句時,特別是當(dāng)子句中有多個值且表數(shù)據(jù)較多時,速度會明顯下降。可以采用連接查詢或外連接查詢來提高性能。
4、避免使用SELECT * 語句
如果不必要取出所有數(shù)據(jù),不要用 * 來代替,應(yīng)給出字段列表。
5、避免不必要的排序
不必要的數(shù)據(jù)排序大大的降低系統(tǒng)性能。
6、INSERT語句
使用INSERT語句一定要給出插入值的字段列表,這樣即使表加了字段也不會影響現(xiàn)有系統(tǒng)的運(yùn)行。
7、多表連接
做多表操作時,應(yīng)該給每個表取一個別名,每個表字段都應(yīng)該標(biāo)明其所屬哪個表。
8、參數(shù)的傳遞
SQL語句的編寫,變量盡量使用“?”綁定變量。
六、數(shù)據(jù)庫設(shè)計命名規(guī)范
1、數(shù)據(jù)庫命名基本原則
(1)所有命名采用26個英文大小寫字母和0-9這十個自然數(shù),加上下劃線_組成。不能出現(xiàn)其他字符(注釋除外)。
(2)長度不超過30個字符。
(3)實(shí)際名字盡量描述實(shí)體的內(nèi)容,由英文單詞、單詞組合或單詞縮寫組成,不以數(shù)字和_開頭。
(4)命名中禁止使用SQL關(guān)鍵字。
(5)對象名盡量短。
2、數(shù)據(jù)庫對象命名規(guī)范
數(shù)據(jù)庫對象包括表、視圖(查詢)、存儲過程(參數(shù)查詢)、函數(shù)、約束。對象名字由前綴和實(shí)際名字組成,長度不超過30。
前綴:使用小寫字母加下劃線
表??????? tb_?
視圖??????? view_
存儲過程??? sp _
函數(shù)??????? fn_
觸發(fā)器 trig_
局部變量 l_?
全局變量 g_
3、表命名規(guī)范
約定:表名由前綴和實(shí)際名字組成。
前綴:使用小寫字母tb_,代表表。實(shí)際名字中,一個系統(tǒng)盡量采取同一單詞,多個后面加_來連接區(qū)分。
因此,合法的表名類似如下。
tb_Member
tb_MemberInfo
tb_ForumBoard
表
表名如Order/UserAccout
符合以下規(guī)范:
(1)統(tǒng)一采用單數(shù)形式,反對Orders
(2)首字母大寫,多個單詞的話,單詞首字母大寫,反對order/Useraccout/ORDER
(3)避免中文拼音,反對AgentBaoCi
(4)避免下劃線連接,反對User_Accout(下劃線適用Oracle數(shù)據(jù)庫)
(5)避免名稱過長,反對WebsiteInfomationModifyRecord
(6)多對多關(guān)系表,以Mapping結(jié)尾,如UserRoleMapping
(7)避免保留字
表以單數(shù)形式名詞或名詞短語命名。如果表名僅有一個單詞,那么建議不使用縮寫,而是用完整的單詞。
主鍵:PK_<表名>?
外鍵:FK_<表名>_<主表名>_<外鍵字段名>
索引:IDX_<表名>_<構(gòu)成索引的字段名>
如果復(fù)合索引的構(gòu)成字段較多,則只包含第一個字段,并添加序號。
4、字段命名規(guī)范
字段由表的簡稱,實(shí)際名字組組成。如果此字段關(guān)聯(lián)另外的字段,那么加下劃線_連接關(guān)聯(lián)表字段的字段名。
因此,合法的字段名類似如下。
UserID_MeID
UserName
UserRegDate
字段
字段名如userID/userName/userType
符合以下規(guī)范:
(1)首個字母小寫,多個單詞的話,單詞首字母大寫,反對UserID/Userid
(2)必須有一主鍵,主鍵不直接用ID,而是表名+ID,如userID/orderID
(3)常用的字段name,不直接用name,而是表名+Name,如userName/orderName
(4)常用的字段desc,不直接用desc,而是表名+Desc,如userDesc/orderDesc
(5)大寫字母前必須包含至少兩個小寫的字母,反對uID/oID
(6)避免中文拼音
(7)避免下劃線連接
(8)避免名稱過長
(9)避免保留字?
對象
(1)存儲過程以SP_為前綴
(2)觸發(fā)器以TR_為前綴
(3)函數(shù)以FN_為前綴
(4)主鍵以PK_為前綴
(5)索引以IX_為前綴
(6)前綴后的首字母大寫,多個單詞的話,單詞首字母大寫,如SP_CountFee
(7)所有的關(guān)鍵字的所有字母必須大寫,如SELECT userID,username FROM User
采用有意義的字段名,應(yīng)該是易于理解,能表達(dá)字段功能的英文單詞或單詞縮寫,一般不超過三個英文單詞。
系統(tǒng)中所有屬于內(nèi)碼的字段(僅用于表示唯一性和程序內(nèi)部用到的標(biāo)識性字段),名稱取為:ID。
系統(tǒng)中屬于是業(yè)務(wù)范圍內(nèi)的編號的字段,其代表一定的業(yè)務(wù)信息,字段建議命名為CODE,其數(shù)據(jù)類型為VARCHAR,該字段需加唯一索引。
字段名不要與表名重復(fù)
不要在列的名稱中包含數(shù)據(jù)類型。
5、視圖命名規(guī)范
字段由前綴和實(shí)際名字組成,中間用下劃線連接。
前綴:使用小寫字母view,表示視圖。
因此,合法的視圖名類似如下。
view_User
view_UserInfo
6、存儲過程命名規(guī)范
約定:字段由前綴和實(shí)際名字加操作名字組成,中間用下劃線連接。
前綴:使用小寫字母sp,表示存儲過程。
操作名字:Insert|Delelte|Update|Caculate|Confirm
例如:
sp_User_Insert
7、SQL語句命名規(guī)范
約定:所有SQL關(guān)鍵詞全部大寫。
總結(jié)
以上是生活随笔為你收集整理的数据库设计(三)——数据库设计规范的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人脉经营
- 下一篇: python实现同花顺股票模拟交易+东方