[转载]三、二、一 …… Geronimo!,第 4 部分: 模式
三、二、一 …… Geronimo!,第 4 部分: 模式
Web 瀏覽器標志著由數(shù)據(jù)庫模式開頭的這條路線的終點。如何創(chuàng)建一個好的數(shù)據(jù)庫模式呢?您不僅需要有效的工具;還需要一個計劃。設計數(shù)據(jù)庫這件事,一半是科學,一半是藝術,那現(xiàn)在就開始操練您的技術吧。發(fā)掘一些有用的技巧,設計一個快速、有效地響應變化的數(shù)據(jù)庫模式。
當您準備好在軟件荒原中進行下一次 探險時,有一件事會逐漸明朗起來:沒有一個好的計劃,探險的路就不會走太遠。動手去做任何有價值的事情時都需要了解:最終您希望取得怎樣的結果,并根據(jù)這 一目標制訂計劃,這樣就能始終以最終的成功為導向,就像大家所說的那樣,然后仔細地標出達成這一目標的過程中的里程碑事件。最終,創(chuàng)建一個運行良好的系統(tǒng) 的那份激動是相當令人滿足的。
Apache Geronimo 全面支持符合標準的數(shù)據(jù)庫系統(tǒng)。但不論您的工具有多好,沒有一個好的計劃來定義如何達成您的目標,這些工具還是毫無用處的。
技巧 1:著眼于最終成功。不要忘記目標。
Geronimo 包含一大套 Java? 類,這些類專門設計用于將不同的工具粘連成一個功能整體,從而創(chuàng)建有用的應用程序。其中最重要的工具之一就是數(shù)據(jù)庫。數(shù)據(jù)庫是復雜的,需要一個有效的計劃來創(chuàng)建及操作數(shù)據(jù)庫。
方案和模式
計劃是多種多樣的。一些是松散而又寬泛的;它們省略了大量細節(jié)而追求一些簡單的目標,如最大化收益。另一些計劃是緊湊而又具體的;在精確性方面,它們就像是計算機程序。松散的計劃通常被認為是方案,帶有某種不好的含義 —— 即應避免該方案。但一個好的、緊湊的、細節(jié)豐富的計劃被認為是模式,其中反映了大量的想法和努力。
現(xiàn)代數(shù)據(jù)庫技術借用了這一術語來命名不同數(shù)據(jù)庫技術之下的數(shù)據(jù)建模時。您可以在使用可擴展標記語言(Extensible Markup Language, XML)模式、數(shù)據(jù)庫模式、對象模式等的編程世界中看到使用這一術語的例子。數(shù)據(jù)庫模式 是一項計劃,它定義了數(shù)據(jù)庫的表及各表的字段,并對關鍵字段予以特殊強調(diào),這些關鍵字段用于查找其他表中額外的信息。
好的模式不會從天而降。構建模式需要詳細調(diào)研、謹慎思考和有序的流程。這都要從定義目標并在整個項目中以目標為導向開始。
|
經(jīng)常、明確地溝通
記 住這一點,最佳起點即您和您的客戶期望看到的信息 —— 定義系統(tǒng)使用方式的表單及傳達信息的 Web 頁面。Geronimo 會忠誠地執(zhí)行應用程序代碼、管理會話數(shù)據(jù)及數(shù)據(jù)庫連接,同時動態(tài)地生成客戶(以及他們的客戶)期望看到的頁面。以一種共享的視角來看待未來產(chǎn)品系統(tǒng)的外觀 及其行為是很重要的。通過用 JavaServer Pages(JSP)來制訂頁面原型,您就能夠向客戶展示您的想法,客戶也就能夠提供有關修改外觀的反饋。
我知道這樣說有點老套,但如果您還沒有清晰地定義前方的目標,那么可以非常輕松地開辟出通往一項良好計劃的道路。花點時間來定義并精煉客戶將看到的視圖。這樣做最終將讓您漂亮地搞定一切。
例 如,假設您在為高校學生簡歷設計一個 Geronimo Web 應用程序,這些簡歷中涵蓋個人信息、工作閱歷及關于這些學生的其他各種信息,包括其愛好及興趣。向?qū)W生們展示輸入所有這些信息的表單時,明智的做法是讓表 單保持簡短,且將主要的概念分頁放置:一般學生信息頁面(如姓名及聯(lián)系信息)、愛好及興趣頁面,工作頁面,等等。一項準則就是,人們不喜歡填寫帶大量輸入 字段的大型表單,所以應盡可能減少輸入字段的數(shù)量。
技巧 2:避免雜亂。一切保持簡明扼要。
在處理大概念時,應仔細觀察記錄間的關系,將看到一對多的模型 —— 例如,一名學生對應著多份工作或多個俱樂部。這都是將保存學生聯(lián)系信息的表與保存工作經(jīng)歷或俱樂部經(jīng)歷的表中相分離的明顯信號。(該過程形式上被認為是標準化。獲取更多有關標準化的信息,請查閱本文末尾 參考資料 部分的相關鏈接。)
|
避免轉(zhuǎn)移目標
讓 客戶確認這些視圖的最終版本也很重要,這可以避免使您所追逐的目標不斷發(fā)生變化。如果沒有在 Geronimo 生成的這些表單和視圖的最初設計上花足夠的時間,此后必然會遇到麻煩。在 Geronimo 中,可以把表單和視圖設計為一系列的 JSP 頁面,這些頁面是嵌入了 Java 代碼的超文本標記語言(HTML)頁面,這些 Java 代碼則用以在系統(tǒng)處理及顯示值時輸入、輸出及計算它們。
技巧 3:讓客戶確認所有的輸入輸出表單。避免轉(zhuǎn)移目標。
收集一份良好、長的字段清單,然后繼續(xù)下一階段,概念模式 ,在其中定義系統(tǒng)的概念。學生簡歷系統(tǒng)的概念模式應包括一些摘要性的東西,如工作、專業(yè)、學校、學生、俱樂部及愛好。
牢記數(shù)據(jù)庫的構建塊及其繼承關系:數(shù)據(jù)庫 由表 組成,表由字段 組成。在構造模式的第一階段中,使用了如學生及工作等主要的概念來創(chuàng)建輸入表單和輸出報表的初始設計,目標是為數(shù)據(jù)庫中最小單位的元素建立一份清單,即信息字段。這樣的例子包括學生 ID、總平均成績(GPA)、學生的專業(yè),他或她的學校,等等。
稍后,會將這些字段分組到相應的表中,并應用標準化的規(guī)則來壓縮該模式。現(xiàn)在,只要收集一份將在這些表中用到的字段的清單。
|
從現(xiàn)實到概念
寬泛地講,計算機程序員們的工作就是去設計有用的抽象概念,即觀察現(xiàn)實世界中存在的東西,并在計算機中創(chuàng)建這些東西的有用的模擬物。將這些抽象的概念表現(xiàn)為 Geronimo 類及對象還是數(shù)據(jù)庫表主要取決于您將如何使用它們,以及它們將持續(xù)多久。
例如,年齡是一個隨時間而不斷改變的值,可以通過一個特定的日期加以計算,即出生日期或創(chuàng)建日期。因而,要在數(shù)據(jù)庫中使用出生日期或創(chuàng)建日期。但如果 Age 顯示在之前討論過的原型頁面的其中一個頁面里,最好將該值在代碼中作為 Geronimo 類的一個方法表示,而 Geronimo 類代表了要計算年齡的那個實體。我用實體 的原因是:不論是人類、動物或汽車,出生日期、創(chuàng)建日期及年齡都是一回事。
作為規(guī)則,不要把計算得出的值保存在數(shù)據(jù)庫中。相反,將它們計算所依據(jù)的那個參數(shù)保存起來。因而,當一些輸出表(報表或 Web 頁面)中顯示了 Age 時,它應該是計算出來的,而不是從數(shù)據(jù)庫中提取出來的。
技巧 4:不要保存能從數(shù)據(jù)庫中計算出來的值。
日期計算在 Geronimo 系統(tǒng)中并不困難,因為定義了 Calendar 和 Date 類。系統(tǒng)通常只意識到當前的日期和時間,所以讓計算機從當前日期中提取出出生日期來獲得年齡值是一件微不足道的事。相同的原則也應用到其他日期計算中,如運輸時間(交貨日期減去裝運時期),產(chǎn)品保質(zhì)期計算(當前日期減去購買日期,再與保質(zhì)期相比較),等等。清單 1 演示了 Geronimo 計算年齡的方法。
清單 1. 計算年齡的 Geronimo 代碼
| import java.util.Calendar; import java.util.Date; public class ddays { // Testing Framework. public static void main(String[] args) { // Two date instances. Calendar date1 = Calendar.getInstance(); Calendar date2 = Calendar.getInstance(); // Set the Birth Date. date1.set(1975,00,17); // January = 00. int delta = dDays(date2.getTime(), date1.getTime()); double dyears = (double) delta / 365.25; System.out.println("Date 1: " + date1.getTime()); System.out.println("Date 2: " + date2.getTime()); System.out.println("Delta: " + delta + " Days"); System.out.println("Age: " + (int) dyears + " Years"); } // Days between dates. public static int dDays(Date date1, Date date2) { int theDiff = 0; int totalDiff = 0; Calendar former = Calendar.getInstance(); Calendar latter = Calendar.getInstance(); if (date1.compareTo(date2) < 0) { former.setTime(date1); latter.setTime(date2); } else { former.setTime(date2); latter.setTime(date1); } while (former.get(Calendar.YEAR) != latter.get(Calendar.YEAR)) { theDiff = 365 * (latter.get(Calendar.YEAR) - former.get(Calendar.YEAR)); totalDiff += theDiff; former.add(Calendar.DAY_OF_YEAR, theDiff); } if (former.get(Calendar.DAY_OF_YEAR) != latter.get(Calendar.DAY_OF_YEAR)) { theDiff = latter.get(Calendar.DAY_OF_YEAR) - former.get(Calendar.DAY_OF_YEAR); totalDiff += theDiff; former.add(Calendar.DAY_OF_YEAR, theDiff); } return totalDiff; } } |
在第二階段,應專注于要設計的表以及表中要包含的字段。例 如,需要一個帶基本學生信息的學生表,一個帶學生及其工作的詳細時間信息的工作表,及其他包含愛好、興趣的表,等等。與保持程序定義簡明扼要相同,表也應 該保持簡短。信息分解是標準化過程的一部分,其設計目的是為了防止各原子信息單元出現(xiàn)重復,并且,也必需要有清晰的方式來構建查詢,從而獲取每一點信息。
|
弄清概念
在概念模式后出現(xiàn)的是邏輯模式 —— 用更多的細節(jié)定義概念,并顯示實體之間的關系的數(shù)據(jù)模型。在第三階段,用更具體的關系來修改這些將存在于不同表的實體間的概念。學生 ID 是一個關鍵字段,它用以連接學生個人信息與他或她從事過的工作、該學生從屬的俱樂部及該學生上過的學校。
弄 清這些概念也意味著將對應用于數(shù)據(jù)庫的查詢類型有所了解。絕大部分搜索都是在搜索關鍵字段嗎?還是大量的搜索都不包含這些關鍵字段?設計數(shù)據(jù)庫引擎是為了 基于指定關鍵字段構建表中記錄的索引。在許多例子中,這些索引是自動生成的,且極大地提升了查找的速度,即基于指定關鍵字段提供查找。
技巧 5:確保選定的關鍵字段真實地反映要做的查詢。
因 而,每個概念,即每張表,使用一個有邏輯的主鍵并使將要應用于該概念中的查詢有意義是很重要的。工作表將包含學生曾經(jīng)從事過的工作的簡短信息,其目的不是 成為一份可供搜索的公司清單。每個工作實體將以學生 ID 作為主鍵,這樣在自動構建了學生簡歷時,數(shù)據(jù)庫只需用最少的努力即可列出與每個學生相關的工作。
當不使用關鍵字段而構建記錄清單時,計算機的處理速度會大大降低。Job 表用于匯集學生們曾經(jīng)從事過的工作的清單,將這張表用于任何其他目的是無效的。
|
標準化
數(shù)據(jù)庫標準化是一個重要課題,完全可以就其寫出許多著作,而且已經(jīng)有了許多相關著作。標準化消除了數(shù)據(jù)冗余,并對數(shù)據(jù)進行有效的組織。標準化過程試圖確保所有數(shù)據(jù)庫屬性只存儲一個值,任何有多個值的屬性應該表示在不同的表中。例如,請看下列學生記錄:
Student: John Smith, College GPA: 3.20
學生和他或她的 GPA 之間存在著一個一對一的關系。這個關系有時被稱為 1NF,或第一范式,根據(jù)標準化規(guī)則,這就是您要實現(xiàn)的目標。每個學生都有且只有一個相關聯(lián)的大學 GPA。
但相同的學生在其大學生涯中卻有多份不同的工作。結果是,他可能具有這樣一條學生記錄:
Student: John Smith, Job: Smith Brothers, Campus Coffee Shop, Bob's Burgers
由于一個屬性(job)代表了許多不同的值,標準化的規(guī)則要求將這些值轉(zhuǎn)移到一個不同的表中,即 Job 表中,從而滿足這些規(guī)則。隨后可以通過學生 ID 對 Job 表建立索引,且檢索每份從事過的工作將會以一種有序且高效的方式進行。
技巧 6:標準化規(guī)則很重要。了解并應用這些規(guī)則。
涵蓋所有標準化規(guī)則或提供這些規(guī)則所依據(jù)的數(shù)學背景知識已超出了本文的范圍。任何想要創(chuàng)建數(shù)據(jù)庫系統(tǒng)的人們必需熟悉標準化的概念,只要說明這個就夠了。(參見 參考資料,獲取一份關于標準化的優(yōu)秀文章的鏈接列表。)
|
結束語
許多工具都能幫助您創(chuàng)建良好的數(shù)據(jù)庫模式,就好像許多工具都能協(xié)助設計面向?qū)ο蟮南到y(tǒng)一樣。值得花些時間來探究這些工具和技術,并通過實踐提高您的技術水平。現(xiàn)代的業(yè)務運營在數(shù)據(jù)庫和 Web 站點之上,Geronimo 是將這兩者整合到一起的一種強大工具。
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/374079/viewspace-130304/,如需轉(zhuǎn)載,請注明出處,否則將追究法律責任。
轉(zhuǎn)載于:http://blog.itpub.net/374079/viewspace-130304/
總結
以上是生活随笔為你收集整理的[转载]三、二、一 …… Geronimo!,第 4 部分: 模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos xfs硬盘扩容
- 下一篇: 2019-04-01 银行的零售业务和对