數據庫技術是信息資源管理最有效的手段。數據庫設計是建立數據庫及其應用系統的核心和基礎,它要求對於指定的應用環境,構造出較優的數據庫模式,建立起數據庫應用系統,並使系統能有效地存儲數據,滿足用戶的各種應用需求。
1、設計數據庫之前
1)理解客戶需求,詢問用戶如何看待未來需求變化。讓客戶解釋其需求,而且隨着開發的繼續,還要經常詢問客戶以保證其需求仍然在開發的目的之中;
2)了解企業業務,在以后的開發階段節約大量時間;
3)重視輸入輸出。在定義數據庫表和字段需求(輸入)時,首先應檢查現有的或者已經設計出的報表、查詢和視圖(輸出),以決定為了支持這些輸出哪些是必要的表和字段;
4)創建數據字典和E-R 圖,對SQL 表達式的文檔化來說這是完全必要的;
5)定義標准的對象命名規范。
2、表與字段的設計
1)表設計原則
(1)標准化和規范化;
數據的標准化有助於消除數據庫中的數據冗余。標准化有好幾種形式,但Third Normal Form(3NF)通常被認為在性能、擴展性和數據完整性方面達到了最好平衡。事實上,為了效率的緣故,對表不進行標准化有時也是必要的。
(2)采用數據驅動,增強系統的靈活性與擴展性;
(3)在設計數據庫的時候考慮到哪些數據字段將來可能會發生變更。
2)字段設計原則
(1)每個表中都應該添加的3 個有用的字段;
①dRecordCreationDate,在SQL Server 下默認為GETDATE();
②sRecordCreator,在SQL Server 下默認為NOT NULL
DEFAULT USER;
③nRecordVersion,記錄的版本標記,有助於准確說明記錄中出現null 數據或者丟失數據的原因。
(2)對地址和電話采用多個字段,電話號碼和郵件地址最好擁有自己的數據表,其間具有自身的類型和標記類別;
(3)使用角色實體定義屬於某類別的列,創建特定的時間關聯關系,從而可以實現自我文檔化;
(4)選擇數字類型和文本類型要盡量充足,否則無法進行計算操作;
(5)增加刪除標記字段。在關系數據庫里不要單獨刪除某一行,而在表中包含一個“刪除標記”字段,這樣就可以把行標記為刪除。
3、鍵和索引
1)鍵選擇原則
(1)鍵設計4 原則
①所有的鍵都必須唯一;
②為關聯字段創建外鍵;
③避免使用復合鍵;
④外鍵總是關聯唯一的鍵字段。
(2)使用系統生成的主鍵,控制數據庫的索引完整性,並且當擁有一致的鍵結構時,找到邏輯缺陷很容易;
(3)不要用用戶的鍵,通常情況下不要選擇用戶可編輯的字段作為鍵;
(4)可選鍵有時可作主鍵,能擁有建立強大索引的能力。
2)索引使用原則
索引是從數據庫中獲取數據的最高效方式之一,絕大多數的數據庫性能問題都可以采用索引技術得到解決。
(1)邏輯主鍵使用唯一的成組索引,對系統鍵(作為存儲過程)采用唯一的非成組索引,對任何外鍵列采用非成組索引。考慮數據庫的空間有多大,表如何進行訪問,還有這些訪問是否主要用於讀寫;
(2)大多數數據庫都索引自動創建的主鍵字段,但是不能忘了索引外鍵,它們也是經常使用的鍵;
(3)不要索引memo/note 字段,不要索引大型字段,這樣會讓索引占用太多的存儲空間;
(4)不要索引常用的小型表,不要為小型數據表設置任何鍵,尤其當它們經常有插入和刪除操作時。
4、數據完整性設計
1)完整性實現機制
(1)實體完整性:主鍵
(2)參照完整性
①父表中刪除數據:級聯刪除,受限刪除,置空值;
②父表中插入數據:受限插入,遞歸插入;
③父表中更新數據:級聯更新,受限更新,置空值。
DBMS對參照完整性可以有兩種方法實現:外鍵實現機制(約束規則)和觸發器實現機制。
(3)用戶定義完整性:NOT NULL,CHECK,觸發器。
2)用約束而非商務規則強制數據完整性;
3)強制指示完整性。在有害數據進入數據庫之前將其剔除,激活數據庫系統的指示完整性特性;
4)使用查找控制數據完整性,控制數據完整性的最佳方式就是限制用戶的選擇;
5)采用視圖。可以為應用程序建立專門的視圖而不必非要應用程序直接訪問數據表,這樣做還等於在處理數據庫變更時給你提供了更多的自由。
5、其他設計
1)避免使用觸發器,確實需要的話最好集中對它文檔化;
2)使用常用英語(或者其他任何語言)而不要使用編碼,確實需要的話可以在編碼旁附上用戶知道的英語;
3)保存常用信息。讓一個表專門存放一般數據庫信息,可以實現一種簡單機制跟蹤數據庫,這樣做對非客戶機/服務器環境特別有用;
4)包含版本機制,在修改數據庫結構時更為方便;
5)編制文檔,對所有的快捷方式、命名規范、限制和函數都要編制文檔;
6)反復測試,保證選擇的數據類型滿足商業要求;
7)檢查設計,在開發期間檢查數據庫設計的常用技術是通過其所支持的應用程序原型檢查數據庫。
6、數據庫命名規范
1)實體(表)的命名
(1)表以名詞或名詞短語命名,給表的別名定義簡單規則;
(2)如果表或者是字段的名稱僅有一個單詞,那么建議不使用縮寫,而是用完整的單詞;
(3)所有的存儲值列表的表前面加上前綴Z,目的是將這些值列表類排序在數據庫最后;
(4)所有的冗余類的命名(主要是累計表)前面加上前綴X。冗余類是為了提高數據庫效率,非規范化數據庫的時候加入的字段或者表;
(5)關聯類通過用下划線連接兩個基本類之后,再加前綴R的方式命名,后面按照字母順序羅列兩個表名或者表名的縮寫。關聯表用於保存多對多關系。
2)屬性(列)的命名
(1)采用有意義的列名,表內的列要針對鍵采用一整套設計規則;
每一個表都將有一個自動ID作為主健,邏輯上的主健作為第一組候選主健來定義。如果是自定義的邏輯上的編碼則用縮寫加“ID”的方法命名。如果鍵是數字類型,你可以用_NO 作為后綴。如果是字符類型則可以采用_CODE 后綴。對列名應該采用標准的前綴和后綴。
(2)所有的屬性加上有關類型的后綴,如果還需要其它的后綴,都放在類型后綴之前。數據類型是文本的字段,類型后綴TX可以不寫,有些類型比較明顯的字段也可以不寫類型后綴;
(3)采用前綴命名。給每個表的列名都采用統一的前綴,那么在編寫SQL表達式的時候會得到大大的簡化,但這樣做也有缺點,比如會破壞自動表連接工具的作用。
3)視圖的命名
(1)視圖以V作為前綴,其他命名規則和表的命名類似;
(2)命名應盡量體現各視圖的功能。
4)觸發器的命名
觸發器以TR作為前綴,觸發器名為相應的表名加上后綴,Insert觸發器加 _I ,Delete觸發器加 _D ,Update觸發器加 _U 。如:TR_User_I,TR_User_D,TR_User_U。
5)存儲過程名
存儲過程應以 UP_ 開頭,和系統的存儲過程區分,后續部分主要以動賓形式構成,並用下划線分割各個組成部分。
6)變量名
變量名采用小寫,若屬於詞組形式,用下划線分隔每個單詞。
7)命名中其他注意事項
(1)以上命名都不得超過30個字符的系統限制,變量名的長度限制為29(不包括標識字符@)
(2)數據對象、變量的命名都采用英文字符,禁止使用中文命名,絕對不要在對象名的字符之間留空格;
(3)小心保留詞,要保證你的字段名沒有和保留詞、數據庫系統或者常用訪問方法沖突;
(4)保持字段名和類型的一致性,在命名字段並為其指定數據類型的時候一定要保證一致性。