2010-04-21 33 views

回答

57

另一個用途以前的答案似乎沒有提到更容易部署表結構更改。假設您希望淘汰一個包含活躍用戶數據的表(T_OLD),而是使用一個具有類似數據的新表(名爲T_NEW),而另一個數據庫爲活動用戶和非活動用戶提供數據,並且有一個額外的列「活性」。

如果你的系統(S)具有極大數的查詢做SELECT whatever FROM T_OLD WHERE whatever,你有轉出兩種選擇:

1)冷土耳其 - 更改數據庫,並在同一時間,變更,測試和釋放包含所述查詢的許多代碼段。很難做(甚至協調),非常危險。壞。

2)漸進 - 通過創建T_NEW,滴T_OLD和而不是創建VIEW稱爲T_OLD模仿T_OLD表100%(例如視圖查詢是SELECT all_fields_except_active FROM T_NEW WHERE active=1)改變DB。

這樣可以避免釋放當前從T_OLD中選擇的任何代碼,並且執行更改以將代碼從T_OLD遷移到T_NEW。

這是一個簡單的例子,其他人涉及更多。

P.S.另一方面,你可能應該有一個存儲過程API,而不是來自T_OLD的直接查詢,但情況並非總是如此。

+0

哇..這真是一個很好的理由 – Luke101 2010-04-21 05:45:45

+0

非常好的一點! – David 2010-04-21 13:08:20

+2

我對術語「存儲過程API」和相關的優點/缺點一無所知,並且發現這篇文章有用:http://www.codinghorror.com/blog/2005/05/stored-procedures-vs-ad-hoc-sql .html – 2013-12-13 01:31:05

13

VIEWS可以用作SELECT/CODE的可重用部分,可以將其包含在要加入的其他選擇/查詢中,並使用各種不同的過濾器,而無需每次都重新創建整個SELECT。

這也將邏輯放在一個單一的位置,這樣你就不必在整個代碼基礎上改變它。

看一看

Choice Between Stored Procedures, Functions, Views, Triggers, Inline SQL

視圖的主要優點在於它 可以像在大多數 情況下,一臺可以使用,但不同的表,它可以 封裝非常複雜的計算 和常用連接。除存儲過程外,它還可以使用db 中的幾乎任何對象。查看 是最有用的,當你總是需要 加入同一組表的說,一個 訂單與訂單明細獲得 彙總計算領域等

+0

+1的一個很好的答案 – David 2010-04-21 04:00:27

+6

必須非常小心這樣做。如果您使用調用其他視圖的視圖,則可能會造成巨大的性能混亂。 – HLGEM 2011-09-10 16:10:32

34

(從first tutorial that came up in a Google search複製,但它擁有所有的好處我會手動鍵入自己)

意見有以下好處:

  • 安全 - 視圖可以進行ACCE對於用戶而言,底層表格不可直接訪問。這允許DBA僅爲用戶提供所需的數據,同時保護同一表中的其他數據。
  • 簡單 - 視圖可以用來隱藏和重用複雜的查詢。
  • 列名簡化或澄清 - 可以使用視圖在列名上提供別名,以使它們更易記憶和/或有意義。
  • 踏腳石 - 視圖可以在「多級」查詢中提供墊腳石。例如,您可以創建一個查詢視圖,計算每個銷售人員的銷售數量。然後,您可以查詢該視圖,按銷售人員的銷售數量對銷售人員進行分組。
+0

因爲我喜歡你的答案,並沒有看到很多觀點增加另一個,我可以給你的列表建議兩個補充嗎?索引視圖可以提高性能。根據視圖運行更新而不是直接到表可以給予更高的置信度,您不會錯誤地更新該關鍵生產表:) – 2010-04-21 04:11:06

+0

您的列表中還有一點,大多數DBA都希望使用視圖,因爲它們可以調整一個視圖並主要並非總是)使用該視圖的所有查詢都將被調整。 – 2010-04-21 05:58:32

+0

這是我書中99%的答案。 – 2013-10-17 13:34:20

2

視圖可以讓您將數據從幾個不同的表結合起來,對其進行格式化(結合領域,提供更多有意義的字段名等),因此,它是爲最終用戶更容易。它們是數據庫模型的抽象。它們也可以用來讓用戶訪問表中的數據,而不用直接訪問表本身。

