我讀到分貝的觀點是這樣的:視圖如何減少代碼重複?
視圖是令人難以置信的強大和脫穎而出 在其他所有的很好的理由原因之一 有用。 他們減少代碼重複。即在大多數情況下, 的底線。如果 查詢將在三個或更多 地方使用,那麼視圖將大大簡化 的更改,如果模式或 查詢參數發生變化。我曾經爲 編輯22個存儲過程來改變 的一些查詢邏輯。如果原始的 體系結構已經使用了視圖,那麼 我只會有三個變化。
任何人都可以向我解釋它是如何工作的,也許給我一些例子?
此致敬禮!
我讀到分貝的觀點是這樣的:視圖如何減少代碼重複?
視圖是令人難以置信的強大和脫穎而出 在其他所有的很好的理由原因之一 有用。 他們減少代碼重複。即在大多數情況下, 的底線。如果 查詢將在三個或更多 地方使用,那麼視圖將大大簡化 的更改,如果模式或 查詢參數發生變化。我曾經爲 編輯22個存儲過程來改變 的一些查詢邏輯。如果原始的 體系結構已經使用了視圖,那麼 我只會有三個變化。
任何人都可以向我解釋它是如何工作的,也許給我一些例子?
此致敬禮!
http://msdn.microsoft.com/en-us/library/aa258253%28SQL.80%29.aspx
這裏是介紹了創建視圖的語法的鏈接。視圖的其他好處之一是它們在服務器上而不是在客戶端上執行。這意味着它們運行得比本地查詢要快得多。
視圖允許基本表結構的改變,而不會影響您的應用程序是如何看待這些數據。由於視圖通常代表跨越一個或多個表格(例如,從「航班」,「票價」和「航空公司」表格構建的「可用航班」視圖)的更高級別域概念,因此他們可以在統一辦法。
由於如何將原始數據庫表到視圖的邏輯在數據庫中被捕獲時,其結構的複雜性是不太可能達到您的應用程序。這意味着,如果你在很多地方使用Available Flights
,然後講講Flights
表更改,只有明確依賴Flights
件需要改變,約Available Flights
沒有什麼。
出於這個原因,它被認爲是一個好主意,使用視圖來降低複雜性和孤立打破架構更改回數據庫,它不會影響到相關的應用程序儘可能多的風險。
+1表示「允許底層表結構發生變化,而不會影響應用程序如何看待數據」 – 2010-04-13 15:07:04
只需要注意,如果您開始編寫所有查詢,並將多個視圖連接在一起,則性能可能會變差。 – 2010-04-13 17:07:30
視圖提供物理數據存儲與應用程序數據視圖之間的抽象級別這一事實很重要,但僅部分涵蓋視圖減少重複的原因。 – 2010-04-13 19:14:26
視圖就像一個預先確定的查詢。您只需編寫一個SELECT
查詢,該查詢返回您的數據庫表所需的列/數據 - 任何記錄返回的查詢都可以用作視圖的基礎。然後創建視圖,將您編寫的SQL查詢作爲視圖的定義。
當您從視圖中執行SELECT
時,數據庫引擎會執行您的查詢並返回結果,就像您已完成SELECT column1, column2 FROM table
一樣。
有關意見的最好的部分是,你並不侷限於單個表。所以想象一下,你有三個表在多對多的關係 - user <-> user_to_role <-> role
。
你可以寫一個查詢來獲取用戶和他們相關的角色:
選擇 u.user_name, 河role_name FROM user u INNER JOIN user_to_role ur ON ur.user_id = u.id INNER JOIN role r ON r.id = ur.role_id;
現在創建使用上面的SQL定義(稱爲user_role_view
)的圖,然後你可以執行:在您的應用程序
SELECT * FROM user_role_view
並獲得包含user_name
和role_name
列的結果集,所有的鏈接正確:-)
正確使用時,視圖可以非常強大,並且非常有助於降低應用程序層中SQL查詢的複雜性。
簡而言之,視圖是由某個查詢定義的虛擬表(也就是說,您可以查詢它就像是表)。他們減少代碼重複的原因可以這樣解釋:
假設你有一個帶有列C1和C2的表T,然後,你在你的應用程序中有幾個地方可以查詢T:SELECT C1 FROM T WHERE C2 = 'cow'
。有一天,您意識到cow
不再是您查詢所需的值,並且您想要更改爲goat
。要執行此更改,您需要找到每個SELECT
語句並用goat
替換cow
。
假若你是使用綁定到一個SELECT C1 FROM T WHERE C2 = 'cow'
查看V
,您的發言看起來更像SELECT * FROM V
- 那麼你可以改變V
而不是改變個別報表,從而使一個變化,而不是幾個。
MySQL reference提供了一些關於如何使用視圖的很好的例子。
注意:下面的語句只是一個例子,實際上並不會因SELECT *而起作用。它只是顯示可能的代碼減少。
採取以下三個類似的查詢。現在
SELECT
*
FROM
Table1
INNER JOIN
Table2 ON Table2.Id = Table1.Id
INNER JOIN
Table3 ON Table3.Id = Table2.Id
INNER JOIN
TableX ON TableX.Id = Table3.Id
SELECT
*
FROM
Table1
INNER JOIN
Table2 ON Table2.Id = Table1.Id
INNER JOIN
Table3 ON Table3.Id = Table2.Id
INNER JOIN
TableY ON TableY.Id = Table3.Id
SELECT
*
FROM
Table1
INNER JOIN
Table2 ON Table2.Id = Table1.Id
INNER JOIN
Table3 ON Table3.Id = Table2.Id
INNER JOIN
TableZ ON TableZ.Id = Table3.Id
,如果我們要創造如
CREATE VIEW View123 AS
SELECT
*
FROM
Table1
INNER JOIN
Table2 ON Table2.Id = Table1.Id
INNER JOIN
Table3 ON Table3.Id = Table2.Id
的三個查詢現在可以寫成
SELECT
*
FROM
View123
INNER JOIN
TableX ON TableX.Id = View123.Id
SELECT
*
FROM
View123
INNER JOIN
TableY ON TableY.Id = View123.Id
SELECT
*
FROM
View123
INNER JOIN
TableZ ON TableZ.Id = View123.Id
視圖視圖是宏。沒有更多,沒有更多。
如果您開始對視圖進行JOIN視圖,那麼這些視圖可能會展開/展開到服務器查殺。
他們有使用,如隱藏表架構更改和索引/物化視圖,但它們不是銀色的子彈。這是養眼「封裝」你的代碼,而是用審慎
次數減少代碼的重複,因爲面向數據的邏輯大量可以在視圖的定義時被封裝。由此產生的操作數據可以被應用程序訪問,而不需要包括邏輯的應用程序,甚至不需要知道它。
例如,假設一個視圖OrderDetailsEx:
CREATE VIEW OrderDetailsEx
(OrderID, OrderDate, ProductID, Description,
UnitPrice, Quantity, ExtendedPrice, Tax, TotalPrice) AS
SELECT O.OrderID, O.OrderDate, D.ProductID, P.Description,
D.UnitPrice, D.Quantity, (D.Quantity * D.UnitPrice),
C.TaxRate, (C.TaxRate * D.Quantity * D.UnitPrice)
FROM Orders O
INNER JOIN OrderDetails D ON O.OrderID = D.OrderID
INNER JOIN Products P ON P.ProductID = D.ProductID
INNER JOIN Customers C ON C.CustID = O.CustID
現在,應用程序是免費的,只要是需要的訂單信息,從該表中選擇的記錄。不需要將線路擴展,稅收計算和連接邏輯編碼到應用程序中。
如果僅將此信息用於一個位置,則表示您已將邏輯從應用程序重新定位到數據庫。但是,這些信息的使用很可能在整個應用程序中分散並重復 - 在購物模塊中,打印發票時,打印報表時,檢查帳戶時等等。如果這是真的,那麼你已經消除了所有重複的邏輯,並將其粘在數據庫中的單個聲明性語句中。
查詢也在服務器上執行。封裝爲視圖的相同查詢將花費相同的時間量運行(省略高級情況,如物化查詢)。 – 2010-04-13 19:23:48
-1,對不起,這個答案是不正確的,因爲Larry Lustig已經指出的原因。 – 2010-04-13 21:02:16
我想我應該澄清。當我在MS Access中進行開發時,視圖比我在Access中生成的查詢運行得更快。 – DoubleJ92 2010-04-14 15:57:44