我正在閱讀通過SQL Server 2008聖經,我涵蓋的意見部分。但作者真的沒有解釋的目的的意見。什麼是好的用途意見?我應該在我的網站中使用它們,它們有什麼好處?使用SQL視圖的一個很好的理由是什麼?
回答
另一個用途以前的答案似乎沒有提到更容易部署表結構更改。假設您希望淘汰一個包含活躍用戶數據的表(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的直接查詢,但情況並非總是如此。
VIEWS可以用作SELECT/CODE的可重用部分,可以將其包含在要加入的其他選擇/查詢中,並使用各種不同的過濾器,而無需每次都重新創建整個SELECT。
這也將邏輯放在一個單一的位置,這樣你就不必在整個代碼基礎上改變它。
看一看
Choice Between Stored Procedures, Functions, Views, Triggers, Inline SQL
視圖的主要優點在於它 可以像在大多數 情況下,一臺可以使用,但不同的表,它可以 封裝非常複雜的計算 和常用連接。除存儲過程外,它還可以使用db 中的幾乎任何對象。查看 是最有用的,當你總是需要 加入同一組表的說,一個 訂單與訂單明細獲得 彙總計算領域等
(從first tutorial that came up in a Google search複製,但它擁有所有的好處我會手動鍵入自己)
意見有以下好處:
- 安全 - 視圖可以進行ACCE對於用戶而言,底層表格不可直接訪問。這允許DBA僅爲用戶提供所需的數據,同時保護同一表中的其他數據。
- 簡單 - 視圖可以用來隱藏和重用複雜的查詢。
- 列名簡化或澄清 - 可以使用視圖在列名上提供別名,以使它們更易記憶和/或有意義。
- 踏腳石 - 視圖可以在「多級」查詢中提供墊腳石。例如,您可以創建一個查詢視圖,計算每個銷售人員的銷售數量。然後,您可以查詢該視圖,按銷售人員的銷售數量對銷售人員進行分組。
因爲我喜歡你的答案,並沒有看到很多觀點增加另一個,我可以給你的列表建議兩個補充嗎?索引視圖可以提高性能。根據視圖運行更新而不是直接到表可以給予更高的置信度,您不會錯誤地更新該關鍵生產表:) – 2010-04-21 04:11:06
您的列表中還有一點,大多數DBA都希望使用視圖,因爲它們可以調整一個視圖並主要並非總是)使用該視圖的所有查詢都將被調整。 – 2010-04-21 05:58:32
這是我書中99%的答案。 – 2013-10-17 13:34:20
視圖可以讓您將數據從幾個不同的表結合起來,對其進行格式化(結合領域,提供更多有意義的字段名等),因此,它是爲最終用戶更容易。它們是數據庫模型的抽象。它們也可以用來讓用戶訪問表中的數據,而不用直接訪問表本身。
從Wikipedia一些原因:
視圖可以提供優於表優點:
- 視圖可以表示包含在表中的數據的一個子集
- 視圖可以加入並簡化多個表變成單個虛擬表
- 查看可以充當聚合表,其中該數據庫引擎聚集 數據(總和,平均值等),並提出了計算結果作爲數據的一部分
- 視圖可以隱藏數據的複雜性;例如一個視圖可能顯示爲 Sales2000或Sales2001,透明地劃分實際的基礎表
- 視圖佔用很少的空間來存儲;該數據庫只包含 定義的視圖,而不是所有的它呈現
- 根據所使用的SQL引擎的數據副本,視圖可以提供額外的安全性
- 意見,可以限制的曝光程度一個或多個表的外部世界
的常見原因小清單/用途:
使用它們瓚數據的「外觀」(即「看」)格式或 。你可能會一起加入 姓和名)
進行計算或其它查找 數據
非規範化從 幾個表中的數據(提取數據到一個點)
下面是使用視圖來約束實體的一個非常常見的用法。
表:USERS包含所有用戶
查看:ACTIVE_USERS包含所有用戶,但不包括那些誰被暫停,禁止,等待被激活,不符合你可以選擇在未來定義任何標準作爲活動的一部分,要求。這樣就不必刪除USERS表中的任何行,因爲ACTIVE_USERS總是可以隱藏不需要的行。
這樣,您可以在用戶管理頁面中使用該表格,但應用程序的其餘部分可以使用ACTIVE_USERS,因爲它們可能是唯一應該能夠執行進程和訪問/修改數據的用戶。
觀點是邪惡的!如果可能,儘量避免使用它們,並僅用於DVK提到的原因 - 臨時數據遷移。
您應該明白,在具有100個表的數據庫中,很難記住每個表的目的。現在,如果你在這裏添加另外300個視圖,它將變得完全混亂。比'查看愛好者'傾向於使用嵌套視圖,然後使用存儲過程中的嵌套視圖。我personnaly現在與一個數據庫,其中有4倍的視圖嵌套深度! 因此,爲了理解存儲過程的最簡單的邏輯,我必須首先查看所有視圖。
-1意見很好。如果你不恰當地使用它們,它們*會變成邪惡的 - 但對任何事情都是如此。 – NullUserException 2011-09-07 02:57:20
如果使用不當,視圖可能會變得邪惡。那些最常使用它們的人似乎是那些使用它們來抽象事物然後像你說的那樣做的人,調用視圖調用視圖來調用視圖,以便在返回結果之前可能需要實現1000萬個recrod直接調用表的視圖可能非常有用。 – HLGEM 2011-09-10 16:14:55
@HGLEM有沒有限制來自其他視圖的視圖調用的方法? – 2016-06-08 22:32:36
並非總是如此,您無法更新視圖的基礎表。
例如,嘗試
創建視圖theyshallnotpass如SELECT * FROM
,並在有一個討厭的驚喜更新一次...
(MSSQL)
這裏有使用視圖而不是直接使用視圖的一些原因
- Simplicit y - 視圖可以用來隱藏複雜的查詢。
- 安全性 - 查看可以通過在某些選定列上創建視圖來隱藏最終用戶的一些重要信息
- 安全性 - 安全表,通過使用VIEW來更改其結構。
- 冗餘 - 通過使用通用視圖減少每個過程/查詢中的冗餘代碼。
- 計算 - 所有計算都可以在查看查詢中完成一次。
- 有意義的名稱 - 表可能具有名稱,如tbl_org_emp_id,其名稱可以是[員工編號]或一些有意義的名稱。
- 1. 使用Visitor設計模式的一個很好的理由是什麼?
- 2. 什麼是切換到jQuery 1.4的一些很好的理由
- 3. 什麼是一個很好的jQuery timePicker?
- 4. 是不是很好調用視圖內的視圖在sql
- 5. Setter.Value不是一個ContentProperty是否有很好的理由?
- 6. 避免昂貴的__init__是使用__new__的一個很好的理由嗎?
- 7. 關於No-sql的一些很好的教程是什麼?
- 8. 什麼是使用SQL的OUTER JOIN的一些很好的例子?
- 9. 使用cocos2d-iphone啓用2D投影的好理由是什麼?
- 10. 這是一個很好的使用ActionBar?
- 11. 什麼是一些很好的postgresql管理界面?
- 12. 什麼是一個很好的CMS用於Restful API文檔?
- 13. 單個等於一個if。的JavaScript。有什麼好的理由?
- 14. 在MVC環境中使用ORM是否有很好的理由?
- 15. 使用一個很好的SQL查詢而不是PHP代碼
- 16. 爲什麼賦值運算符不是序列點的很好的理由?
- 17. SQL中視圖的用途是什麼?
- 18. 什麼是一個好的mysql視圖編輯器?
- 19. 什麼將是一個很好的部件在QT4的「積分」
- 20. Flyweight模式的一個很好的例子是什麼?
- 21. 什麼是一個很好的典型的網絡超時?
- 22. 什麼是Mediastore對象的一個很好的simpleCursorAdapter實現?
- 23. .NET支持SSL的一個很好的XMPP庫是什麼?
- 24. Java中LTRIM和RTRIM的一個很好的選擇是什麼?
- 25. 什麼是CSS依賴javascript的一個很好的例子?
- 26. 開源Java遊戲的一個很好的例子是什麼?
- 27. 什麼是從MYSQL格式化視圖的sql的好方法
- 28. 使用「視圖」進行分組是不是很好的做法?
- 29. 爲什麼擴展方法類不能嵌套是否有很好的理由?
- 30. 是什麼讓一個很好的選項/設置對話框?
哇..這真是一個很好的理由 – Luke101 2010-04-21 05:45:45
非常好的一點! – David 2010-04-21 13:08:20
我對術語「存儲過程API」和相關的優點/缺點一無所知,並且發現這篇文章有用:http://www.codinghorror.com/blog/2005/05/stored-procedures-vs-ad-hoc-sql .html – 2013-12-13 01:31:05