12

Wikipedia一些原因:

視圖可以提供優於表優點:

  1. 視圖可以表示包含在表中的數據的一個子集
  2. 視圖可以加入並簡化多個表變成單個虛擬表
  3. 查看可以充當聚合表,其中該數據庫引擎聚集 數據(總和,平均值等),並提出了計算結果作爲數據的一部分
  4. 視圖可以隱藏數據的複雜性;例如一個視圖可能顯示爲 Sales2000或Sales2001,透明地劃分實際的基礎表
  5. 視圖佔用很少的空間來存儲;該數據庫只包含 定義的視圖,而不是所有的它呈現
  6. 根據所使用的SQL引擎的數據副本,視圖可以提供額外的安全性
  7. 意見,可以限制的曝光程度一個或多個表的外部世界
1

的常見原因小清單/用途:

  • 使用它們瓚數據的「外觀」(即「看」)格式或 。你可能會一起加入 姓和名)

    進行計算或其它查找 數據

    非規範化從 幾個表中的數據(提取數據到一個點)

3

下面是使用視圖來約束實體的一個非常常見的用法。

表:USERS包含所有用戶

查看:ACTIVE_USERS包含所有用戶,但不包括那些誰被暫停,禁止,等待被激活,不符合你可以選擇在未來定義任何標準作爲活動的一部分,要求。這樣就不必刪除USERS表中的任何行,因爲ACTIVE_USERS總是可以隱藏不需要的行。

這樣,您可以在用戶管理頁面中使用該表格,但應用程序的其餘部分可以使用ACTIVE_USERS,因爲它們可能是唯一應該能夠執行進程和訪問/修改數據的用戶。

7

視圖是一個抽象層,它執行任何良好的抽象層所做的事情,包括封裝數據庫模式並保護您免受更改內部實現細節的影響。

這是一個界面。

+0

好的角度。 – David 2010-04-21 13:09:07

+0

只要您不將堆疊視圖進一步抽象。 – HLGEM 2011-09-10 16:10:58

+0

我想我已經有效地否定了關係數據庫中的任何一種多級抽象。而且我也不會從存儲過程調用存儲過程。 :) – dkretz 2011-09-10 19:35:30

-1

觀點是邪惡的!如果可能,儘量避免使用它們,並僅用於DVK提到的原因 - 臨時數據遷移。

您應該明白,在具有100個表的數據庫中,很難記住每個表的目的。現在,如果你在這裏添加另外300個視圖,它將變得完全混亂。比'查看愛好者'傾向於使用嵌套視圖,然後使用存儲過程中的嵌套視圖。我personnaly現在與一個數據庫,其中有4倍的視圖嵌套深度! 因此,爲了理解存儲過程的最簡單的邏輯,我必須首先查看所有視圖。

+6

-1意見很好。如果你不恰當地使用它們,它們*會變成邪惡的 - 但對任何事情都是如此。 – NullUserException 2011-09-07 02:57:20

+1

如果使用不當,視圖可能會變得邪惡。那些最常使用它們的人似乎是那些使用它們來抽象事物然後像你說的那樣做的人,調用視圖調用視圖來調用視圖,以便在返回結果之前可能需要實現1000萬個recrod直接調用表的視圖可能非常有用。 – HLGEM 2011-09-10 16:14:55

+0

@HGLEM有沒有限制來自其他視圖的視圖調用的方法? – 2016-06-08 22:32:36

0

並非總是如此,您無法更新視圖的基礎表。

例如,嘗試

創建視圖theyshallnotpass如SELECT * FROM

,並在有一個討厭的驚喜更新一次...

(MSSQL)

1

這裏有使用視圖而不是直接使用視圖的一些原因

  • Simplicit y - 視圖可以用來隱藏複雜的查詢。
  • 安全性 - 查看可以通過在某些選定列上創建視圖來隱藏最終用戶的一些重要信息
  • 安全性 - 安全表,通過使用VIEW來更改其結構。
  • 冗餘 - 通過使用通用視圖減少每個過程/查詢中的冗餘代碼。
  • 計算 - 所有計算都可以在查看查詢中完成一次。
  • 有意義的名稱 - 表可能具有名稱,如tbl_org_emp_id,其名稱可以是[員工編號]或一些有意義的名稱。

imexploring.com

相關問題