- 相關(guān)推薦
Oracle數(shù)據(jù)庫(kù)視圖管理技巧
視圖,對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),是一個(gè)最基本的、也是最重要的功能之一。數(shù)據(jù)庫(kù)視圖設(shè)計(jì)的好壞,直接跟數(shù)據(jù)庫(kù)的性能相關(guān)。而且,在大型數(shù)據(jù)庫(kù)設(shè)計(jì)中,大家分工合作,基礎(chǔ)表的設(shè)計(jì)與報(bào)表視圖的設(shè)計(jì)往往由不同的人負(fù)責(zé)。所以,視圖的設(shè)計(jì)管理跟基礎(chǔ)表的設(shè)計(jì)管理一樣,都有很大的學(xué)問(wèn)。
技巧一:把基礎(chǔ)表與視圖脫離開(kāi)來(lái)。
一般來(lái)說(shuō),視圖都是在基礎(chǔ)表的上面建立起來(lái)的。也就是說(shuō),要先有基礎(chǔ)表,而后有視圖。但是,在大型數(shù)據(jù)庫(kù)的設(shè)計(jì)過(guò)程中,出于項(xiàng)目時(shí)間的考慮,往往基礎(chǔ)表與視圖的設(shè)計(jì)是同時(shí)進(jìn)行的。如一些人負(fù)責(zé)基礎(chǔ)表的建立,另一些人則負(fù)責(zé)視圖的設(shè)計(jì)與建立等等。在這個(gè)過(guò)程中,往往基礎(chǔ)表不存在的時(shí)候,就需要建立一些視圖,以加快項(xiàng)目的進(jìn)度。
為了使得基礎(chǔ)表的創(chuàng)建和修改與視圖的創(chuàng)建于修改沒(méi)有必然的聯(lián)系,以便于員工之間工作的同步,提高工作效率,所以,在Oracle數(shù)據(jù)庫(kù)中提出了一個(gè)“強(qiáng)制創(chuàng)建視圖”的概念。也就是說(shuō),正常情況下,如果基本表不存在,則創(chuàng)建視圖就會(huì)失敗。但是,我們可以在創(chuàng)建視圖的過(guò)程中,加入一個(gè)參數(shù),只要?jiǎng)?chuàng)建視圖的語(yǔ)法沒(méi)有錯(cuò)誤的話(huà),即使基礎(chǔ)表不存在,仍然可以建立這張表格。這個(gè)有用的參數(shù)就是force選項(xiàng)。如我們建立視圖時(shí),CREATE FORCE VIEW TEXT,只需要在關(guān)鍵字VIEW之前加入FORCE參數(shù)即可。如此的話(huà),系統(tǒng)在編譯視圖的時(shí)候,就不會(huì)去考慮基礎(chǔ)表是否存在。
不過(guò)這里要注意一點(diǎn),若基礎(chǔ)表不存在的話(huà),則編譯后該視圖的狀態(tài)為“無(wú)效”,不能再這個(gè)視圖的基礎(chǔ)上執(zhí)行一些操作,如查詢(xún)操作等等。當(dāng)下次訪(fǎng)問(wèn)這個(gè)視圖的時(shí)候,則數(shù)據(jù)庫(kù)會(huì)對(duì)這個(gè)視圖進(jìn)行重新編譯,若此時(shí)基礎(chǔ)表存在了,則該基礎(chǔ)表就會(huì)變?yōu)橛行?若基礎(chǔ)表不存在,則這視圖就會(huì)失效。
Oracle數(shù)據(jù)庫(kù)之所以如此設(shè)置,主要是出于在數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中協(xié)同辦公的需要。有了這個(gè)功能之后,則在數(shù)據(jù)庫(kù)建立的過(guò)程中,只要把數(shù)據(jù)庫(kù)基礎(chǔ)表與視圖設(shè)計(jì)好之后,大家就可以分工合作,在數(shù)據(jù)庫(kù)中建立相關(guān)的對(duì)象。不然的話(huà),要等基礎(chǔ)表建立好之后再建立視圖,如此就會(huì)明顯的影響數(shù)據(jù)庫(kù)建立的進(jìn)度。所以,在數(shù)據(jù)庫(kù)建立的過(guò)程中,特別是中大型的數(shù)據(jù)庫(kù)系統(tǒng),這是一個(gè)很實(shí)用的功能。
技巧二:創(chuàng)建視圖的理想步驟。
無(wú)論是簡(jiǎn)單視圖,還是比較復(fù)雜的視圖,筆者覺(jué)得數(shù)據(jù)庫(kù)管理員在創(chuàng)建視圖的時(shí)候,最好能夠遵循一定的步驟。這一方面是因?yàn)橐晥D的更改相對(duì)來(lái)說(shuō),是一件比較麻煩的工作,所以,我們?cè)诮⒁晥D的時(shí)候,要確保視圖的準(zhǔn)確性。另一方面,視圖是基礎(chǔ)表的一個(gè)體現(xiàn)形式,若不按步驟來(lái)做的話(huà),有可能就不能夠達(dá)到我們預(yù)計(jì)的需求。
當(dāng)然這個(gè)步驟沒(méi)有官方的版本,完全是數(shù)據(jù)庫(kù)管理員根據(jù)實(shí)際的經(jīng)驗(yàn)總結(jié)出來(lái)的。這個(gè)步驟不僅對(duì)Oracle數(shù)據(jù)庫(kù)有效,對(duì)于其他數(shù)據(jù)庫(kù)來(lái)說(shuō),也是類(lèi)似的道理。
一般來(lái)說(shuō),視圖創(chuàng)建可以分為五步走,
第一步:先考慮Select語(yǔ)句的編寫(xiě)。
我們知道,視圖其實(shí)就是一個(gè)Select語(yǔ)句的集合。所以,我們建立視圖的第一步,就是考慮這個(gè)Select語(yǔ)句該如何編寫(xiě)。這個(gè)Select語(yǔ)句編寫(xiě)的是否合理、執(zhí)行效率的高低直接影響著這個(gè)視圖的性能。另外,在Select語(yǔ)句中,可能還會(huì)有格式的控制、內(nèi)容的編排等等。如在Select語(yǔ)句中,可以把一些字段合并成一個(gè)字段;也可以把相關(guān)的內(nèi)容進(jìn)行倒置等等。這些功能都是Select語(yǔ)句完成的。所以可以這么說(shuō),Select語(yǔ)句的編寫(xiě)是視圖建立的基礎(chǔ)。
第二步:對(duì)這個(gè)Select語(yǔ)句進(jìn)行測(cè)試。
當(dāng)我們編寫(xiě)好Select語(yǔ)句之后,就需要在數(shù)據(jù)庫(kù)中執(zhí)行這條語(yǔ)句,看其能否查詢(xún)到我們想要的值。在對(duì)Select語(yǔ)句進(jìn)行測(cè)試的時(shí)候,需要注意一個(gè)問(wèn)題,有時(shí)候Select查詢(xún)語(yǔ)句可以查到準(zhǔn)確的數(shù)據(jù),但是在以這條語(yǔ)句建立視圖的時(shí)候,可能就會(huì)通不過(guò)。如在一些表之間的連接查詢(xún)的時(shí)候,如果兩個(gè)表中有個(gè)字段名相同,是可以的。因?yàn)樗麄兂俗侄蚊种,還有表名一起來(lái)定義這個(gè)字段。如A.name與B.name。這是不算重名的。但是,若在建立視圖的時(shí)候,這就會(huì)被認(rèn)為是重復(fù)的列明,需要對(duì)其中的一個(gè)列名進(jìn)行重定義。這一點(diǎn)在數(shù)據(jù)庫(kù)視圖建立的時(shí)候,要特別的注意。
第三步:考慮查詢(xún)結(jié)果的準(zhǔn)確性。
通過(guò)查詢(xún)語(yǔ)句把我們想要的結(jié)果查詢(xún)出來(lái)后,我們就需要看看這個(gè)結(jié)果是否滿(mǎn)足我們的需要。在這個(gè)過(guò)程中,我們主要注意兩點(diǎn)。一是形式字段是否齊全。在一些應(yīng)用系統(tǒng)中,若數(shù)據(jù)庫(kù)的視圖要能夠被前臺(tái)的應(yīng)用程序調(diào)用的話(huà),則必須包含一些形式字段。如筆者以前在設(shè)計(jì)一個(gè)ERP系統(tǒng)的時(shí)候,若前臺(tái)系統(tǒng)要調(diào)用數(shù)據(jù)庫(kù)中的視圖的時(shí)候,必須包含記錄更新時(shí)間、更新者、記錄創(chuàng)建時(shí)間、創(chuàng)建者等相關(guān)信息。若缺乏這些信息的話(huà),則前臺(tái)調(diào)用這張視圖的時(shí)候,就會(huì)出現(xiàn)錯(cuò)誤。故在考慮查詢(xún)結(jié)果準(zhǔn)確性的問(wèn)題的時(shí)候,就要考慮到前臺(tái)應(yīng)用程序的需要,看看這些形式字段是否齊全。二是實(shí)體內(nèi)容的完整性。我們到底需要顯示表中的哪些字段呢,這個(gè)我們?cè)谶@里要確認(rèn)清楚。若顯示內(nèi)容太多的話(huà),則會(huì)影響視圖的執(zhí)行效率,而且也會(huì)降低視圖的安全性作用;但是,若字段內(nèi)容顯示不足的話(huà),則以后要添加字段的話(huà),會(huì)比較麻煩,有一定的工作量。所以在這個(gè)檢驗(yàn)的時(shí)候,需要根據(jù)視圖的實(shí)際功用,確定視圖需要顯示的內(nèi)容。
第四步:視圖的修飾。
有時(shí)候,為了閱讀的方便,我們需要對(duì)查詢(xún)結(jié)果進(jìn)行一些修飾。如現(xiàn)在有兩張表,一張是員工基本信息表,這表中有員工姓名、員工職位編號(hào)等等;另一張表是職位基本信息表,在這表中有職位編號(hào)、職位名稱(chēng)。我們希望在視圖中能夠如下顯示:“職位:?jiǎn)T工名字”,如數(shù)據(jù)庫(kù)工程師:Victor。也就是說(shuō),把兩個(gè)字段合并起來(lái),并且在中間加入一個(gè)冒號(hào)。這些格式性的內(nèi)容都是在查詢(xún)的時(shí)候?qū)崿F(xiàn)的。所以,我們確認(rèn)查詢(xún)的結(jié)果沒(méi)有錯(cuò)誤之后,接下來(lái)就要確認(rèn)格式問(wèn)題。若能夠在視圖中規(guī)范這些格式問(wèn)題,則前臺(tái)的程序設(shè)計(jì)就會(huì)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單。
第五步:建立視圖。
等到上面四步都確認(rèn)無(wú)誤后,我們就要根據(jù)上面的查詢(xún)語(yǔ)句來(lái)建立視圖了。不過(guò)在這一步過(guò)程中,也有一些問(wèn)題需要注意。一是視圖名字的命名規(guī)格。我們除了遵循數(shù)據(jù)庫(kù)的強(qiáng)制命名格式之外,如不能以數(shù)字開(kāi)頭等等,還需要遵循一些軟規(guī)則。如視圖最好能夠以V開(kāi)頭,跟基礎(chǔ)表進(jìn)行隔開(kāi);另外在視圖命名中,能夠根據(jù)應(yīng)用模塊的不同,來(lái)進(jìn)行分類(lèi),并體現(xiàn)在視圖的名字中。這對(duì)于我們后續(xù)視圖的查找都具有非常現(xiàn)實(shí)的意義。二是雖然可以在視圖中直接更新基礎(chǔ)表,不過(guò),為了安全與數(shù)據(jù)統(tǒng)一的考慮,我們這些過(guò)來(lái)人一般都不建議通過(guò)視圖來(lái)直接更新基礎(chǔ)表中的數(shù)據(jù)。雖然數(shù)據(jù)庫(kù)提供了類(lèi)似的功能。若要更改相關(guān)數(shù)據(jù)的話(huà),則直接去更改基礎(chǔ)表的內(nèi)容為好。在建立視圖的時(shí)候,默認(rèn)情況下是不能夠通過(guò)視圖直接更新基礎(chǔ)表。
【Oracle數(shù)據(jù)庫(kù)視圖管理技巧】相關(guān)文章:
Oracle數(shù)據(jù)庫(kù)臨時(shí)表管理技巧06-15
Oracle 數(shù)據(jù)庫(kù)查詢(xún)小技巧10-17
學(xué)習(xí)Oracle數(shù)據(jù)庫(kù)技巧攻略08-16
Oracle重做日志文件管理技巧08-31
Oracle數(shù)據(jù)庫(kù)語(yǔ)句大全10-08
ORACLE數(shù)據(jù)庫(kù)碎片的整理08-18
oracle數(shù)據(jù)庫(kù)基本語(yǔ)句08-21
Oracle數(shù)據(jù)庫(kù)認(rèn)證層次08-29