- 相關(guān)推薦
局域網(wǎng)圖書資料查詢系統(tǒng)
摘 要
本文結(jié)合日常圖書查詢系統(tǒng)的實(shí)際需要,通過對(duì)C/S模式、PowerBuilder6.5開發(fā)工具、數(shù)據(jù)庫以
及SQL語言的深入學(xué)習(xí)及實(shí)踐,主要完成了局域網(wǎng)圖書資料查詢系統(tǒng)的需求分析、數(shù)據(jù)庫設(shè)計(jì)、應(yīng)
用程序設(shè)計(jì)的工作。
首先,在緒論部分介紹了局域網(wǎng)圖書資料查詢系統(tǒng)的應(yīng)用背景、開發(fā)環(huán)境以及選用的開發(fā)工具與
數(shù)據(jù)庫的關(guān)系,闡明了局域網(wǎng)的概念。并對(duì)數(shù)據(jù)庫的體系結(jié)構(gòu)、DBMS進(jìn)行了介紹。
第二章的開始介紹了關(guān)系型數(shù)據(jù)庫的基本概念,著重說明了幾個(gè)關(guān)鍵概念的定義;然后對(duì)SQL語言
作了一個(gè)介紹說明;最后通過兩個(gè)例子介紹了PB6.5用PowerScript語言調(diào)用SQL的方式。
第三章從特點(diǎn)和功能入手,介紹了開發(fā)工具PowerBuilder6.5;并且介紹了C/S模式的概念、特點(diǎn)
以及C/S模式與開發(fā)工具PowerBuilder6.5的聯(lián)系;在這個(gè)章節(jié)的最后簡(jiǎn)單介紹了PB6.5對(duì)數(shù)據(jù)庫的
操作。
第四章用軟件工程的方法分析了局域網(wǎng)圖書資料查詢系統(tǒng),對(duì)整個(gè)系統(tǒng)進(jìn)行了需求分析、功能模
塊劃分,并通過ER圖對(duì)數(shù)據(jù)庫進(jìn)行概念設(shè)計(jì)、用Microsoft Access對(duì)數(shù)據(jù)庫進(jìn)行邏輯設(shè)計(jì)。
第五章是對(duì)局域網(wǎng)圖書資料查詢系統(tǒng)的具體設(shè)計(jì)。描述了整個(gè)系統(tǒng)詳細(xì)的功能模塊劃分,描述了
登錄模塊、模糊(分類)查詢、多條件(組合)查詢、數(shù)據(jù)編輯更新模塊以及數(shù)據(jù)維護(hù)模塊的實(shí)
現(xiàn)過程,并對(duì)設(shè)計(jì)源代碼進(jìn)行了注釋分析。
設(shè)計(jì)充分利用PowerBuilder6.5的PowerScript語言對(duì)SQL語言的操作特性,靈活運(yùn)用數(shù)據(jù)窗口技術(shù)
、以及PB的控件技術(shù)等,提高了程序設(shè)計(jì)質(zhì)量。
關(guān)鍵詞:C/S結(jié)構(gòu),局域網(wǎng),數(shù)據(jù)庫,SQL語言,PowerBuilder6.5
目 錄
摘 要 ………………………………………………………………………………… I
第一章 緒 論 ……………………………………………………………………… 1
§1.1 數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)簡(jiǎn)介 ………………………………………………… 1
§1.2 局域網(wǎng)圖書資料查詢系統(tǒng)……………………………………………………3
§1.3本文所作工作 …………………………………………………………… 4
第二章 數(shù)據(jù)庫理論基礎(chǔ) …………………………………………………………… 6
§2.1 關(guān)系型數(shù)據(jù) ……………………………………………………………… 6
§2.2 SQL語言介紹 ……………………………………………………………… 9
§2.3 PB6.5對(duì)數(shù)據(jù)庫的操作 ………………………………………………………11
第三章 PB 6.5及其數(shù)據(jù)庫編程……………………………………………………… 13
§3.1開發(fā)工具PowerBuilder6.5……………………………………………………13
§3.2 PowerBuilder與Client/Server體系結(jié)構(gòu)………………………………………16
§3.3 PowerBuilder6.5數(shù)據(jù)庫編程 ……………………………………………… 18
第四章 局域網(wǎng)圖書資料查詢系統(tǒng)設(shè)計(jì)分析 …………………………………………21
§4.1 應(yīng)用需求分析 ……………………………………………………………… 22
§4.2 系統(tǒng)功能模塊劃分 ………………………………………………………… 23
§4.3 系統(tǒng)數(shù)據(jù)庫設(shè)計(jì) …………………………………………………………… 24
第五章 局域網(wǎng)圖書資料查詢系統(tǒng)應(yīng)用程序設(shè)計(jì) …………………………………29
§5.1 系統(tǒng)模塊組成 ………………………………………………………… 29
§5.2登錄模塊的實(shí)現(xiàn)……………………………………………………… 30
§5.3查詢模塊的實(shí)現(xiàn) …………………………………………………………… 33
5.3.1模糊(分類)查詢的實(shí)現(xiàn) ………………………………………………39
5.3.2組合(條件)查詢的實(shí)現(xiàn) ………………………………………………44
5.3.3更新打印模塊的實(shí)現(xiàn) ………………………………………………… 51
§5.4 數(shù)據(jù)維護(hù)模塊的實(shí)現(xiàn)…………………………………………………………56
第六章 結(jié)束語 ……………………………………………………………………… 63
致 謝 ………………………………………………………………………………… 64
參考書目 ……………………………………………………………………………… 65
第一章 緒 論
§1.1 數(shù)據(jù)庫技術(shù)
數(shù)據(jù)庫技術(shù)作為數(shù)據(jù)管理技術(shù),是計(jì)算機(jī)軟件領(lǐng)域的一個(gè)重要分支,產(chǎn)生于60年代末,F(xiàn)已
形成相當(dāng)規(guī)模的理論體系和實(shí)用技術(shù)。優(yōu)秀的數(shù)據(jù)庫設(shè)計(jì)是應(yīng)用成功的基石。萬萬丈高樓平地起
,數(shù)據(jù)庫設(shè)計(jì)如同高樓的基石,是開發(fā)高品質(zhì)應(yīng)用的前提。
1.1.1 數(shù)據(jù)庫的體系結(jié)構(gòu)
數(shù)據(jù)的體系結(jié)構(gòu)分成三級(jí):內(nèi)部級(jí)(Internal),概念級(jí)(Conceptual)和外部級(jí)(External)。這
個(gè)三級(jí)結(jié)構(gòu)有時(shí)也稱為“三級(jí)模式結(jié)構(gòu)”。
l 外部級(jí):最接近用戶,是單個(gè)用戶所能看到的數(shù)據(jù)特性。單個(gè)用戶使用的數(shù)據(jù)視圖的描述稱為
“外模式”。
l 概念級(jí):涉及到所有用戶的數(shù)據(jù)定義、是全局的數(shù)據(jù)視圖。全局視圖的描述稱為“概念模式”
。
l 內(nèi)部級(jí):最接近于物理存儲(chǔ)設(shè)備,涉及到實(shí)際數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)物理存儲(chǔ)數(shù)據(jù)視圖的描述稱為“
內(nèi)模式”。
數(shù)據(jù)庫的三級(jí)模式結(jié)構(gòu)是數(shù)據(jù)的三個(gè)抽象級(jí)別。它把數(shù)據(jù)的具體組織留給DBMS
去做,用戶只要抽象地處理數(shù)據(jù),而不必關(guān)心數(shù)據(jù)在計(jì)算機(jī)中的表示和存儲(chǔ),這樣就減輕了用戶
使用系統(tǒng)的負(fù)擔(dān)。
1.1.2 數(shù)據(jù)庫管理系統(tǒng)(DBMS)
數(shù)據(jù)庫管理系統(tǒng)(DBMS)是指數(shù)據(jù)庫系統(tǒng)中管理數(shù)據(jù)的軟件系統(tǒng)。DBMS是數(shù)據(jù)庫系統(tǒng)的核心組成
部分。對(duì)數(shù)據(jù)庫的一切操作,包括定義、查詢、更新及各種控制,都是通過DBMS進(jìn)行的。
在不同的計(jì)算機(jī)系統(tǒng)中,由于缺乏統(tǒng)一的標(biāo)準(zhǔn),即使同種數(shù)據(jù)模型的DBMS,它們?cè)谟脩艚涌凇⑾?/p>
統(tǒng)功能方面也常常是不相同的。
用戶對(duì)數(shù)據(jù)庫進(jìn)行操作,是由DBMS把操作從應(yīng)用程序帶到外部級(jí)、概念級(jí)、再導(dǎo)向內(nèi)部級(jí),進(jìn)而
操作存儲(chǔ)器中的數(shù)據(jù)。DBMS的主要目標(biāo),
是使數(shù)據(jù)作為一種可管理的資源處理。
DBMS的主要功能為:
l 數(shù)據(jù)庫定義功能:DBMS提供數(shù)據(jù)定義語言(DDL)定義數(shù)據(jù)庫的三級(jí)結(jié)構(gòu),包括外模式、概念模
式、內(nèi)模式及基相互之間的映象,定義數(shù)據(jù)的完整性、安全控制等約束。因此,在DBMS中應(yīng)包括
DDL的編譯程序。
l 數(shù)據(jù)庫的操縱功能:DBMS提供數(shù)據(jù)操縱語言(DML)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫中數(shù)據(jù)的操作。基本的數(shù)據(jù)操
作分成兩類四種:
² 檢索(查詢)
² 更新(插入、刪除、修改)
l 數(shù)據(jù)庫的保護(hù)功能:數(shù)據(jù)庫中的數(shù)據(jù)是信息社會(huì)的戰(zhàn)略資源,對(duì)數(shù)據(jù)的保護(hù)是至關(guān)重要的大事
。DBMS對(duì)數(shù)據(jù)庫的保護(hù)主要通過四個(gè)方面實(shí)現(xiàn):
² 數(shù)據(jù)庫的恢復(fù):在數(shù)據(jù)庫被破壞或數(shù)據(jù)不正確時(shí),系統(tǒng)有能力把數(shù)據(jù)庫恢復(fù)到正確的狀態(tài)。
² 數(shù)據(jù)庫的并發(fā)控制:DBMS的并發(fā)控制子系統(tǒng)能防止錯(cuò)誤發(fā)生,正確處理好多用戶、多任務(wù)環(huán)境
下的并發(fā)操作。
² 數(shù)據(jù)庫的完整性控制:保證數(shù)據(jù)庫中數(shù)據(jù)及語義的正確性和有效性,防止任何對(duì)數(shù)據(jù)造成錯(cuò)誤
的操作。
² 數(shù)據(jù)庫的安全性控制:防止未經(jīng)授權(quán)的用戶蓄謀或無意地存取數(shù)據(jù)庫中的數(shù)據(jù),以免數(shù)據(jù)的泄
露、更改或破壞。
² 數(shù)據(jù)庫的存儲(chǔ)管理:把各種DML語句轉(zhuǎn)換成低層的文件系統(tǒng)命令,起到數(shù)據(jù)的存儲(chǔ)、檢索和更新
的作用。
² 數(shù)據(jù)庫的維護(hù)功能:它有許多實(shí)用程序提供給數(shù)據(jù)庫管理員:
Ø 數(shù)據(jù)裝載程序
Ø 備份程序
Ø 文件重組織程序
Ø 性能監(jiān)控程序
² 數(shù)據(jù)字典:數(shù)據(jù)庫系統(tǒng)中存放三級(jí)結(jié)構(gòu)定義的數(shù)據(jù)庫稱為數(shù)據(jù)字典(DD)。對(duì)數(shù)據(jù)庫的操作都
要通過訪問DD才能實(shí)現(xiàn),通常DD中還存放數(shù)據(jù)庫運(yùn)行時(shí)的統(tǒng)計(jì)信息。
1.1.3 PowerBuilder與數(shù)據(jù)庫
n PowerBuilder與數(shù)據(jù)庫是“配合”與“協(xié)調(diào)”的關(guān)系
PowerBuilder是客戶/服務(wù)器體系結(jié)構(gòu)下客戶端的開發(fā)工具,用于開發(fā)客戶應(yīng)用程序。這個(gè)程序首
先建立一個(gè)與數(shù)據(jù)庫的通信渠道,然后將用戶的需求以某種方式傳送給數(shù)據(jù)庫服務(wù)器。在應(yīng)用程
序接收到數(shù)據(jù)庫服務(wù)器返回的數(shù)據(jù)后,它分析返回的數(shù)據(jù)并呈現(xiàn)給用戶。因此我們說,客戶應(yīng)用
程序只完成請(qǐng)求和表現(xiàn)數(shù)據(jù)的工作,是用戶操作計(jì)算機(jī)的人機(jī)界面,大多數(shù)數(shù)據(jù)處理是由服務(wù)器
完成的。
數(shù)據(jù)庫數(shù)據(jù)器是一個(gè)存取數(shù)據(jù)和管理數(shù)據(jù)的軟件,它針對(duì)客戶的請(qǐng)求為客戶提供數(shù)據(jù)服務(wù)。這些
服務(wù)包括數(shù)據(jù)插入、修改和查詢等?蛻魧(duì)數(shù)據(jù)庫服務(wù)器提出請(qǐng)求用的語言是SQL(Strucrured
Query Language)。SQL是大多數(shù)數(shù)據(jù)庫服務(wù)器使用的查詢語言。
因此我們說,PowerBuilder與數(shù)據(jù)庫的關(guān)系是“配合”與“協(xié)調(diào)”的關(guān)系。PowerBuilder完成數(shù)
據(jù)請(qǐng)求、數(shù)據(jù)表現(xiàn)、菜單、界面等表象方面的工作,而數(shù)據(jù)庫服務(wù)器完成數(shù)據(jù)庫的存儲(chǔ)管理、并
發(fā)控制、事務(wù)管理、完整性維護(hù)、查詢優(yōu)化等工作。
§1.2 局域網(wǎng)圖書資料查詢系統(tǒng)
1.2.1 局域網(wǎng)(LAN)
計(jì)算機(jī)網(wǎng)絡(luò)是指將多臺(tái)具有獨(dú)立功能的計(jì)算機(jī),通過通信線路和通信設(shè)備連接起來,在網(wǎng)絡(luò)軟件
的支持下實(shí)現(xiàn)數(shù)據(jù)通信和資源共享的計(jì)算機(jī)系統(tǒng)。
計(jì)算機(jī)網(wǎng)絡(luò)的規(guī)模有大有小,大的可以覆蓋全球,小的僅局限于一個(gè)辦公室。現(xiàn)在一般按照網(wǎng)絡(luò)
覆蓋的地理范圍將計(jì)算機(jī)網(wǎng)絡(luò)分為三類:局域網(wǎng)(LAN)、城域網(wǎng)(MAN)、廣域網(wǎng)(WAN)。
局域網(wǎng)是覆蓋范圍在10公里以內(nèi)的計(jì)算機(jī)網(wǎng)絡(luò)。局域網(wǎng)傳輸速度快,一般局限在一個(gè)單位內(nèi)部,
例如一所學(xué);蛞患移髽I(yè)。
1.2.2 應(yīng)用程序開發(fā)背景
一個(gè)數(shù)十人的科研或開發(fā)小組,搜集了上千冊(cè)有用的圖書資料,其中有一部分分布在個(gè)人手中,
為了方便大家查閱,需要對(duì)每本書的狀態(tài)進(jìn)行跟蹤,另新進(jìn)和丟失的圖書資料必須得到及時(shí)的反
映。
1.2.3 系統(tǒng)功能
l 圖書分類查詢,多條件查詢,模糊查詢
l 用戶必須登錄方能執(zhí)行各種操作,允許用戶在客戶機(jī)或?yàn)g覽器修改,添加
刪除圖書資料,實(shí)行松散管理,這建立在用戶高度自覺的基礎(chǔ)之上,當(dāng)然也可由管理員在服務(wù)器
上直接對(duì)數(shù)據(jù)庫操作。
l 能將查詢結(jié)果生成報(bào)表,并打印輸出。
1.2.4 系統(tǒng)運(yùn)行環(huán)境
該系統(tǒng)采用Client/Server模式進(jìn)行設(shè)計(jì):局域網(wǎng)中有一臺(tái)服務(wù)器,其上運(yùn)行服務(wù)器程序,操作系
統(tǒng)為windows2000 server,客戶機(jī)操作為Windows98,其上運(yùn)行客戶端程序。
1.2.5 系統(tǒng)開發(fā)工具
該系統(tǒng)采用PowerBuilder6.5進(jìn)行開發(fā),數(shù)據(jù)庫服務(wù)器端為SQL Anywhere5.0 Server;客戶端則
為SQL Anywhere client,整個(gè)系統(tǒng)在SQL Anywhere Local端調(diào)試完成。
§1.3 本文所作工作
首先,在緒論部分介紹了局域網(wǎng)圖書資料查詢系統(tǒng)的應(yīng)用背景、開發(fā)環(huán)境以及選用的開發(fā)工具與
數(shù)據(jù)庫的關(guān)系,闡明了局域網(wǎng)的概念。并對(duì)數(shù)據(jù)庫的體系結(jié)構(gòu)、DBMS進(jìn)行了介紹。
第二章的開始介紹了關(guān)系型數(shù)據(jù)庫的基本概念,著重說明了幾個(gè)關(guān)鍵概念的定義;然后對(duì)SQL語言
作了一個(gè)介紹說明;最后通過兩個(gè)例子介紹了PB6.5用PowerScript語言調(diào)用SQL的方式。
第三章從特點(diǎn)和功能入手,介紹了開發(fā)工具PowerBuilder6.5;并且介紹了C/S模式的概念、特點(diǎn)
以及C/S模式與開發(fā)工具PowerBuilder6.5的聯(lián)系;在這個(gè)章節(jié)的最后簡(jiǎn)單介紹了PB6.5對(duì)數(shù)據(jù)庫的
操作。
第四章用軟件工程的方法分析了局域網(wǎng)圖書資料查詢系統(tǒng),對(duì)整個(gè)系統(tǒng)進(jìn)行了需求分析、功能模
塊劃分,并通過ER圖對(duì)數(shù)據(jù)庫進(jìn)行概念設(shè)計(jì)、用Microsoft Access對(duì)數(shù)據(jù)庫進(jìn)行邏輯設(shè)計(jì)。
第五章是對(duì)局域網(wǎng)圖書資料查詢系統(tǒng)的具體設(shè)計(jì)。描述了整個(gè)系統(tǒng)詳細(xì)的功能模塊劃分,描述了
登錄模塊、模糊(分類)查詢、多條件(組合)查詢、數(shù)據(jù)編輯更新模塊以及數(shù)據(jù)維護(hù)模塊的實(shí)
現(xiàn)過程,并對(duì)設(shè)計(jì)源代碼進(jìn)行了注釋分析。
最后,在結(jié)束語的總結(jié)部分指出了系統(tǒng)的亮點(diǎn)以及不足之處。簡(jiǎn)單介紹了自己開發(fā)過程中的體會(huì)
與心得:在摸索中實(shí)踐,在實(shí)踐中摸索。
第二章 數(shù)據(jù)庫理論基礎(chǔ)
§2.1 關(guān)系型數(shù)據(jù)庫
2.1.1 關(guān)系模型的基本概念
用二維表格結(jié)構(gòu)表示實(shí)體集,外鍵表示實(shí)體間聯(lián)系的數(shù)據(jù)模型稱為關(guān)系模型。
1. 二維表格
表2-1是一張職工登記表,這是二維表格
工號(hào) 姓名 年齡 性別 工資
0001 Zhang 26 男 1000
0002 Li 25 女 1500
0003 Liu 29 男 1000
0004 Wang 22 女 1500
表2-1 二維表格實(shí)例
為簡(jiǎn)單起見,對(duì)表格數(shù)學(xué)化,用字母表示表格的內(nèi)容。表2-1可用圖2-1表示:
A B C D E
A1 A2A3 A4 B1B2B3B4 C1C2C3C4 D1D2D3D4 E1 E2E3E4
2. 鍵(KEY)
鍵由一個(gè)或幾個(gè)屬性組成,在實(shí)際使用中,有下列幾種鍵:
1) 超鍵(Super Key):在關(guān)系中能惟一標(biāo)識(shí)元組的屬性集稱為關(guān)系模式的超鍵。
2) 候選鍵(Candidate Key):不含有多余屬性的超鍵稱為候選鍵。也就是在候選鍵中,若要再刪
除屬性,就不是鍵了。
3) 主鍵:(Primary Key):用戶選作元組標(biāo)識(shí)的一個(gè)侯選鍵稱為主鍵。一般,如不加說明,則鍵
是指主鍵。
3. 關(guān)系的定義和性質(zhì)
我們可以用集合的觀點(diǎn)定義關(guān)系。關(guān)系是一個(gè)元數(shù)為K(K>=1)的元組的集合。
把關(guān)系看成是一個(gè)集合,集合中的元素是元組,每個(gè)元組的屬性個(gè)數(shù)應(yīng)相同。在關(guān)系模型中,對(duì)
關(guān)系作了下列規(guī)范性限制:
1) 關(guān)系中每一個(gè)屬性值都是不可分解的。
2) 關(guān)系中允許出現(xiàn)相同的元組(沒有重復(fù)元組)
3) 由于關(guān)系是一個(gè)集合,因此不考慮元組間的順序,即沒有行序。
4) 元組中,屬性在理論上也是無序的,但在使用時(shí)按習(xí)慣考慮列的順序。
2.1.2數(shù)據(jù)庫的設(shè)計(jì)理論
關(guān)系數(shù)據(jù)庫的設(shè)計(jì)理論主要包括三個(gè)方面的內(nèi)容:數(shù)據(jù)依賴、范式,模式設(shè)計(jì)方法。其中數(shù)據(jù)依
賴起著核心的作用。
1. 函數(shù)依賴(Functional dependency , FD)的定義
設(shè)R(U)是一個(gè)關(guān)系模式,U是R的屬性集合,X和Y是U的子集。對(duì)于R(U)的任何一個(gè)可能的關(guān)系r,
如果r中不存在兩個(gè)元組,它們?cè)赬上的屬性值相同,而在Y上的屬性值不同,則稱“Y函數(shù)依賴于X
” ,記作X→Y。如果X→Y,并且對(duì)于X的任一真子集X ’,都有Y 不函數(shù)依賴于X ’,則稱“Y完
全函數(shù)依賴于X” ,記作X f Y 。若X→Y,但Y不完全函數(shù)依賴于X,則稱“Y部分函數(shù)依賴于X”
,記作X P Y 。如果X→Y,Y→Z,且Y≮ X, X不函數(shù)依賴于Y,則稱“Z傳遞函數(shù)依賴于X”。
2. 范式
在對(duì)表的形式進(jìn)行了規(guī)范化定義后,數(shù)據(jù)結(jié)構(gòu)還有五種規(guī)范化定義,定名為規(guī)范化模式,稱為范
式。在這五種范式中,一般只用前三種,對(duì)于常用系統(tǒng)就足夠了。而且這五種范式是“向上兼容
”的,即滿足第五范式的數(shù)據(jù)結(jié)構(gòu)自動(dòng)滿足一、二、三、四范式,滿足第四范式的數(shù)據(jù)結(jié)構(gòu)自動(dòng)
滿足第一、二、三范式,……,依此類推。
第一范式(first normal form,簡(jiǎn)稱1st NF)就是指在同一表中沒有重復(fù)項(xiàng)出現(xiàn),如果有則應(yīng)將重
復(fù)項(xiàng)去掉。這個(gè)去掉重復(fù)項(xiàng)的過程就稱之為規(guī)范化處理。在本文所討論的開發(fā)方法里,1st NF實(shí)
際上是沒有什么意義的。因?yàn)槲覀儼匆?guī)范化建立的指標(biāo)體系和表的過程都自動(dòng)保證了所有表都滿
足1st NF。
第二范式(second normal form,簡(jiǎn)稱 2nd NF)是指每個(gè)表必須有一個(gè)(而且僅一個(gè))數(shù)據(jù)元素為主
關(guān)鍵字(primary key),其它數(shù)據(jù)元素與主關(guān)鍵字一一對(duì)應(yīng)。例如,在圖l9.7中如果我們
將合同號(hào)
定義為主關(guān)鍵字(其它數(shù)據(jù)元素中的記錄數(shù)據(jù)都有可能重名,故不能作為主關(guān)鍵字),故只要知道
了一個(gè)合同記錄的合同號(hào),就可以唯一地在同一行中找到該合同的任何一項(xiàng)具體信息。通常我們
稱這種關(guān)系為函數(shù)依賴(functional depEndence)關(guān)系。即表中其它數(shù)據(jù)元素都依賴于主關(guān)鍵字,
或稱該數(shù)據(jù)元素唯一地被主關(guān)鍵字所標(biāo)識(shí)。
第三范式(third normal form,簡(jiǎn)稱 3rd NF)就是指表中的所有數(shù)據(jù)元素不但要能夠唯一地被主
關(guān)鍵字所標(biāo)識(shí),而且它們之間還必須相互獨(dú)立,不存在其它的函數(shù)關(guān)系。也就是說對(duì)于一個(gè)滿足
了 2nd NF的數(shù)據(jù)結(jié)構(gòu)來說,表中有可能存在某些數(shù)據(jù)元素依賴于其它非關(guān)鍵宇數(shù)據(jù)元素的現(xiàn)象,
必須加以消除。
為防止數(shù)據(jù)庫出現(xiàn)更新異常、插入異常、刪除異常、數(shù)據(jù)冗余太大等現(xiàn)象,關(guān)系型數(shù)據(jù)庫要盡量
按關(guān)系規(guī)范化要求進(jìn)行數(shù)據(jù)庫設(shè)計(jì)。下面以教務(wù)管理信息系統(tǒng)為例來進(jìn)行分析。
3. 模式設(shè)計(jì)方法
一個(gè)好的模式設(shè)計(jì)方法應(yīng)符合下列三條原則:
l 表達(dá)性:涉及到兩個(gè)數(shù)據(jù)庫模式的等價(jià)性問題,即數(shù)據(jù)等價(jià)和依賴等價(jià),分別用無損聯(lián)接和保
持函數(shù)依賴來衡量。
l 分離性:是指屬性間的“獨(dú)立關(guān)系”應(yīng)該用不同的關(guān)系模式表達(dá)。獨(dú)立聯(lián)系是我們所考慮的“
基本信息單位”。實(shí)際上分離就是清除存儲(chǔ)異常和數(shù)據(jù)冗余現(xiàn)象。如果能達(dá)到這個(gè)目的,就分離
。分離的基準(zhǔn)就是一系列范式,分離與依賴等價(jià)有時(shí)是不可兼容的。
l 最小冗余性:要求在分解后的數(shù)據(jù)庫能表達(dá)原來數(shù)據(jù)庫的所有信息這個(gè)前提下實(shí)現(xiàn)。目的就是
節(jié)省存儲(chǔ)空間,提高對(duì)關(guān)系的操作效率,清除不必要的冗余。但要注意,在實(shí)際使用中,并不一
定要達(dá)到最小宙余。因?yàn)橛袝r(shí)帶點(diǎn)冗余對(duì)于查詢處理是有好處的。
關(guān)系模式的方法基本上可以分為分解與合成兩大類。分解型算法要求輸入一個(gè)
初始模式集和依賴集,而結(jié)果滿足數(shù)據(jù)等價(jià)要求。對(duì)于合成型算法只要求輸入初始依賴集,結(jié)果
滿足依賴等要求。但它們依據(jù)的基本思想是共同的,即獨(dú)立的聯(lián)系獨(dú)立表示。
§2.2 SQL語言介紹
SQL(Structured Query Language)即“結(jié)構(gòu)式查詢語言”。SQL雖然名為查詢語
言,但實(shí)際上具有定義、查詢、更新和控制等多種功能。由于它使用方便、功能豐富、語言簡(jiǎn)單
易學(xué),很快得到應(yīng)用和推廣。從20世紀(jì)70年代末起,在推出的關(guān)系數(shù)據(jù)庫系統(tǒng)產(chǎn)品ORACLE、SQL/
DS、DB2、SYBASE上實(shí)現(xiàn)了SQL語言。很快,SQL語言被整個(gè)計(jì)算機(jī)界認(rèn)可。1987年6月,國(guó)際標(biāo)準(zhǔn)
化組織(ISO)采納為國(guó)際標(biāo)準(zhǔn)。隨后,ISO對(duì)標(biāo)準(zhǔn)進(jìn)行了大量的修改和擴(kuò)充。在1992年推出了新
的標(biāo)準(zhǔn)-SQL2。SQL的標(biāo)準(zhǔn)化工作還在繼續(xù),新的標(biāo)準(zhǔn)已被命名為SQL3,將包括許多新的數(shù)據(jù)庫概
念,正在不征求意見和進(jìn)行修改
這里將簡(jiǎn)單介紹基于SQL89和SQL2的語言使用概貌:
2.2.1 SQL的組成
SQL主要分成四個(gè)部分:
1)數(shù)據(jù)定義:這一部分也稱為“SQL DDL”,用于定義SQL模式、基本表、視圖和索引。
2)數(shù)據(jù)操縱:這一部分也稱為“SQL DML”。它分為數(shù)據(jù)查詢和數(shù)據(jù)更新兩類。其中數(shù)據(jù)更新又
分成插入、刪除、和修改三種操作。
3)數(shù)據(jù)控制:這一部分包括對(duì)基本表和視圖的授權(quán),完整性規(guī)則的描述,事務(wù)控制等內(nèi)容。
4)嵌入式SQL的使用規(guī)定:這一部分內(nèi)容涉及到SQL語句嵌入在宿主語言程序中使用的規(guī)則。
2.2.2 SQL的數(shù)據(jù)查詢
n SELECT語句的語法
SELECT 目標(biāo)表的列名或列表達(dá)式序列
FROM 基本表和(或)視圖序列
[WHERE行條件表達(dá)式]
[GROUP BY列名序列
[HAVING組條件表達(dá)式]]
[ORDER BY列名[ASC|DESC]…]
句法中[]表示該成分可有,也可無。
整個(gè)語句的執(zhí)行過程如下:
a) 讀取FROM子句中基本表、視圖的數(shù)據(jù),執(zhí)行笛卡爾積操作。
b) 讀取滿足WHERE子句中給出的條件表達(dá)式的元組。
c) 按GROUP子句中指定列的值分組,同時(shí)提取滿足HAVING子句中組條件表達(dá)式的那些組。
d) 按SELECT子句中給出的列名或列表達(dá)式求值輸出。
e) ORDER子句對(duì)輸出的目標(biāo)表進(jìn)行排序,按附加說明ASC升序排列,或按DESC降序排列。
SELECT語句中,WHERE子句稱為“行條件子句”,GROUP子句稱為“分組
子句”,HAVING子句稱為“組條件子句”,ORDER子句稱為“排序子句”。
2.2.3 SQL的數(shù)據(jù)更新
SQL的數(shù)據(jù)更新包括數(shù)據(jù)插入、刪除和修改等三種操作
1)數(shù)據(jù)插入
a) 元組值的插入
INSERT INTO 基本表名(列名表)
VALUES(元組值)
或者 INSERT INTO 基本表名(列名表)
(TABLE(元組值),
(元組值),
……)
前一種格式只能插入一個(gè)元組,后一種格式可以插入多個(gè)元組。
2)數(shù)據(jù)刪除
SQL的刪除操作是指從基本表刪除元組,其語法如下:
DELETE FROM 基本表名
[WHERE條件表達(dá)式]
其語義是從基本表中刪除滿足條件表達(dá)式的元組。
3)數(shù)據(jù)修改
當(dāng)需要修改基本表中元組的某些列值時(shí),可以用UPDATE語句實(shí)現(xiàn),其句法如下:
UPDATE 基本表名
SET 列名=值表達(dá)式[,列名=值表達(dá)式…]
[WHERE條件表達(dá)式]
其語義是:修改基本表中滿足條件表達(dá)式的那些元組中的列值,需修改的列值在SET子句中指出。
§2.3 PB6.5對(duì)數(shù)據(jù)庫的操作
PowerBuilder對(duì)數(shù)據(jù)庫的操作即可以通過數(shù)據(jù)窗口完成(本質(zhì)上是數(shù)據(jù)窗口把在屏幕上對(duì)數(shù)據(jù)
庫的操作轉(zhuǎn)化成SQL語句),又可以在PowerScript語言中直接調(diào)用SQL或存儲(chǔ)過程(本質(zhì)上仍是SQL
語句)完成。下面通過列舉兩個(gè)簡(jiǎn)單實(shí)例來描述在PowerScript程序調(diào)用SQL的方式:
1、SELECT語句查詢返回一行
如果SQL SELECT語句返回的結(jié)果只有一行,可以在PowerScript中書寫以下的SQL語句:
SELECT 列名1,列名2,列名3,…
INTO:變量1,:變量2,:變量3…
FROM 表名1,表名2,表名3,…
WHERE…
其中,“變量1”,“變量2”和“變量3”等都是PowerScript語言的變量。該語句的作用是把數(shù)
據(jù)庫表的“列名1”,“列名2”和“列名3”等列的值從數(shù)據(jù)庫中取出,然后放入對(duì)應(yīng)的“變量1
”,“變量2”和“變量3”等變量中。例如:
String name, extrace
SELECT name,extract INTO : name , : extrace from auths
Where author_code=’A00001’;
該語句僅僅適合于查詢到一條記錄的情況。如果查詢到的記錄是多條,則要用下面的方法。
2、查詢多行
SELECT是描述型語言,它面向的是集合,是一組記錄。而PowerScript語言卻是面向過程的,它要
一條條地接收并處理記錄。PowerScript通過描述型光標(biāo)(CURSOR)在這組記錄上游動(dòng)的方法,給
Script語句逐個(gè)地傳送記錄,建立了集合與記錄間的內(nèi)在聯(lián)系。請(qǐng)看下例:
String name
String V1=’A%’
DECLARE CURSOR FOR file://定義光標(biāo),光標(biāo)名為C1
SELECT name FROM auths file://光標(biāo)對(duì)應(yīng)的SELECT語句
WHERE author_code like :V1; file://SELECT語句中用到了變量V1
OPEN C1; // 打開光標(biāo),此時(shí)執(zhí)行此光標(biāo)對(duì)應(yīng)的SQL SELECT語句。
Lab1:
FETCH C1 INTO :name; file://取記錄,光標(biāo)下移一條
If SQLCA.SQLCode=0 then file://取記錄成功
Goto lab1 file://如果成功取出記錄,則取下一條
End if
打開光標(biāo)的時(shí)候,變量V1被其值“A%”替換,因此最后執(zhí)行的SQL SELECT語句為:
SELECT name FROM auths
WHERE author_code like ‘A%’
執(zhí)行完這條語句后,把光標(biāo)C1定位到了查詢出的第一條記錄上。每執(zhí)行一次語句:
FECTCH C1 INTO。簄ame ;
則取出一條記錄送給變量name,然后光標(biāo)移到下一條記錄。如果想控制查詢結(jié)果的次序,必須在
SELECT語句中用ORDER BY子句,否則,沒有其它的辦法。我們不可能一下子把光標(biāo)定位在某條記
錄上,只能從第一條開始,一個(gè)個(gè)地移。
第三章 PB6.5及其數(shù)據(jù)庫編程
§3.1 開發(fā)工具PowerBuilder6.5
3.1.1 PowerBuilder6.5特點(diǎn)及功能
要適應(yīng)企業(yè)環(huán)境不斷變化的需求,成功地開發(fā)出高質(zhì)量的應(yīng)用系統(tǒng),必須采用先進(jìn)的應(yīng)用開發(fā)工
具。這對(duì)于減輕應(yīng)用開發(fā)人員的開發(fā)負(fù)擔(dān),提高開發(fā)速度和質(zhì)量都有十分重要的意義。Sybase公
司推出的PowerBUilder6.0/6.5是用于Client/Server、Web及組件開發(fā)的企業(yè)級(jí)應(yīng)用開發(fā)工具。它
占全球開發(fā)工具市場(chǎng)近50%,是當(dāng)前最優(yōu)秀的開發(fā)工具之一。它具有以下優(yōu)異的功能和特點(diǎn):
1、內(nèi)置的關(guān)系數(shù)據(jù)庫
PowerBuilder本身帶有一套數(shù)據(jù)庫系統(tǒng)Sybase SQL Anywhere。這樣做的好處是, PowerBuilder
可以脫離網(wǎng)絡(luò)數(shù)據(jù)庫服務(wù)器獨(dú)立運(yùn)行,從而在開發(fā)階段脫離網(wǎng)絡(luò)服務(wù)器上的數(shù)據(jù)庫。當(dāng)然,利用
這一功能也可以開發(fā)和調(diào)試單用戶的獨(dú)立的數(shù)據(jù)庫應(yīng)用。下圖顯示了內(nèi)置數(shù)據(jù)庫的工作原理:
如果沒有內(nèi)置的數(shù)據(jù)庫Sybase SQL Anywhere,開發(fā)時(shí)則不能脫離網(wǎng)絡(luò)服務(wù)器上的數(shù)據(jù)庫(如圖3
-2所示):
2、數(shù)據(jù)窗口(Datawindow)對(duì)象
PowerBuilder擁有數(shù)據(jù)窗口這個(gè)具有專利技術(shù)的智能對(duì)象,利用該對(duì)象可以操作關(guān)系數(shù)據(jù)庫的數(shù)
據(jù)而無需編寫SQL語句。用戶可以查詢、修改、插入、刪除、瀏覽、打印、以多種文件格式打開和
存儲(chǔ)數(shù)據(jù),或在數(shù)據(jù)窗口中直接定義功能按鈕實(shí)現(xiàn)預(yù)定義的系統(tǒng)功能,如插入、刪除數(shù)據(jù)的操作
。它還支持?jǐn)?shù)據(jù)庫事務(wù)管理和并發(fā)控制等機(jī)制。其工作機(jī)理如下圖所示:
3、豐富的數(shù)據(jù)窗口數(shù)據(jù)源和多種樣式的數(shù)據(jù)顯示格式
數(shù)據(jù)窗口可以用來維護(hù)數(shù)據(jù)和顯示數(shù)據(jù),可定義多種顯示風(fēng)格和數(shù)據(jù)顯示格式;并且還可以與
TreeView控制、ListView控制配合使用,創(chuàng)建出更豐富的數(shù)據(jù)顯示格式
4、支持多種商業(yè)圖形,包括多種類型的二維和三維的圖形
5、支持組件的開發(fā)和調(diào)用
用PowerBuilder開發(fā)的組件,可以在其它應(yīng)用中調(diào)用,可以由多種事務(wù)管理服務(wù)器管理。
6、具有面向?qū)ο蟮奶卣?br />PowerBuilder采用了面向?qū)ο蟮拈_方式,這可以使系統(tǒng)開發(fā)人員在無需精通專用語言的情況下就
可以迅速轉(zhuǎn)向面向?qū)ο蟮拈_發(fā)。PowerBuilder應(yīng)用是由一系列對(duì)象組成的,包括窗口、菜單、函
數(shù)、數(shù)據(jù)窗口和各種控制等對(duì)象,它支持對(duì)象的繼承、封裝和多態(tài)性。
7、有機(jī)結(jié)合的集成開發(fā)環(huán)境
8、完全支持Windows的窗口信息和控制
9、強(qiáng)有力的PowerScript編程語言
它能使開發(fā)人員很容易地將簡(jiǎn)單或復(fù)雜的事務(wù)邏輯與應(yīng)用相配合。該語言還有幾百個(gè)函數(shù)用于操
縱對(duì)象、處理數(shù)字、文本、字符串、日期和應(yīng)用分布,進(jìn)行文件處理、報(bào)表打印,用DDE和OLE 2
.0進(jìn)行程序之間的通信,直接調(diào)用SQL語句操縱數(shù)據(jù)庫等等。
10、PowerBuilder提供了多種流行軟件的接口庫
Netware Library
Pen Computing Library
Lotus Notes Library
Microsoft MAPI
11、PowerBuilder支持多種平臺(tái)
目前,PowerBuilder能夠在Microsoft Windows 3.X、Windows 95Windows NTAlpha/IntelApple
Mac Sun Saloris IBM AIX HP Unix等多種平臺(tái)上開發(fā)和運(yùn)行應(yīng)用程序,并能夠不加改動(dòng)地應(yīng)用于
其它平臺(tái)上。
12、支持Internet/Intranet下的Web應(yīng)用開發(fā)
13、支持團(tuán)體開發(fā)
14、對(duì)多種數(shù)據(jù)庫的支持
PowerBuilder幾乎支持所有的數(shù)據(jù)庫,它提供了到多種數(shù)據(jù)庫的專用接口和ODBC接口。
§3.2 PowerBuilder與Client/Server體系結(jié)構(gòu)
3.2.1 Client/Server模式
在C/S結(jié)構(gòu)中,存在著幾個(gè)非常重要的基本概念,它們是:主機(jī)、終端、客戶機(jī)、工作站和服務(wù)器
。在分析C/S網(wǎng)絡(luò)結(jié)構(gòu)之前,必須搞清楚它們之間的區(qū)別。
最早的計(jì)算機(jī)網(wǎng)絡(luò)是伴隨著主機(jī)(Host)和終端(Terminal)這兩個(gè)概念的出現(xiàn)而產(chǎn)生的。當(dāng)時(shí)的
主機(jī)通常是指具有中央處理單元(CPU)的大型機(jī)或功能較強(qiáng)的小型機(jī),而終端則是指計(jì)算機(jī)的輸
入輸出設(shè)備。終端沒有自己的CPU,當(dāng)然也沒有自己的內(nèi)存,其主要功能是將鍵盤輸入的請(qǐng)求數(shù)據(jù)
發(fā)往主機(jī)并將主機(jī)的運(yùn)算結(jié)果顯示出來。主機(jī)和終端共同構(gòu)成了集中式系統(tǒng)結(jié)構(gòu)。在這種應(yīng)用系
統(tǒng)中,幾乎所有的工作都是由主機(jī)來完成,終端僅僅作為一種輸入輸出設(shè)備,因此系統(tǒng)負(fù)荷重、
效率低、擴(kuò)充性差。
之后隨著計(jì)算機(jī)網(wǎng)絡(luò)結(jié)構(gòu)的細(xì)化,不同的計(jì)算機(jī)開始在網(wǎng)絡(luò)中擔(dān)負(fù)不同的任務(wù),于是出現(xiàn)了文件
服務(wù)器/網(wǎng)絡(luò)工作站(F/W)式結(jié)構(gòu)的模型。其中,工作站(Workstation)和服務(wù)器(Server)都
是獨(dú)立的計(jì)算機(jī)。當(dāng)一臺(tái)連入網(wǎng)絡(luò)的計(jì)算機(jī)向其它計(jì)算機(jī)(工作站)提供各種網(wǎng)絡(luò)服務(wù)(如數(shù)據(jù)
、文件的共享)時(shí),它就被叫做服務(wù)器。而那些用于訪問服務(wù)器資料的計(jì)算機(jī)則被叫做工作站。
在F/W結(jié)構(gòu)中,所有實(shí)際的數(shù)據(jù)處理工作仍在運(yùn)行數(shù)據(jù)庫應(yīng)用程序的PC工作站上完成,因此不論文
件服務(wù)器的性能有多高,其整體網(wǎng)絡(luò)性能都將受到PC機(jī)能力的限制。
客戶機(jī)(Client)是伴隨C/S數(shù)據(jù)訪問的興起而被提出來的,在一般人的理解中它和F/W概念沒有
本質(zhì)的區(qū)別。但是,嚴(yán)格說來,C/S模型并不是從物理分布的角度來定義的。它既包括具體的網(wǎng)絡(luò)
結(jié)構(gòu)設(shè)計(jì),又包括軟件的運(yùn)行和組織,所體現(xiàn)的是一種網(wǎng)絡(luò)數(shù)據(jù)的訪問方式。這里的客戶機(jī)和服
務(wù)器不僅指承擔(dān)不同任務(wù)的計(jì)算機(jī)本身,而且包括主機(jī)上運(yùn)行的客戶端和服務(wù)器端的軟件環(huán)境。
它們的區(qū)別,是相對(duì)于各自在網(wǎng)絡(luò)數(shù)據(jù)庫訪問中所處的地位或?qū)崿F(xiàn)的功能而言的。
理解了以上的基本概念,才可以更好地理解C/S結(jié)構(gòu)的實(shí)質(zhì)和運(yùn)行方式:所謂C/S結(jié)構(gòu),是將數(shù)據(jù)
存取與應(yīng)用程序分離開來,把一個(gè)軟件系統(tǒng)或應(yīng)用系統(tǒng)按功能分成若干個(gè)部分,再將這些軟件的
組成部分按其不同的角色分成Client軟件和Server軟件,分別放置在客戶機(jī)和服務(wù)器上?蛻魴C(jī)
程序負(fù)責(zé)用戶交互界面、數(shù)據(jù)表示及應(yīng)用處理邏輯等應(yīng)用部分,而服務(wù)器端則負(fù)責(zé)數(shù)據(jù)存取管理
、完整性控制及并發(fā)控制等數(shù)據(jù)庫管理部分?蛻魴C(jī)程序應(yīng)用通過SQL語句訪問數(shù)據(jù)庫,相應(yīng)的
SQL語句經(jīng)網(wǎng)絡(luò)傳輸?shù)椒⻊?wù)器端,由服務(wù)器端的數(shù)據(jù)庫服務(wù)器解釋執(zhí)行這些SQL語句,執(zhí)行后的結(jié)
果數(shù)據(jù)送回客戶機(jī)。
3.2.2 Client/Server體系結(jié)構(gòu)的優(yōu)缺點(diǎn)
我們看到,客戶/服務(wù)器體系結(jié)構(gòu)有以下優(yōu)點(diǎn):
l 應(yīng)用邏輯與數(shù)據(jù)實(shí)現(xiàn)分離,實(shí)現(xiàn)了在網(wǎng)絡(luò)上的負(fù)載均衡;
l 充分利用了網(wǎng)絡(luò)服務(wù)器的處理能力?蛻糁行鑼⒄(qǐng)求送數(shù)據(jù)庫服務(wù)器,數(shù)據(jù)查詢工作由服務(wù)器
來承擔(dān),服務(wù)器的能力可以得到充分的發(fā)揮。
但是它也有以下一些缺點(diǎn):
l 由于計(jì)算機(jī)技術(shù)的快速進(jìn)步和企業(yè)需求變化的加快,企業(yè)面臨的硬件、網(wǎng)絡(luò)操作系統(tǒng)、數(shù)據(jù)庫
系統(tǒng)、開發(fā)工具、應(yīng)用系統(tǒng)的升級(jí)周期越來越短,因此“維護(hù)”客戶服務(wù)器的費(fèi)用就變得越來越
高昂。
l 快速升級(jí)的硬件、網(wǎng)絡(luò)操作系統(tǒng)、數(shù)據(jù)庫系統(tǒng)、開發(fā)工具使企業(yè)的技術(shù)人員失去了方向:不斷
地消化新技術(shù),卻無瑕顧及企業(yè)要解決的問題
l 在客戶端,必須安裝操作系統(tǒng)(一般為Windows95/NT)、網(wǎng)絡(luò)軟件、特定的中間件(Sybasse
Net-Library)以及應(yīng)用軟件系統(tǒng)才能工作,因此應(yīng)用系統(tǒng)的安裝、升級(jí)和維護(hù)通常需要專業(yè)人員
才能用勝任,且必須各站點(diǎn)逐個(gè)安裝,從而使客戶端的維護(hù)費(fèi)用變得也很高昂。對(duì)主機(jī)系統(tǒng)來說
,這一點(diǎn)要優(yōu)越的多,只需要在主機(jī)上安裝一次即可。
3.2.3 PowerBuilder是客戶/服務(wù)器體系結(jié)構(gòu)下客戶端的開發(fā)工具
前面已提到,PowerBuilder是客戶/服務(wù)器體系結(jié)構(gòu)下開發(fā)客戶程序用的開發(fā)工具,用
>PowerBuilder開發(fā)出的程序可以存取數(shù)據(jù)庫中的數(shù)據(jù)。下圖表示了PowerBuilder與數(shù)據(jù)庫配合工
作的方式。
我們看到,PowerBuilder作為客戶端的應(yīng)用開發(fā)工具,主要完成的是表示邏輯方面的工作,例如
,菜單、錄入界面。而數(shù)據(jù)庫服務(wù)器管理的是事務(wù)邏輯和數(shù)據(jù)存取方面的工作。因此,
PowerBuilder開發(fā)工作應(yīng)分為兩部分,一部分是前臺(tái)表示邏輯方面的工作,另一部分是數(shù)據(jù)庫后
臺(tái)方面的設(shè)計(jì)工作(如數(shù)據(jù)庫觸發(fā)器、存儲(chǔ)過程和視圖等的設(shè)計(jì))。一個(gè)好的應(yīng)用系統(tǒng),前臺(tái)開
發(fā)與后設(shè)計(jì)應(yīng)是有機(jī)結(jié)合、合理分布的;良好的后臺(tái)設(shè)計(jì)可以降低前臺(tái)的開工作量,提高系統(tǒng)的
運(yùn)行效率。
§3.3 PowerBuilder6.5數(shù)據(jù)庫編程
PowerBuilder與數(shù)據(jù)庫的關(guān)系是“配合”與“協(xié)調(diào)”的關(guān)系。PowerBuilder完成數(shù)據(jù)請(qǐng)求、數(shù)據(jù)
表現(xiàn)、菜單、界面等表象方面的工作,而數(shù)據(jù)庫服務(wù)器完成數(shù)據(jù)庫數(shù)據(jù)的存儲(chǔ)管理、安全管理、
并發(fā)控制、事務(wù)管理、完整性維護(hù)、查詢優(yōu)化等工作。
PowerBuilder在操作數(shù)據(jù)庫時(shí)與以下幾方面有關(guān):
1、在數(shù)據(jù)庫畫筆中定義數(shù)據(jù)庫表和視圖
l 定義表的結(jié)構(gòu)
l 表中列的擴(kuò)展屬性
² 定義表中列的顯示風(fēng)格
² 定義表中列的編輯屏蔽
² 定義表中列的校驗(yàn)
l 定義表的主鍵
l 定義表的外部鍵
l 定義表的索引
PowerBuilder有五個(gè)系統(tǒng)表,這五個(gè)系統(tǒng)表是PowerBuilder初次連接到數(shù)據(jù)庫時(shí)系統(tǒng)自動(dòng)建立的
。下表給出了這個(gè)系統(tǒng)表的表名和它們的作用
PowerBuilder系統(tǒng)表 用途
PBCATTBL 存放表或視圖,表或視圖中列的缺省字體。
PBCATCOL 存放列用到的顯示風(fēng)格名、校驗(yàn)規(guī)則名和編輯風(fēng)格名;列的標(biāo)題、列的標(biāo)簽、字體的大
小寫,字體的對(duì)齊方式。
PBCATFMT 列的顯示風(fēng)格定義。
PBCATVLD 列的校驗(yàn)規(guī)則定義。
PBCATEDT 列的編輯風(fēng)格定義。
表3-1 PowerBuilder系統(tǒng)表
2、在數(shù)據(jù)庫畫筆中在圖形方式下操作數(shù)據(jù)庫
這些操作包括:
l 插入記錄
l 修改記錄
l 刪除記錄
l 查詢記錄
l 把查詢出的記錄存入文件
l 把表或視圖的定義轉(zhuǎn)變成建表的SQL語名
這些功能是給開發(fā)人員和管理人員提供的。
3、在數(shù)據(jù)庫畫筆中用SQL語句執(zhí)行平臺(tái)管理操作數(shù)據(jù)庫
l 生成數(shù)據(jù)庫
l 管理數(shù)據(jù)庫
l 維護(hù)數(shù)據(jù)
在這里創(chuàng)建的表和規(guī)則不會(huì)記錄在PowerBuilder系統(tǒng)表中
4、在查詢畫筆中定義查詢對(duì)象
如果一個(gè)查詢動(dòng)作要多次使用,還可以用PowerBuilder的查詢畫表生成查詢對(duì)象這個(gè)查詢對(duì)象不
能由數(shù)據(jù)庫畫表調(diào)用,它只能由查詢畫表本身調(diào)用執(zhí)行。在建立數(shù)據(jù)窗口時(shí),數(shù)據(jù)源也可以做在
查詢對(duì)象之上。
事實(shí)上,查詢對(duì)象就是寫好了的SQL語句,它存在PowerBuilder的pbl文件中,在使用的時(shí)候調(diào)用
即可。
5、用數(shù)據(jù)管道在不同數(shù)據(jù)庫之間轉(zhuǎn)換數(shù)據(jù)
數(shù)據(jù)管道允許把一個(gè)數(shù)據(jù)庫的數(shù)據(jù)(一個(gè)或多個(gè)表中的全部或部分行)轉(zhuǎn)入到
另一個(gè)數(shù)據(jù)庫的一個(gè)表中(這個(gè)表可以存在或不存在),從而可以使數(shù)據(jù)在不同數(shù)據(jù)庫之間相互
復(fù)制。
6、用數(shù)據(jù)窗口操作數(shù)據(jù)庫
Datawindow是PowerBuilder操作數(shù)據(jù)庫的重要的手段,通過數(shù)據(jù)窗口可以查
修改、插入和刪除數(shù)據(jù)庫的數(shù)據(jù)。PowerBuilder數(shù)據(jù)窗口操作數(shù)據(jù)庫的能力非常強(qiáng),是
PowerBuilder的精華所在。
l 數(shù)據(jù)窗口的數(shù)據(jù)源可以是:
² 表或視圖
² 多表連接
² 查詢對(duì)象
² 外部數(shù)據(jù)源
² 存儲(chǔ)過程
l 數(shù)據(jù)窗口列數(shù)據(jù)的顯示風(fēng)格
l 數(shù)據(jù)窗口列的編輯屏蔽
l 數(shù)據(jù)窗口列的校驗(yàn)
7、PowerScript直接調(diào)用SQL語句操作數(shù)據(jù)庫
PowerBuilder對(duì)數(shù)據(jù)庫的操作即可以通過數(shù)據(jù)窗口完成(本質(zhì)上是數(shù)據(jù)窗口屏幕上對(duì)數(shù)據(jù)庫的操作
轉(zhuǎn)化成SQL語句),又可以在PowerScript語言中直接調(diào)用SQL或存儲(chǔ)過程(本質(zhì)上仍是SQL語句)完成
。詳細(xì)操作在第*個(gè)章節(jié)已經(jīng)介紹。
第四章 局域網(wǎng)圖書資料查詢系統(tǒng)設(shè)計(jì)分析
根據(jù)數(shù)據(jù)庫系統(tǒng)生存期的設(shè)計(jì)方法,從數(shù)據(jù)庫應(yīng)用系統(tǒng)和開發(fā)的全過程來考慮,將數(shù)據(jù)庫應(yīng)用系
統(tǒng)設(shè)計(jì)分為以下幾個(gè)階段(見圖4-1)
1)規(guī)劃;
2)需求分析;
3)概念設(shè)計(jì);
4)邏輯設(shè)計(jì)
5)物理設(shè)計(jì)
§4.1 應(yīng)用需求分析
要設(shè)計(jì)一個(gè)良好的局域網(wǎng)圖書資料查詢系統(tǒng),就必須首先明確該應(yīng)用環(huán)境對(duì)系統(tǒng)的要求。局域網(wǎng)
圖書資料查詢系統(tǒng)的應(yīng)用背景為:一個(gè)數(shù)十人的科研或開發(fā)小組,搜集了上千冊(cè)有用的圖書資料
,其中有一部分分布在個(gè)人手中,為了方便大家查閱,需要對(duì)每本書的狀態(tài)進(jìn)行跟蹤,另新進(jìn)和
丟失的圖書資料必須得到及時(shí)的反映。因此,該系統(tǒng)需滿足以下幾方面需求:
l 用戶的管理:必須具有使用權(quán)限的用戶才能成功登錄到系統(tǒng)中來。所謂用戶權(quán)限在這里并不要
求有功能上具體的劃分,集中實(shí)行松散管理,這建立在用戶高度自覺的基礎(chǔ)上。所以,在這里只
需給每個(gè)需要使用系統(tǒng)的人一個(gè)用戶名和密碼,即可登錄系統(tǒng)進(jìn)行各種操作。新的用戶需要取得
管理員的許可將其加入系統(tǒng),加入系統(tǒng)的用戶可以對(duì)自己的用戶密碼進(jìn)行修改。
l 查詢功能:系統(tǒng)需要提供幾種不同方式的查詢手段,以實(shí)現(xiàn)靈活方便地管理整個(gè)系統(tǒng)。
² 圖書分類查詢:一本圖書包括書名、出版社、作者、保管人等多個(gè)信息,這就要求系統(tǒng)能按照
不同的信息類別對(duì)圖書進(jìn)行查詢。比如說,按書名查詢、按作者查詢等。選定需要的查詢信息類
別,再輸入想查詢的內(nèi)容即可查詢到相關(guān)的圖書信息。
² 多條件查詢:很多時(shí)候,用戶需要了解的信息不僅僅局限于一個(gè)條件,比方說想同時(shí)查詢書名
為“數(shù)據(jù)庫原理”但出版社僅為“經(jīng)濟(jì)科學(xué)出版社”的圖書信息時(shí),單純的分類查詢就不能滿足
用戶的需要,這時(shí)就要用到多條件查詢。也就是說,多條件查詢不僅可以實(shí)現(xiàn)單個(gè)的分類查詢,
還可以實(shí)現(xiàn)多條分類查詢的組合查詢。每個(gè)查詢條件之間用“并且”或“或者”的關(guān)系關(guān)聯(lián)起來
組成完整的查詢條件。
² 模糊查詢:對(duì)于用戶來說并不一定完全記得某本圖書準(zhǔn)確的名稱,類似,對(duì)于作者、出版社等
等信息來說,很多時(shí)候用戶只是記得一些相關(guān)的信息而不是一字不差的準(zhǔn)確信息。這個(gè)時(shí)候就要
用到模糊查詢。用戶輸入查詢內(nèi)容后,系統(tǒng)將會(huì)把包含查詢內(nèi)容的(注意:并不是精確的等于查詢
內(nèi)容)所有相關(guān)圖書信息顯示出來,以使用戶得到準(zhǔn)確的、自己真正需要的信息內(nèi)容。
l 更新與編輯:
² 更新:系統(tǒng)允許用戶對(duì)查詢到的內(nèi)容進(jìn)行修改并且存盤。
² 編輯:系統(tǒng)允許用戶對(duì)現(xiàn)庫進(jìn)行插入、刪除的操作,保證現(xiàn)庫的真實(shí)性與實(shí)時(shí)性。
l 打印輸出:系統(tǒng)可以將用戶查詢到的內(nèi)容動(dòng)態(tài)地生成報(bào)表,并打印輸出。
§4.2 系統(tǒng)功能模塊劃分
局域網(wǎng)圖書圖書資料查詢系統(tǒng)功能劃分模塊圖如下:
§4.3 系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)
4.3.1 概念設(shè)計(jì)
概念設(shè)計(jì)的目標(biāo)是產(chǎn)生反映局域網(wǎng)圖書資料查詢系統(tǒng)需求的數(shù)據(jù)庫概念結(jié)構(gòu),即概念模式。概念
模式是獨(dú)立于數(shù)據(jù)庫邏輯結(jié)構(gòu),獨(dú)立于支持?jǐn)?shù)據(jù)庫的DBMS,不依賴于計(jì)算機(jī)系統(tǒng)的。
l ER模型
ER模型是對(duì)現(xiàn)實(shí)世界的一種抽象。它的主要成分是實(shí)體、聯(lián)系和屬性。使
用這三種成分,我們可以建立許多應(yīng)用環(huán)境的ER模型。
l ER模型的操作
在利用ER模型進(jìn)行數(shù)據(jù)庫概念設(shè)計(jì)的過程中,常常需要對(duì)ER圖進(jìn)行種種
變換。這些變換又稱為ER模型的操作,包括實(shí)體類型、聯(lián)系類型和屬性的分裂、合并和增刪等等
。
l 利用ER方法的數(shù)據(jù)庫概念設(shè)計(jì)
利用ER方法進(jìn)行數(shù)據(jù)庫的概念設(shè)計(jì),可以分成三步進(jìn)行:首先設(shè)計(jì)局部ER
模式,然后把各局部ER模式綜合成一個(gè)全局ER模式,最后對(duì)全局ER模式進(jìn)行優(yōu)化,得到最終
的ER模式,即概念模式。
1. 設(shè)計(jì)局部的ER模式
通常,一個(gè)數(shù)據(jù)庫系統(tǒng)都是為多個(gè)不同用戶服務(wù)的。各個(gè)用戶對(duì)數(shù)據(jù)的觀點(diǎn)可能不一樣,信息處
理需求也可能不同。在設(shè)計(jì)數(shù)據(jù)庫概念結(jié)構(gòu)時(shí),為了更好地模擬現(xiàn)實(shí)世界,一個(gè)有效的策略是“
分而治之”,即先分別考慮各個(gè)用戶的信息需求,形成局部概念結(jié)構(gòu),然后再綜合成全局結(jié)構(gòu)。
在ER方法中,局部概念結(jié)構(gòu)又稱為局部ER模式,其圖形表示稱為ER圖。
實(shí)體和屬性的定義如下:
圖書(資料編號(hào),資料名稱,作者,出版社,出版日期,ISBN,資料類別,購(gòu)買日期,保管人,
備注)
用戶(編號(hào),用戶代碼,用戶姓名,登錄口令,使用權(quán)限,查詢顯示項(xiàng),用戶顯示頭像)
資料類別(資料編號(hào),資料類別)
出版社(出版社編號(hào),出版社)
2. 聯(lián)系定義:
ER模型的“聯(lián)系”用于刻畫實(shí)體之間的關(guān)聯(lián)。一種完整的方式是對(duì)局部結(jié)構(gòu)中任意兩個(gè)實(shí)體類型
,依據(jù)需求分析的結(jié)果,考察局部結(jié)構(gòu)中任意兩個(gè)實(shí)體類型之間是否存在聯(lián)系。若有聯(lián)系,進(jìn)一
步確定是1:N,M:N,還是1:1等。還要考察一個(gè)實(shí)體類型內(nèi)部是否存在聯(lián)系,兩個(gè)實(shí)體類型之間是
否存在聯(lián)系,多個(gè)實(shí)體類型之間是否存在聯(lián)系,等等。聯(lián)系定義如圖4-5所示。解釋如下:
l 一個(gè)用戶可以保管多本圖書資料,而一本圖書資料只能由一個(gè)用戶保管;
l 一個(gè)資料類別可以對(duì)應(yīng)多本圖書,而一本圖書只對(duì)應(yīng)一個(gè)資料類別;
l 一本圖書由一個(gè)出版社出版,而一個(gè)出版社可以出版多種圖書。
3. 設(shè)計(jì)全局ER模式
所有局部ER模式都設(shè)計(jì)好了后,接下來就是把它們綜合成單一的全局概念結(jié)構(gòu)。全局概念結(jié)構(gòu)不
僅要支持所有局部ER模式,而且必須合理地表示一個(gè)完整、一致的數(shù)據(jù)庫概念結(jié)構(gòu)。
1)確定公共實(shí)體類型
為了給多個(gè)局部ER模式的合并提供開始合并的基礎(chǔ),首先要確定各局部結(jié)構(gòu)中的公共實(shí)體類型。
在這一步中我們僅根據(jù)實(shí)體類型名和鍵枕認(rèn)定公共實(shí)體類型。一般把同名實(shí)體類型作為公共實(shí)體
類型的一類候選,把具有相同鍵的實(shí)體類型作為公共實(shí)體類型的另一類候選。
2)局部ER模式的合并
合并的原則是:首先進(jìn)行兩兩合并;先和合并那些現(xiàn)實(shí)世界中有聯(lián)系的局部結(jié)構(gòu);合并從公共實(shí)
體類型開始,最后再加入獨(dú)立的局部結(jié)構(gòu)。
>3)消除沖突
沖突分為三類:屬性沖突、結(jié)構(gòu)沖突、命名沖突。
設(shè)計(jì)全局ER模式的目的不在于把若干局部ER模式形式上合并為一個(gè)ER模式,而在于消除沖突,使
之成為能夠被所有用戶共同理解和接受的同一的概念模型。
3)全局ER模式的優(yōu)化
在得到全局ER模式后,為了提高數(shù)據(jù)庫系統(tǒng)的效率,還應(yīng)進(jìn)一步依據(jù)處理需求對(duì)ER模式進(jìn)行優(yōu)化
。一個(gè)好的全局ER模式,除能準(zhǔn)確、全面地反映用戶功能需求外,還應(yīng)滿足下列條件:實(shí)體類型
的個(gè)數(shù)要盡可能的少;實(shí)體類型所含屬性個(gè)數(shù)盡可能少;實(shí)體類型間聯(lián)系無冗余。
4.3.2 邏輯設(shè)計(jì)
由于概念設(shè)計(jì)的結(jié)果是ER圖,DBMS一般采用關(guān)系型,因此數(shù)據(jù)庫的邏輯設(shè)計(jì)過程就是把ER圖轉(zhuǎn)化
為關(guān)系模式的過程。由于關(guān)系模型古有的優(yōu)點(diǎn),邏輯設(shè)計(jì)可以充分運(yùn)用關(guān)系數(shù)據(jù)庫規(guī)范化理論,
使設(shè)計(jì)過程形式化地進(jìn)行。設(shè)計(jì)結(jié)果是一組關(guān)系模式的定義。
1)導(dǎo)出初始關(guān)系模式
圖4-5 關(guān)系模式集
2)關(guān)系子模式
子模式是用戶所用到的那部分?jǐn)?shù)據(jù)的描述。除了指出用戶用到的數(shù)據(jù)外,還應(yīng)指出數(shù)據(jù)與概念模
式中相應(yīng)數(shù)據(jù)的聯(lián)系,即指出概念模式與子模式之間的對(duì)應(yīng)性。
圖書信息子模式((編號(hào)#,資料名稱,作者,出版社,出版日期,ISBN,資料類別,購(gòu)買日期
,保管人,備注)用戶信息子模式(編號(hào),用戶代碼,用戶姓名,登錄口令,使用權(quán)限,查詢顯
示項(xiàng),用戶顯示頭像)
圖4-6 部分子模式
4.3.3 數(shù)據(jù)庫的實(shí)現(xiàn)
我們選用Microsoft Office中的Access數(shù)據(jù)庫來進(jìn)行數(shù)據(jù)庫的邏輯設(shè)計(jì)。首先創(chuàng)建四個(gè)基本數(shù)據(jù)
庫表如如4-1-4-5所示,然后建立各個(gè)表之間的聯(lián)系,如圖4-8所示。
第五章 局域圖書資料查詢系統(tǒng)應(yīng)用程序設(shè)計(jì)
§5.1 系統(tǒng)模塊組成
§5.2 登錄模塊實(shí)現(xiàn)
圖5-2 登錄模塊圖
該窗口所含的控件信息如下:
風(fēng) 格 控件名 說 明
用戶名 Single line edit Sle_1 ------
口令 Single line edit Sle_1 Propeties:passwd
登錄日期 Edit Mask Em_1 mask type:datamm/dd/yyyy
表5-1 登錄模塊控件信息表
控件:Sle_1 事件(event):Modified Script of modified:
string input_code,namesetfocus() file://將光標(biāo)定位在該控件
input_code=string(this.text) file://接收用戶輸入的值,并賦值給變量select name into
:name from keeperwhere id=:input_code or pym=:input_code;//從用戶表里查找滿足輸入條件
的記錄if sqlca.sqlcode=0 then this.Text=name setfocus(sle_2) file://查找成功,則光
標(biāo)跳轉(zhuǎn)到“口令”控件else if sqlca.sqlcode=100 then messagebox("提示!",& "對(duì)不起,
用戶不存在!",& StopSign!) return 1 file://查找不到符合條件的記錄則提示 else
messagebox("錯(cuò)誤!",& "error:"+string(sqlca.sqldbcode)& +"information:"+sqlca.
sqlerrtext) file://SQL出錯(cuò)提示 end ifend if
控件:Sle_2 事件(event):Modified Script of modified:
string input_passwd,passwd,droitinput_passwd=RightTrim(this.text)//去掉輸入值右邊的空
格select passwd into :passwdfrom keeperwhere name=:sle_1.text;passwd=RightTrim(
passwd);//從用戶表中校驗(yàn)口令的正確性if sqlca.sqlcode=0 then if input_passwd <>
passwd then messagebox('口令錯(cuò)誤','對(duì)不起,請(qǐng)重新輸入',stopsign!); sle_2.
SelectText(1, Len(sle_2.Text)) this.Clear()//口令錯(cuò)誤則清除輸入內(nèi)容 setfocus
(sle_2) elseif input_passwd=passwd then user=righttrim(sle_1.text) select droit
into :droit from keeper
where name=:user;//口令正確將用戶操作權(quán)限賦值給變量
open(main)//打開程序主窗口 close(w_login)//關(guān)閉登錄窗口 end ifelseif
sqlca.sqlcode=100 then messagebox('提示!','無數(shù)據(jù)',Stopsign!) return 1else
messagebox("錯(cuò)誤!",& "error:"+string(sqlca.sqldbcode)& +"information:"+sqlca.
sqlerrtext) file://SQL出錯(cuò)提示end if
在登錄模塊中,用戶可輸入自己的編號(hào)或編碼來登錄系統(tǒng)。系統(tǒng)會(huì)根據(jù)用戶輸入的編號(hào)或編碼值
來自動(dòng)給出確實(shí)已存在庫中的用戶中文名,若查找不到庫中相匹配的記錄則提示出錯(cuò)或重輸。若
用戶存在,則提示輸入口令,口令正確則會(huì)順利進(jìn)入該系統(tǒng)主界面。
§5.3 查詢模塊的實(shí)現(xiàn)
圖5-3 查詢窗口
該窗口(w_main)控件列表如下:
風(fēng) 格 控件名 說 明
顯示項(xiàng) Group Box gb_1 ------
資料名稱 Check Box cbx_1 Checked:true
作者 Check Box cbx_2 Checked:true
出版社 Check Box cbx_3 Checked:true
出版日期 Check Box cbx_4 Checked:false
類別 Check Box cbx_5 Checked:true
購(gòu)買日期 Check Box cbx_6 Checked:false
ISBN Check Box cbx_7 Checked:false
保管人 Check Box cbx_8 Checked:true
備注 Check Box cbx_9 Checked:false
全選 Check Box cbx_10 選擇全部顯示項(xiàng)
檢索 Picture Box pb_1 模糊查詢檢索
插入 Picture Box pb_2 插入一條記錄
刪除 Picture Box pb_3 刪除一條記錄
檢索 Picture Box pb_4 組合查詢檢索
全部記錄 Picture Box pb_5 檢索全部記錄
退出 Picture Box pb_6 退出查詢界面
修改 Picture Box pb_7 進(jìn)入編輯模式
插入 Picture Box pb_8 插入一條查詢條件
刪除 Picture Box pb_9 刪除一條查詢條件
存盤 Picture Box pb_10 修改后的數(shù)據(jù)存盤
打印 Picture Box pb_11 打印查詢結(jié)果報(bào)表
存為默認(rèn)顯示項(xiàng) Picture Box pb_12 將顯示項(xiàng)存為當(dāng)前用戶默認(rèn)
------ Single line edit sle_1 查詢內(nèi)容輸入(字符型)
------ Edit mask em_1 查詢內(nèi)容輸入(日期型)
------ Static text st_1 顯示當(dāng)前用戶名
------ Picture P_1 修改按鈕裝飾
------ Picture P_2 Gb_1顯示裝飾
------ Picture P_3 顯示當(dāng)前用戶頭像
------ Drop down list box ddlb_1 查詢項(xiàng)選擇
------ Drop down list box ddlb_2 查詢操作符選擇
------ Tab control tab_1 共有三個(gè)tabpage頁tabpage1:模糊查詢tabpage2:組合查詢tabpage3:
更新打印
------ Datawindows control dw_1 對(duì)應(yīng)數(shù)據(jù)窗口d_information圖書信息檢索
------ Datawindows control dw_2 對(duì)應(yīng)數(shù)據(jù)窗口d_query_condition查詢條件檢索
Command button Cb_2 模糊查詢操作符英-中轉(zhuǎn)換
表5-2 查詢模塊控件信息表
控件:w_main 事件(event):open Script of open
string mode,p,xs,headboolean xs_item[10]integer idw_1.settransobject(sqlca)dw_1.
Retrieve()//打開窗口顯示全部記錄sj_check=0//為檢索窗口排序變量賦初值st_1.text=user//
在查詢窗口右上角顯示當(dāng)前用戶名SELECT "keeper"."display_item", "keeper"."
head_picture" INTO :xs, :head FROM "keeper" WHERE "keeper"."name" = :user;
//從用戶表中讀出當(dāng)前用戶的頭像值及顯示像值并分別賦值給變量 file://有頭像的用戶則顯示
在查詢窗口右上角if isnull(head) thenp_3.visible=false else p_3.picturename=
headend if ////將當(dāng)前用戶查詢顯示項(xiàng)變量讀出并賦值給每個(gè)查詢顯示控件for i=1 to 8 if
Mid (xs, i, 1)='0' then xs_item[i]=false else xs_item[i]=true end ifend for////給每
個(gè)對(duì)應(yīng)的CHECKBOX賦值,確實(shí)是勾還是叉cbx_2.checked = xs_item[1]cbx_3.checked =
xs_item[2]cbx_4.checked = xs_item[3]cbx_5.checked = xs_item[4]cbx_6.che