2013-07-03 70 views
1

我正在創建預訂應用程序並儘可能地規範了數據庫。我的問題是以下幾點,我應該在數據庫中創建視圖,在我對WHERE子句中的組合視圖進行選擇性選擇之前再次組合表,還是在將視圖加入視圖之前過濾表更好?規範化表,SQL聯接和視圖

編輯:包括的例子。

第一種方案首先創建組合視圖,然後在組合視圖執行SELECT(這個視圖可能有數以千計的記錄):

CREATE VIEW appc as 
SELECT * FROM appointment 
LEFT OUTER JOIN chair 
ON appointment.chair_idchair = chair.idchair 

SELECT * FROM appc 
WHERE chair_idchair = 1; 

第二種方案將第一過濾表的左的連接,然後創建基於過濾表的視圖,那麼連接將使用這種更小的觀點提出:

CREATE VIEW appf as 
SELECT * FROM appointment 
WHERE chair_idchair = 1; 

SELECT * FROM appf 
LEFT OUTER JOIN chair 
ON appf.chair_idchair = chair.idchair 
+0

你可以舉一個你想到的兩種不同風格的例子嗎? –

回答

1

它對MySQL沒有什麼不同。 MySQL(與其他一些RDBMS品牌不同)不會在視圖本身中存儲任何內容。想象一個更像宏觀的MySQL視圖。在大多數情況下,查詢視圖與執行您定義爲視圖的查詢完全相同。

查詢視圖時,應用隨後的條件在WHERE子句中與視圖的查詢相結合相當透明的,因爲如果你寫了完整的查詢,並給它一個條件。

例外情況:您可以選擇使用ALGORITHM=TEMPTABLE創建視圖,強制它將視圖的結果存儲在臨時表中,然後應用您在查詢中指定的額外條件。在這種情況下,最好將條件構建到視圖的查詢中,以減少生成的臨時表的大小。

請參閱http://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html瞭解更多詳情。

+0

謝謝Bill,我現在明白了。 – georgelappies

1

一般來說,優化是非常聰明,而且可以通過正確的看構建查詢計劃時的視圖。如果您試圖通過預先選擇某些數據來「幫助」優化程序,那麼您可能會隱藏優化程序的信息,從而使其能夠創建更智能,更優化的計劃。