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