圖1-2 所示是一種設計方法,特別為使用Access 進行了修改。該方法是一個自上向下的方法,它從總體系統設計開始,最終是窗體設計,其中包含了5 個步驟。
圖1-2 5 步驟設計流程圖.該設計方法尤其適合Access 數據庫
這5 個設計步驟和本書中示例所展示的數據庫系統說明了大量有關Access 的內容,并且為創建數據庫應用程序打下了堅實的基礎,這些應用程序包括表、查詢、窗體、數據頁、報表、宏和簡單的VBA (Visual Basic for Applications) 模塊。
花在每個步驟上的時間完全取決于所構建的數據庫環境。例如,有時用戶會提供一個需要Access 數據庫打印出來的報表樣本,報表上的數據源非常明顯,從而設計報表只需要兒分鐘的時間。而有的時候,特別是當用戶的需求非常復雜,或者應用程序支持的業務流程要求大量的研究時,可能要花幾天的時間來完成第一步。
在逐步了解設計過程的每個步驟時,需要始終關注輸出和輸入上的設計問題。盡管可以看到系統的實現組件(汽車、購買者、銷售商和交易) ,還是要切記本章的重點在于如何設計每一個步驟。查看Access AutoAuctions 系統的設計時,應注意其設計過程,而不是實際系統。
||| 1.4.1 第1 步:總體設計從概念到實現
所有軟件開發人員都面臨著很多類似的問題,第一個問題就是確定如何才能滿足最終用戶的需求。在關注細節問題之前,了解一下總體需求尤為重要。
圖1-2 中所示的5 步驟設計方法可以幫助您創建所需的系統,而且價格可以承受(按時間或美元計算)。例如, Access Auto Auctions 數據庫允許客戶向顧客出售商品(車輛和部件)。Access Auto Auctions 數據庫實現了以下任務的自動化:
輸入和維護客戶和銷售商的合同信息(姓名、地址和財務歷史信息) ;
輸入和維護銷售信息(銷售數據、支付方法、總額,包括稅金、購買者ID 和其他方面) ;
輸入和維護銷售項目信息(實際購買的商品詳細信息) ;
查看所有表中的信息(銷售、聯系人、購買銷售項目和支付信息) ;
提出有關數據庫中信息的所有問題:
生成當前聯系人目錄:
生成發貨單的月報表:
生成客戶銷售歷史:
生成郵件標簽和郵件合并報表。
Access Auto Auctions 數據庫自動化實現的9 項任務己經通過客戶表現了出來。在設計過程開始時,可能還需要考慮其他任務。
構建系統所需要的大多數信息都來源于最終用戶。這就是說需要和他們進行接觸以了解現有的處理工作。要實現這一目標,需要對現有系統進行全面的需求分析以及如何實現該系統的自動化。
一個實現方法就是準備一系列的問題,以深入了解客戶業務以及客戶如何使用數據。例如,在考慮對汽車拍賣業務實現自動化時,可以考慮提出如下問題:
目前正在使用哪些報表和窗體?
目前銷售、客戶、聯系人和其他記錄如何存儲?
如何處理票據?
提出這些以及其他問題時,客戶可能會想起業務的其他方面,對此也應該有所了解。
對現有工作流程的預排對于找到業務"感覺"來說也是十分必要的。極有可能返回多次來觀察現有流程以及員工如何工作。
準備完成余下的步驟時,一定要保持客戶的參與,讓客戶知道所做的工作并且要求其提供所需要的輸入數據,同時確保按客戶需求進行工作。
||| 1.4.2 第2 步:報表設計
盡管從報表開始可能看起來有些奇怪,但在很多情況下,相對于應用程序的其他方面而言,用戶更關垃于數據庫的打印輸出。報表通常包括應用程序管理的所有數據。由于內容很全面,所以報表經常是收集關于重要數據庫需求信息的最好方法。使用Access Auto Auctions 數據庫時,可打印報表包含數據庫中幾乎所有數據的詳細和匯總版本,根據需求定義完Access Auto Auctions 的總體系統后,就可以開始報表設計了。
看到該部分中需要創建的報表后,可能會有些不解,"哪個先出現一一雞還是蛋? "是報表布局先出現,還是需要先確定構成報表的數據項和文本?實際上,需要同時考慮這些項目。
如何布置報表中的字段并不重要。然而,此時花的時間越多,構建報表就會變得越容易。有些人甚至在報表中放置了網格線,以便于了解每個數據的準確位置。在這個例子中,實際上可以直接布局報表上的字段。
創建圖1-3 和圖1-4 中的報表有兩個不同的.目的。圖1-3 中的報表顯示了有關單個聯系人的信息(購買者、銷售商或者二者兼備〉。與此相反,圖1-4 中的報表是一個包含票據和客戶信息的發貨單。這兩種報表都是建立在所用信息類型的基礎之上。每個報表的設計和布局都是由報表的目的和表中包含的數據來驅動的。
圖1-3 聯系人信息報表
參考:可以在第9 章和;第20 章中了解到更多有關Access Auto Auctions 系統報表的內容.
圖1.4 包含銷售信息的銷售發貨單報表
|||1.4.3 第3 步:數據設計:需要哪些字段?
設計階段的下一步就是建立一個關于報表所需的所有信息或數據字段的清單。最好的辦法之一就是列出每個報表中的數據項。在此過程中, 一定要注意多個報表中所包含的數據項。由于數據項實際上是相同的,因此要確保為多個報表中的每個數據項保留了相同的名稱。
另一種方法就是看看是否可以將數據項分到多個邏輯排列中。以后,這些數據項可以組合為表結構并映射到數據輸入屏幕(窗體)。例如,應該輸入客戶數據(購買者和銷售商),作為聯系人表處理的一部分,而不是作為銷售輸入項的一部分。
1 .確定聯系人信息
首先看看己經檢查過或者試圖為Access Auto Auctions 創建的每一個報表。對于該系統而言,應從客戶數據和數據項列表著手,如表1-1 所示。
表1-1 報表中與客戶相關的數據項
通過比較每個報表所需的聯系人(客戶)類型可以看出,報表中存在著很多的公共字段。大多數與客戶有關的數據字段在兩個報表中都可以找到。表1-1 只顯示了每個報表中都使用的一些字段:與客戶信息有關的字段。兩個報表中的字段出現在表中相同的行中,這就可以更容易地查看到哪些數據項存在于哪個報表中。可以在一行中進行查看而不需要在兩個報表中查找相同的名稱。由于相關行和字段名稱都相同,所以可非常容易地確保包含了所杳數據項。盡管輕松查找數據項對于小型數據庫來說并不重要,但在必須處理其中包含了許多字段的大型表時,這一點就顯得至關重要。
2. 確定銷售信息
提取客戶數據后,可以繼續處理銷售數據。此時僅需分析Invoice 報表中專門用于銷售的數據項。表1-2 列出了報表中包含銷售信息的字段。
表1-2 報表中的銷售擻據項
檢查報表所需的銷售信息類型時可以看到,幾個數據項(字段)是重復的(例如,所購產品、購買數量和商品價格字段)。每個發貨單都可以包含多個數據項,而每個數據項都需要同類信息:定購數量和單價。每張銷售發貨單都可能包含多個己出售并且正在列出發貨清單的商品。同樣,每張發貨單也可以包含分期付款,并且這種支付信息將包含多行的支付信息,因此這些重復的數據項可以放入它們自己的組中。
3. 確定項目信息
可以使用前面部分所述銷售信息組中可找到的所有單個數據項,并將它們提取到發貨單報表中對應的組。表1-2 顯示了與每個項目有關的信息。
回顧一下圖1-4 中的報表,可以看到表1-2 中的數據沒有列出計算字段,但可以在報表中輕松地重新創建宮。
提示:除非幾個數字字段特別要求存儲在一個表中,否則應在運行報表(或者窗體)時進行重新計算。如果可以基于其他的字段來創建表中的字段,就應該避免創建后者,可在報表或窗體中輕松創建并顯示這些計算字段。在本書的第2 章中,將了解到在數據庫表中存儲計算值會導致數據維護問題.
||| 1.4.4 第4 步:表設計
現在是比較困難的部分2 必須確定構成報表的表需要哪些字段。檢查文檔中的大量字段和計算值時,可以看到各種數據庫表中包含了哪些字段(通過把字段安排到邏輯組中,己經完成了大量的初步工作〉。現在添加提取的每個字段。盡管某些字段不會出現在任何表中,仍需要在以后添加其他字段(出于多種原因)。
不需要向數據庫表中添加每一位數據,了解這一點尤為重要。比如,用戶可能會表示出向數據庫中添加假期和其他不在職的愿望,從而可以更容易地了解某一天中有哪些員工出勤。然而,在初步開發階段,融入太多思想會很容易對應用程序的初步設計造成負擔。由于Access 表以后很易于修改,因而在初步設計完成之前最好先擱置一下不重要的數據項。一般來說,在數據庫開發項目開始以后,滿足用戶的需求并不難。
使用每個報表顯示出所有數據后,根據目的來合并數據(例如,組合成邏輯組)并且比較這些功能間的數據。為此首先需要查看聯系人信息,并且把不同的字段都結合起來以創建一組數據工頁。接著對銷售信息和項目信息也進行同樣的操作。表1-3 對來源于這三組信息的數據項進行對比較。
表1-3 比較來源于聯系人信息、銷售信息和項目信息的數據項
數據合并和比較是為Access Auto Auctions 創建單個表定義的好辦法,然而還有很多工作需要完成。
隨著逐步了解如何進行數據設計,也會了解到聯系人數據必須分為兩個組。其中一些數據項只針對一個聯系人使用一次而其他的數據項可能要多次輸入。例如聯系人日志信息。每個聯系人在數據庫中都可能會有多個日志項記錄。就Sales 列而言也是如此,支付信息可能會有多個信息行。
進一步把這些信息類型存在它們各自的列中,然后將所有相關類型的數據項分到其自己的列中十分必要,這是設計過程中的規范化部分。例如,客戶可能會在公司中擁有多個聯系人。客戶可能對一次銷售進行多次支付。當然,我們己經把數據分為了以上三類:聯系人、發貨單和項目。
請記住一個客戶可能會有多張發貨單,并且每張發貨單上可能會有多個項目。聯系人列表表示客戶(購買者和銷售商〉信息,發貨單類別包含單個銷售信息,而項目類別包含每張發貨單的相關信息。注意,這三列都是相關的:例如,一個客戶可以有多張發貨單,每張發貨單可能需要多個詳細的行(項目)。
表間的關系也是不同的。例如,每張銷售發貨單有且只有一個客戶,而每個客戶卻可以有多筆銷售。在銷售發貨單和發貨單項目之間也存在著類似的關系。
參考:第2 章介紹了創建和了解關系以及規范化過程.
假設這3 個組代表著系統中的3 個主要表,為了讓其他的字段更少,就需要將這些表鏈接起來。當然,該步驟意味著向數據庫設計中添加表關系。
數據庫表關系要求關系中所涉及的兩個表內有惟一的字段。如果在表中沒惟一的標識符,則數據庫引擎無法正確鏈接并提取相關的數據。
我們所設計的表中都沒有惟一的標識符,這意味著需要向每個表中至少添加一個額外的字段,讓該字段作為與其他表形成關系的點。例如,可以向Contact 表中添加ContactID 字段,隨后向Invoice 表中添加相同的字段,并通過每個表中的Contact 工D 建立表間的關系(在第3 章中將討論關系的創建)。數據庫引擎使用Contact 和Invoice 表之間的關系將客戶與其發貨單鏈接起來。
表的鏈接可以通過稱為鍵字段的特定字段來實現。
了解必需將兩組字段進行鏈接后,可以向每個組中添加所需的鍵字段。表1-4 顯示了兩個新組以及針對每組字段而創建的鏈接字段。這些稱為主露和勿鍾的鏈接字段用來把這些表鏈接起來。
惟一標識表中每個行的字段稱為主揮。相關表中的對應字段稱為開擂。在該示例中, Contact表中的ContactID 字段是主鍾,而Invoice 表中的ContactID 字段是必擂。
讓我們假設Contact 表中的某個記錄在其Contact 工D 字段中顯示為120 Invoice 表中任何ContactID 字段包含12 的記錄會被第12 個聯系人所"擁有"。在第2 章和第3 章中將了解到,可應用特定的規則來選擇和管理主鍵及外鍵。主鍵和外鍵的概念是關系型數據庫幕后最為重要的概念。可從本書的第2 章和第3 章了解更多相關內容。
表1-4 包含鍵的主要表
隨著向每個表添加主鍵,現在可以從每個表中找到與數據庫中其他表相鏈接的字段。例如,表1-4顯示了Contact 表(在表中為主鍵)和Invoice 表(在該表中為外鍵)中的ContactID 字段。
如表1-4 前三列所示,系統中3 個主要表的核心內容已經標識了。這是通常使用或者首選的最終表設計方案。此外,還使用表1-3 中的字段創建了兩個額外的表(列)。
正確設計數據庫及其所包含的表內容可能是面向數據庫應用程序開發過程中最重要一步。借助有效的數據庫設計,可以保持對數據的控制,消除損失重大的數據輸入錯誤并且限制對基本字段的數據輸入。
盡管本書并非為數據庫理論及其細微差別而設計,但此時可以簡要描述數據庫規范化技巧。
規范化的詳細內容可以在第3 章中了解到,但同時應該知道規范化是將數據分解到幾個組成表中的過程。在本章的開頭部分己經提到了有很多Access 開發人員將不同的信息(例如聯系人、發貨單數據和發貨單項目)添加到一個大型表中。一個包含不同數據的大型表會立即變得難以使用和更新。由于某一聯系人的電話號碼存在于包含該客戶信息的任何行中,因而在聯系人的電話號碼更改時必須進行多重更新。
規范化是將數據分解成為更小、更易于管理的表。每個表定義且僅定義了一個實體, 例如聯系人或發貨單,而不能同時對二者進行定義。通過發貨單表中的主鍵(客戶表中的ContactID)和外鍵(也稱為ContactID) ,可以建立聯系人和發貨單表之間的聯系。
規范化過程還涉及到了很多其他的內容,我們將在第3 章中進行討論。
||| 1.4.5 第5 步:窗體設計:輸入
創建數據并建立了表關系后,就到了設計窗體的時候了。窗體是由可以在"編輯"模式中進行輸入和查看的各個字段構成。如果有可能,屏幕上會顯示出與人工系統中所使用的窗體非常類似的窗體。這種設置可讓系統顯得更為用戶友好。
設計窗體時需要在屏幕上放置三類對象:
標簽和文本框數據輸入字段CAccess 窗體和報表中的這些字段通常被稱為2佯) ;
特殊控件(多行文本框、選項按鈕、列表框、復選框、商業圖形和圖片) ;
提升窗體效果的圖形對象(顏色、線條、矩形和三維效果)。
設計窗體時,將字段(文本框、復選框、列表框和單選按鈕)放置在窗體中的相應位置。如果窗體是基于現有的打印窗體開發的,那么Access 數據輸入窗體應與打印格式類似。這些字段在屏幕中的位置應與它們在打印窗體中的位置一致。
標簽顯示消息、題目或標題。文本框提供了一個用于輸入和顯示數據庫所包含的文本或數值的區域。復選框指示了某種條件,可以是未選中或者選中(選定)狀態。Access 中可用的其他控件類型包括列表框、組合框、選擇按鈕、切換按鈕和選項組。
參考:第7 章介紹了Access 中可用的各種類控件。
本書中創建了幾個基本數據輸入窗體。
聯系人日志:簡單的數據輸入窗體。
聯系人:稍復雜的數據輸入窗體,包含了幾種不同類型的控件。
銷售:從多個表中組合數據。
產品:向Access Auto Auctions 數據庫添加產品的數據輸入窗體。
在閱讀以下各章內容的過程中會看到所有這些窗體。盡管Access Auto Auctions 只是一種使用Microsoft Access 構建的數據庫應用程序,但是在構建Access Auto Auctions 表、查詢、窗體、報表和其他數據庫對象時所了解的原理實際上也適用于其他任何Access 項目。
||| 1.5 小結
本章介紹了深入數據庫開發的各種概念和考慮事工頁。數據對于用戶來說非常重要,這一點毫無疑問。如果沒有客戶和產品列表、應收賬款和應付賬款以及工資單信息,大多數公司都無法運營。甚至小公司也必須對它們的業務數據進行有效的管理。
出色的數據庫設計意味著不僅僅是坐下來拼湊幾個表。通常,不好的數據庫設計習慣經常會導致在屏幕和打印報表中出現信息丟失和信息錯誤,這嚴重困擾著開發人員和用戶。用戶很快就會厭煩-次次地重復輸入同樣的信息,業務經理和業主都很期望數據庫應用程序能夠節省時間和資金,而不是增加業務開銷。