資料庫設計中應注意的問題
引言資料庫設計是資訊系統設計的基礎,一個好的資料庫設計在滿足了軟體需求之外,還要易維護、易擴充等等要求。當然,對專家們反覆強調的資料的一致性、冗餘性、訪問效率等問題的解決,很大程度上取決於資料庫設計者的經驗和專業水平。但這不妨礙我們根據過去的經驗,從實用的角度給出資料庫設計所要要考慮的問題並儘可能給出相應的解決方案,從而給資訊系統的資料庫設計者一些有益的啟示。(注:這裡的資料庫設計主要指資料庫中表和檢視的schema設計,不涉足資料庫系統中其他方面的設計)那麼怎樣才算是一個好的資料庫設計呢?以下給出一個一般性的標準。
一、一個好的資料庫設計首先要滿足使用者的需求
所有資訊系統最後都將提交給終端使用者使用,對於這一點,相信大家都已經達成共識。但是準確地把握使用者的需求是很難的,雖然
二、一個好的資料庫設計要便於維護和擴充
為了應對使用者需求的修改和新增,也為了滿足各種不同的軟硬體環境下系統的使用,大部分資訊系統都不得不在其生命期中進行升級和調整。在這些升級、調整中,又有相當部分會涉及到資料庫設計的修改,因此,資料庫設計最好從一開始就能在易維護、可擴充的角度多加斟酌。
1、不要為各種編號欄位的設定固定的意義
而是最好通過對照表來建立這種編號和意義的對照關係。舉例來說,很多設計者習慣給部門資訊給出固定的編號,這種設計有個致命的缺陷:那就是由於這種對照關係既然不體現在資料庫中,就必然要用業務邏輯來進行解釋,這樣一來,一有新的調整就不得不
2、列舉資訊要體現在相應在對照表中
而不是體現在使用該資訊的表中的值欄位,這樣做的好處是當用戶希望用該列舉資訊作為查詢條件的時候,通過參照表的方式可以很容易的建立這些資訊,另外也避免了當多個表格中都含有該列舉資訊有可能引起的不一致。
3、用關聯表建立表和表之間的多對多關係
而不要用一個欄位解析的方式進行,舉例來說,為了描述使用者(UserInfo)和角色(RoleInfo)之間的關聯關係,我們要建立對照表UserInfo_RoleInfo,而不要試圖在使用者表中建立一個較長的欄位,如Roles(用RoleID1;RoleID2...的形式構成)來代替,因為這
三、一個好的資料庫設計要具有“可讀性”
如同程式設計書籍中反覆強調的程式設計師一定要在程式碼的可讀性方面下功夫一樣,考慮到資訊系統將來的升級和維護可能要要由另外一批人來進行,因此資料庫設計必然也要具有可理解性。對此,我們參照提高程式碼可讀性的常用方法,給出一些建議:
1、用設計文件來提高資料庫設計的可讀性
這點基本對應於“可讀性”程式碼裡面的註釋。在一個合格的資料庫設計文件中必須給出資料庫中的每個表、每個欄位、表間的關聯關係以及各種約束的意義以及由來,從而有可能讓開發者根據使用者需求和設計文件就能理解正確資料庫的設計。
2、給表和檢視起一個有意義的名字
這點對應於coding規範中的變數和函式的命名,很顯然,CustomerInfo的名字很容易聯想到該表中含有客戶資訊,而把它命名為Table0001只能讓人感到費解外。另外,如果DBMS提供表和檢視名的大小寫支援,該名稱最好由每個構成單詞(首字母大寫)拼接而成。
3、用字首給出表和檢視內容之外的其他資訊
如給參照表Ref_字首,這樣就可以讓業務邏輯實現人員根據表的名字知道他所要操作的是不是張參照表,從而幫助他更快地理解詳細設計,並有可能及早發現裡面的錯誤。同樣,給所有檢視加上V_字首,就可以讓業務邏輯程式設計者很容易地知道他現在面臨的是一個表還是檢視,從而避免了對檢視進行更新操作這種低階的錯誤。
4、給每一個欄位起一個有意義的名字
如給CustomerInfo表中的電子郵件欄位起名EMail讓人很容易明白它的準確含義,而Field05則讓人不知所云。基於同樣的道理,數據庫設計中也不能給欄位起一個張冠李戴的名字。
5、欄位命名要考慮上下文
舉例來說,在UserInfo表中,用UserName來表示使用者名稱欄位就不如Name來的更加合適。這種情況畫蛇添足的情況在對照表的設計中體現得尤為明顯,如把部門對照表(Ref_Department)中的部門ID欄位命名為DepartmentID,把部門名稱欄位命名為DepartmentName等等。
6、檢視的設計不要牽扯到其他檢視
與程式碼設計中函式呼叫最好不要巢狀過多層次相對應,為了便於資料庫設計的閱讀人能夠很好地理解設計,檢視最好直接建立在表上。
7、同一表中的記錄最好不要相互引用
這種引用關係不僅讓資料庫設計的閱讀人云裡霧裡,也不便於業務邏輯程式碼的編寫。
8、關聯表的命名用關聯的表名中間加下劃線連線構成
如學生(StudentInfo)和課程(CourseInfo)的關聯表起名StudentInfo_CourseInfo。
四、一個好的資料庫設計能夠滿足空間和效率的要求
對於一個資訊系統來說,在實現使用者需求的基礎之上,保證一個較低的空間佔用以及短的響應時間都是理智的客戶所願意看到的。那麼在這一方面,資料庫設計又要做些什麼工作呢?
1、使用varchar而不要使用char欄位
對於不定長資訊如使用者的簡介資訊,varchar的使用可以減少近一半的空間佔用。當然這點不能一概而論,如用相應長度的char儲存定長文字資料就比varchar來的合適。
2、不要使用BLOB欄位存放“大資料”
BLOB欄位誠如其名,本身是為儲存二進位制大資料而出現的,同樣的道理也適用於某些DBMS所引入的TEXT欄位。因為對於一般資訊系統而言,最長的欄位往往是一些描述文字資訊,而DBMS對char/varchar的長度基本能滿足這種需求。因此積極建議設計者對一些貌似很長的文字的最大允許長度進行確認,在此基礎上參照DBMS中的開發手冊來決定是否採用大欄位。
3、不要使用設計器預設的欄位長度
這種做法一方面縱容了設計者對使用者需求的一知半解以及對設計敷衍了事的不良習慣,另外一方面也在資料的儲存上浪費了不少的空間,因為使用預設欄位長度的情況往往發生在欄位上。
4、不要輕易使用unicode文字欄位
DBMS對unicode的支援在幫助產品國際化的同時,也在一定程度上帶來空間上的浪費,尤其是在當要儲存的文字中的基本都是ASCII字元的情況下,這種浪費尤為明顯。因此,建議設計者在選擇unicode的理由,一定是出於國際化的考慮,而不是其他。因為大多數的大字符集和ASCII字元並存情況下所要碰到的問題基本上都已經由DBMS提供商解決。
5、使用預計算表來提高響應速度
跟資料倉庫裡面的某些思路相似,當業務邏輯中需要用倒根據歷史資訊得來的統計資料時,最好由獨立於系統的預計算模組或相應的DW工具定期完成這些統計資料的預計算。
五、一個好的資料庫設計可以簡化業務邏輯的設計
所有的資料庫設計都不是孤立的,它通過相應的業務邏輯實現(三層結構中還有表現層)來形成最終的產品,因此一個好的資料庫設計應該能夠幫助降低業務邏輯的編寫難度,最起碼不要給業務邏輯的設計、編碼帶來額外工作。
1、所有允許為空的欄位必須是基於使用者需求,而不是出於設計上方便的考慮。這樣帶來的好處是讓詳細設計中的某些錯誤和疏漏(如在設計中沒有考慮對非空欄位的內容檢查)在編碼和單元測試階段就被發現,從而避免了進一步擴散,有助於提高軟體的質量。
2、不要業務邏輯程式碼實現唯一性約束
對資料庫表中的某些欄位(或者多個欄位的組合)的唯一性約束應該儘可能地加到資料庫端。因為這種約束工作交給業務邏輯中去實現代價高昂而且不可靠。
3、關聯約束一定要建立在資料庫端
分析出設計中所涉及的主外來鍵引用關係並體現在資料庫設計中。這一條出於兩點考慮:降低業務邏輯的編寫難度和資料關聯性約束的要求。
相關推薦
資料庫設計中應注意的問題
引言資料庫設計是資訊系統設計的基礎,一個好的資料庫設計在滿足了軟體需求之外,還要易維護、易擴充等等要求。當然,對專家們反覆強調的資料的一致性、冗餘性、訪問效率等問題的解決,很大程度上取決於資料庫設計者的經驗和專業水平。但這不妨礙我們根據過去的經驗,從實用的角度給出資料庫設計所要要考慮的問題並儘可能給出相應的
laravel中資料庫查詢leftJoin應注意的問題
在用laravel框架使用關聯查詢時,如果關聯的表使用了假刪除,則會很容易忽略這個deleted_at欄位的存在。 因此,有兩種方法可以避免: 1.加上deleted_at欄位是否為null的條件 2
個人簡歷製作過程中應注意的地方
簡歷作為一個人求職面試的工具,需要大家好好準備,注意其中的問題,才能製作出一份毫無缺陷的精美簡歷。今天小編就將告訴大家個人簡歷製作當中的禁忌,讓大家在今後製作簡歷時,少犯這些錯誤。1.內容不要重複、過多有得人為了讓簡歷看上去內容豐富,就將一個方面的小內容,不斷在簡歷中重複提出,導致簡歷內容十分混亂,讓人看上去
mysql資料庫設計中的14個技巧
mysql資料庫設計中的14個技巧 1. 原始單據與實體之間的關係 可以是一對一、一對多、多對多的關係。在一般情況下,它們是一對一的關係:即一張原始單據對應且只對應一個實體。在特殊情況下,它們可能是一對多或多對一的關係,即一張原始單證對應多個實
建站過程中應注意的問題
建立企業網站就如同寫一篇文章,第一步要寫好提綱,確立主題。企業網站的題材確定後,要想合理地組織內容並且吸引人們登陸網站進行查詢和瀏覽,就需要建立企業網站的索引。索引應該能夠將網站的主體明確表示出來。網站在設立欄目時要緊扣企業確立的主題,設立最近更新或網站指南欄目;設立企業可以下載的檔案、產品資料等文字文件和及
jquery ajax 在submit按鈕的click處理中應注意的地方
{ $("#personsub").live('click',function() { if($("#oldpassword").val()=="") { alert("舊密碼不能為空!"); return fal
資料庫設計中是設計聯合主鍵還是唯一索引+單一主鍵好?
在一個表中user_id和type兩個欄位唯一確定一條記錄,那麼在設計中是將這兩個欄位設計為聯合主鍵呢,還是建立一個邏輯主鍵id,而將這兩個欄位設計為唯一索引呢?這兩種方式有什麼區別?哪個更好呢?具體還
資料庫設計中遇到的問題
時間欄位的選擇 設計資料庫時,難免會考慮到時間欄位的設計,在這裡總結一下 在mysql中,時間的型別一般有如下: java和mysql時間型別對照表如下 在開發中不使用varchar或者char來儲存時間,因為無法做到排序,效能收到影響 tim
資料庫設計以及優化注意的問題
總的來說,mysql優化: 1、索引和sql語句優化,查詢優化 2、資料庫表結構優化 3、資料庫架構優化 4、演算法優化 5、硬體升級 一、資料庫結構的設計 遇到大資料併發訪問 ——>合理的資料冗餘 為了保證資料庫的一致性和完整性,
網路爬蟲設計中需要注意的幾個問題
做網路爬蟲是件很有意義的事情。首先,它可以是一個專門的職業。從公司層面講,業務和戰略可能都需要很多資料進行多維度分析,所以現在很多公司都有專門的爬蟲工程師負責設計資料採集系統;其次,很多公司以爬蟲為生,爬蟲就是他們用來賺取利潤的最主要手段,比如說各大搜索引擎和最近比較流行的即刻 APP;最後,爬蟲也可以成為程
MongoDB資料庫設計中6條重要的經驗法則(二)
在上一篇文章中我介紹了三種基本的設計方案:內嵌,子引用,父引用,同時說明了在選擇方案時需要考慮的兩個關鍵因素。 一對多中的多是否需要一個單獨的實體。 這個關係中集合的規模是一對很少,很多,還是非常多。 在掌握了以上基礎技術後,我將會介紹更為高階的主題:雙向關聯和反
資料庫設計中SQL保留字(Reserved words)的問題
最近在做MP專案的時候涉及到Oracle10gR2資料庫相關的程式設計,需要一些測試資料,我就在SQL Developer中用SQL語句向表中新增記錄: INSERT INTO UserActionLog (log_source,user,action,terminal,t
轉 資料庫設計中的14個技巧
下述十四個技巧,是許多人在大量的資料庫分析與設計實踐中,逐步總結出來的。對於這些經驗的運用,讀者不能生幫硬套,死記硬背,而要消化理解,實事求是,靈活掌握。並逐步做到:在應用中發展,在發展中應用。 1. 原始單據與實體之間的關係 可以是一對一、一對
IDEF1x語義建模方法及其在資料庫設計中的應用
1引言 IDEF的含義是整合計算機輔助製造(Integrated Computer-AidedManufacturing,ICAM)DEFinition。最初的IDEF方法是在美國空軍ICAM專案建立的,最初開發3種方法:功能建模(IDEF0)、資訊建模(ID
Caffe 環境搭建中應注意的問題
和TensorFlow對應的是Theano,Torch; Caffe專精於影象處理,Caffe方便,更快入門上手; 在通用的DL task上,Caffe不如Theano。 CNN(卷積神經網路)、RNN(迴圈神經網路)、DNN(深度神經網路) 開發環境搭建: 一、沒
1.APP後端開發系列:登陸系統設計中的注意問題
想寫這個系列很久了,因為之前做這個東西花費了大量的精力,有必要分享出來與大家共享。以前也寫了一些關於 APP後端開發的系列文章 由於當初功力不夠,很多問題描述不清楚或者解決方案過於複雜、不嚴謹等。 這一次查了很多資料,問了很多相關人士。準備再結合自己實際工
網路爬蟲設計中需要注意的幾個問題us時時彩原始碼五合一盤口藍色版本 親測功能完美運營版
我是通過看「靜覓」上的文章接觸爬蟲的。作者最近還寫了本書「Python3網路爬蟲開發實戰 」,算是現在市面上比較系統的爬蟲書籍了。我也寫點東西總結一下做爬蟲過程中遇到的主要問題,希望對沒有接觸過的同學有參考意義,也希望老鳥們幫忙看看路子是否正確。本文主要是為了釐清爬蟲執行的思路,不會涉及太多的具體程式碼。「網
資料庫設計中,多對多關係使用使用逗號分割關聯討論
進公司一個月,發現公司很多人喜歡用逗號分割,去儲存其它表的主鍵,做多對多關聯,但存在很多亂用現象。這裡對這種方式做了下總結。 在傳統資料庫設計中,多對多關係儲存通常都是用一張中間表來簡歷兩張表的關係。例如使用者和角色,一個使用者有多個角色,而一個角色下
mysql中的保留關鍵字,設計資料庫時應注意
設計資料庫時儘量不要用系統保留關鍵字,如果非要用,記得用``包裹,如:`desc` Mysq官方文件地址 http://dev.mysql.com/doc/refman/5.7/en/keywords.html MySQL 5.7 AC
程序設計中關於Java 異常處理應註意的問題
異常處理 try...catch Java 異常處理初識 下面程序,雖能運行,但當數據輸入有誤時程序不能正常結束,也就是說,程序本身沒有進行異常處理。 例題001 用Java編寫程序。輸入兩個整數,輸出它們的商。 import java.util.Scanner;public class MyAd