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