何时以及为什么有人决定他们需要在他们的数据库中创建一个View?为什么不运行普通的存储过程或选择?
答案 0 :(得分:441)
视图提供了几个好处。
<强> 1。视图可以隐藏复杂性
如果您的查询需要连接多个表,或者具有复杂的逻辑或计算,您可以将所有逻辑编码到视图中,然后从视图中选择,就像您在表中一样。
<强> 2。视图可用作安全机制
视图可以从表中选择某些列和/或行,并在视图上设置权限而不是基础表。这样只允许显示用户需要查看的数据。
第3。视图可以简化支持遗留代码
如果您需要重构会破坏大量代码的表,则可以使用相同名称的视图替换该表。该视图提供与原始表完全相同的模式,而实际模式已更改。这使得引用该表的遗留代码不会中断,允许您随意更改遗留代码。
这些只是视图如何有用的众多示例中的一部分。
答案 1 :(得分:84)
除此之外,它还可用于安全性。如果您有“客户”表,您可能希望让所有销售人员访问名称,地址,邮政编码等字段,但不能访问credit_card_number。您可以创建仅包含他们需要访问的列的视图,然后授予他们对视图的访问权限。
答案 2 :(得分:38)
视图是查询的封装。转换为视图的查询往往很复杂,因此将它们保存为重用视图可能是有利的。
答案 3 :(得分:27)
我通常创建视图以对通常用于报告目的的数据进行反规范化和/或聚合。
修改强>
通过详细说明,如果我有一个数据库,其中一些实体是人,公司,角色,所有者类型,订单,订单详细信息,地址和电话,其中人员表存储了员工和联系人以及地址和电话表存储了个人和公司的电话号码,开发团队的任务是生成报告(或使非开发人员可以访问报告数据),例如员工销售,客户销售或区域销售,按月销售,按州销售等等我会创建一组视图,这些视图会对数据库实体之间的关系进行去规范化,以便可以获得更真实世界实体的更加集成的视图(没有双关语)。一些好处可能包括:
答案 4 :(得分:10)
有几个原因: 如果你有复杂的连接,有时最好有一个视图,这样任何访问都将始终具有正确的连接,开发人员不必记住他们可能需要的所有表。通常情况下,这可能适用于财务应用程序,其中所有财务报告都基于同一组数据非常重要。
如果您想要限制他们可以看到的记录的用户,您可以使用视图,只允许他们访问视图而不是基础表,然后查询视图
Crystal报表似乎更喜欢使用存储过程的视图,因此执行大量报表编写的人倾向于使用大量视图
在重构数据库时,视图也非常有用。您通常可以隐藏更改,以便旧代码不会通过创建视图来查看它。阅读重构数据库,看看它是如何工作的,因为它是一种非常强大的重构方法。
答案 5 :(得分:7)
存储过程视图的一个主要优点是,您可以像使用表一样使用视图。即,视图可以直接在查询的FROM
子句中引用。例如,SELECT * FROM dbo.name_of_view
。
几乎所有其他方式,存储过程都更强大。您可以传入参数,包括允许您有效返回多个值的out
参数,您可以执行SELECT
,INSERT
,UPDATE
和{{1}操作等等。
如果您希望View能够在DELETE
子句中进行查询,但您也希望能够传入参数,那么也有办法。它被称为表值函数。
这是一篇关于这个主题的非常有用的文章:
编辑:顺便说一下,这种问题提出了一个问题,一个视图对表值函数有什么优势?我没有一个非常好的答案,但我会注意到创建视图的T-SQL语法比表值函数更简单,数据库的用户可能更熟悉视图。
答案 6 :(得分:6)
它可以在你的ORM和你的桌子之间充当一个好的“中间人”。
示例:
我们有一个Person表,我们需要更改它上面的结构,因此SomeColumn列将被移动到另一个表,并且将具有一对多的关系。
然而,关于Person的大多数系统仍然使用SomeColumn作为单一事物,而不是很多东西。我们使用一个视图将所有的SomeColumns放在一起并将它放在视图中,这很好用。
这很有效,因为数据层已经更改,但业务需求没有根本改变,因此业务对象不需要更改。如果业务对象不得不改变,我认为这不是一个可行的解决方案,但是观点肯定是一个很好的中间点。
答案 7 :(得分:5)
以下是两个常见原因:
您可以将其用于安全性。不授予主表的权限,并创建限制列或行访问权限的视图,并授予用户查看视图的权限。
您可以使用它来方便使用。将您在视图中一直使用的一些表连接在一起。这可以使查询更加一致和简单。
答案 8 :(得分:3)
这样做的原因不止一个。有时可以简化常见的连接查询,因为可以只查询表名而不是执行所有连接。
另一个原因是将数据限制为不同的用户。例如:
表1:Colums - USER_ID; USERNAME; SSN
管理员用户可以拥有实际表的权限,但是您不希望有权访问SSN的用户,您可以创建视图
CREATE VIEW USERNAMES AS SELECT user_id, username FROM Table1;
然后给他们私人访问视图而不是表格。
答案 9 :(得分:2)
以下是如何使用View以及权限来限制用户可以在表中更新的列。
/* This creates the view, limiting user to only 2 columns from MyTestTable */
CREATE VIEW dbo.myTESTview
WITH SCHEMABINDING AS
SELECT ID, Quantity FROM dbo.MyTestTable;
/* This uses the view to execute an update on the table MyTestTable */
UPDATE dbo.myTESTview
SET Quantity = 7
WHERE ID = 1
答案 10 :(得分:2)
在对遗留数据库进行报告时,视图可能是天赐之物。特别是,您可以使用敏感的表名而不是神秘的5个字母名称(其中2个是共同的前缀!),或者是当时我确定有意义的缩写的列名。
答案 11 :(得分:2)
通常我会使用视图来简化生活,从存储在多个表中的某个实体获取扩展细节(消除代码中的大量连接以增强可读性),有时可以在多个数据库上共享数据,甚至可以使插入更容易读取。
答案 12 :(得分:1)
这不能完全回答你的问题,但我认为值得一提的是物化视图。我的经验主要是Oracle,但据说SQL-Server非常相似。
我们在架构中使用类似的东西来解决XML性能问题。我们的系统设计有大量存储为XML的数据,应用程序可能需要查询其中的特定值。处理大量XMLType并在大量行上运行XPath会对性能产生很大影响,因此我们使用一种物化视图形式,在基表更改时随时将所需的XML节点提取到关系表中。这有效地在某个时间点提供查询的物理快照,而不是按需运行查询的标准视图。
答案 13 :(得分:1)
我正在创建xxx,它映射主表(如Products表)和引用表(如ProductType或ProductDescriptionByLanguage)之间的所有关系。这将创建一个视图,允许我检索产品及其所有详细信息,从其外键转换为其描述。 然后我可以使用ORM创建对象以轻松构建网格,组合框等。
答案 14 :(得分:1)
我的生产数据库中只有10个左右的视图。我使用了几个我一直使用的列。我使用的一个集合来自7个表,其中一些具有外连接而不是重写,我不得不在select中调用该视图并进行一个或两个连接。对我而言,这只是节省时间。
答案 15 :(得分:1)
关于视图的一个奇怪的事情是它们被Microsoft Access视为表:当您使用ODBC将Microsoft Access前端附加到SQL数据库时,您会在可用表列表中看到表和视图。因此,如果您在MS Access中准备复杂的报告,您可以让SQL服务器进行加入和查询,并大大简化您的生活。同样在MS Excel中准备查询。
答案 16 :(得分:1)
我更多地将存储过程视为可以针对我的数据调用的方法,而对于我来说,视图提供了一种机制来创建基础数据的合成版本,可以根据该数据创建查询或存储过程。当简化或聚合有意义时,我将创建一个视图。当我想提供非常具体的服务时,我会写一个存储过程。
答案 17 :(得分:1)
当我想要查看表格的快照和/或查看时(以只读方式)
答案 18 :(得分:1)
视图还将非常复杂的配置和表分解为易于查询的可管理块。在我们的数据库中,我们的整个表管理系统从一个大表中分解为视图。
答案 19 :(得分:1)
当我只运行查询时,我喜欢使用存储过程的视图。视图还可以简化安全性,可以用于简化多个表的插入/更新,并可用于快照/实现数据(运行长时间运行的查询,并保持结果缓存)。
我已经将物化视图用于运行渴望的查询,这些查询不需要实时保持准确。
答案 20 :(得分:0)
将其视为重构数据库架构。
答案 21 :(得分:0)
我认为第一个。隐藏查询的复杂性。它非常适合于视图。当我们规范化数据库表时如何增加。当表数量增加时,如果获取数据非常困难。最好的处理方法是跟随视图。如果我错了,请纠正我。
答案 22 :(得分:0)
我们创建视图来限制或限制访问表中的所有行/列。如果所有者希望只需要共享特定或有限的行/列,那么他将创建一个包含这些列的视图。
答案 23 :(得分:0)
出于安全性考虑::仅通过一小组视图授予每个用户访问数据库的权限,这些视图包含用户或用户组有权查看的特定数据,从而限制了用户对其他数据的访问
查询和结构的简单性:一个视图可以从多个表中提取数据并显示一个表,从而简化了信息并将多表查询转换为视图的单表查询,向用户显示数据库结构的特定视图,将数据库显示为一组特定于特定用户或用户组的虚拟表。
用于创建一致的数据库结构:即使基础源表已更改,视图也呈现一致,不变的数据库结构图像。