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