为什么要在数据库中创建View?

Med*_*Man 257 sql t-sql database sql-server

何时以及为什么有人决定他们需要在他们的数据库中创建一个View?为什么不运行正常的存储过程或选择?

Dav*_*ile 453

视图提供了几个好处.

1.视图可以隐藏复杂性

如果您的查询需要连接多个表,或者具有复杂的逻辑或计算,则可以将所有逻辑编码到视图中,然后从视图中选择,就像您在表中一样.

2.视图可以用作安全机制

视图可以从表中选择某些列和/或行,并在视图上设置权限而不是基础表.这允许仅显示用户需要查看的数据.

3.视图可以简化支持遗留代码

如果您需要重构一个会破坏大量代码的表,您可以使用相同名称的视图替换该表.该视图提供与原始表完全相同的模式,而实际模式已更改.这使得引用该表的遗留代码不会中断,允许您随意更改遗留代码.

这些只是视图如何有用的众多示例中的一部分.

  • 第3项是其他人似乎没有指出的原因 (80认同)
  • 3真的是观点最强大的属性.它是帮助提供*逻辑数据独立性的事实*您可以独立于底层逻辑数据库为DB提供接口这一事实是一个非常强大的概念. (3认同)
  • 我认为第3点比其他任何东西更多的是止损.最后,当您更新遗留代码时,您不仅需要更改视图后面的代码,还需要更改在视图之上构建的所有代码.我的2 (2认同)

Gra*_*row 85

除此之外,它还可用于安全性.如果您有"客户"表,您可能希望让所有销售人员访问名称,地址,邮政编码等字段,但不能访问credit_card_number.您可以创建仅包含他们需要访问的列的视图,然后授予他们对视图的访问权限.

  • 我认为这个问题的其他答案将描述"其他事物".:-) (13认同)
  • @PranavBilurkar 是的,如果您完全控制用户运行的查询。如果用户能够运行自己的查询(通过一些交互式 SQL 程序或编写自己的脚本),他们可以运行“select * from customer”,这使他们可以访问所有内容。如果您授予他们访问视图而不是表的权限,他们**无法**访问不在视图中的字段。 (2认同)

And*_*are 38

视图是查询的封装.变成视图的查询往往很复杂,因此将它们保存为重用视图可能是有利的.

  • 真正的个人选择有多复杂,没有设定的门槛.例如,如果您不想在多个应用程序或应用程序中的不同点复制逻辑,则通常会使用视图.通过使其成为视图,您可以隐藏该逻辑并且能够轻松地共享它. (4认同)
  • @MedicineMan - 存储过程返回结果集,而视图表示允许您在其他查询中用作表的虚拟表. (2认同)

cms*_*sjr 28

我通常会创建视图以对通常用于报告目的的数据进行反规范化和/或聚合.

编辑

通过详细说明,如果我有一个数据库,其中一些实体是人,公司,角色,所有者类型,订单,订单详细信息,地址和电话,其中人员表存储员工和联系人以及地址和电话表为个人和公司存储电话号码,开发团队的任务是生成报告(或使非开发人员可以访问报告数据),例如员工销售,客户销售或按地区销售,按月销售,国家等的客户我会创建一组视图,这些视图对数据库实体之间的关系进行去规范化,以便可以获得真实世界实体的更集成的视图(没有双关语).一些好处可能包括:

  1. 减少编写查询时的冗余
  2. 建立相关实体的标准
  3. 提供评估和最大化复杂计算和连接性能的机会(例如,在MSSQL中对Schemabound视图建立索引)
  4. 使团队成员和非开发人员更容易访问数据.


HLG*_*GEM 11

有几个原因:如果你有复杂的连接,有时最好有一个视图,这样任何访问都会使连接正确,开发人员不必记住他们可能需要的所有表.通常,这可能适用于财务应用程序,其中所有财务报告都基于同一组数据非常重要.

如果您有用户要限制他们可以看到的记录,您可以使用视图,只允许他们访问视图而不是基础表,然后查询视图

Crystal报表似乎更喜欢将视图用于存储过程,因此执行大量报表编写的人倾向于使用大量视图

在重构数据库时,视图也非常有用.您通常可以隐藏更改,以便旧代码不会通过创建视图来查看它.阅读重构数据库,看看它是如何工作的,因为它是一种非常强大的重构方法.


dev*_*xer 7

视图存储过程的一个主要优点是,您可以像使用表一样使用视图.即,视图可以直接在FROM查询的子句中引用.例如,SELECT * FROM dbo.name_of_view.

几乎所有其他方式,存储过程都更强大.您可以传递参数,包括out参数,让你有效地在一次返回多个值,你可以做SELECT,INSERT,UPDATE,和DELETE操作,等等,等等

如果您希望View能够在FROM子句中进行查询,但您也希望能够传入参数,那么还有一种方法可以执行此操作.它被称为表值函数.

这是一篇关于这个主题的非常有用的文章:

http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html

编辑:顺便说一句,这种问题提出了一个问题,一个视图对表值函数有什么优势?我没有一个非常好的答案,但我会注意到创建视图的T-SQL语法比表值函数更简单,数据库的用户可能更熟悉视图.


Jos*_*eph 6

它可以作为你的ORM和你的桌子之间的一个好"中间人".

例:

我们有一个Person表,我们需要更改它上面的结构,因此SomeColumn列将被移动到另一个表,并且将具有一对多的关系.

但是,对于Person而言,大多数系统仍然使用SomeColumn作为单一事物,而不是很多东西.我们使用一个视图将所有SomeColumns放在一起并将其放在视图中,这很好地完成了.

这是因为数据层已更改,但业务需求没有根本改变,因此业务对象不需要更改.如果业务对象必须改变,我认为这不是一个可行的解决方案,但是视图肯定是一个很好的中间点.


KM.*_*KM. 5

这是两个常见原因:

您可以将其用于安全性。在主表上不授予任何权限,并创建限制列或行访问的视图,并向用户授予权限以查看该视图。

您可以方便地使用它。将视图中一直使用的一些表连接在一起。这可以使查询一致且容易。


小智 5

专注于特定数据 视图允许用户专注于他们感兴趣的特定数据以及他们负责的特定任务。不需要的数据可以被排除在视图之外。这也增加了数据的安全性,因为用户只能看到视图中定义的数据,而看不到基础表中的数据。有关出于安全目的使用视图的更多信息,请参阅将视图用作安全机制。

简化数据操作 视图可以简化用户操作数据的方式。您可以将常用的连接、投影、UNION 查询和 SELECT 查询定义为视图,这样用户就不必在每次对该数据执行附加操作时指定所有条件和限定。例如,用于报告目的并执行子查询、外部联接和聚合以从一组表中检索数据的复杂查询可以创建为视图。视图简化了对数据的访问,因为不必在每次生成报告时编写或提交底层查询;而是查询视图。有关操作数据的更多信息。

您还可以创建在逻辑上作为参数化视图或在 WHERE 子句搜索条件中具有参数的视图的内联用户定义函数。有关更多信息,请参阅内联用户定义函数。

自定义数据 视图允许不同的用户以不同的方式查看数据,即使他们同时使用相同的数据。当具有许多不同兴趣和技能水平的用户共享同一个数据库时,这尤其有利。例如,可以创建一个视图,该视图仅检索与客户经理打交道的客户的数据。该视图可以根据使用该视图的客户经理的登录 ID 来确定要检索哪些数据。

导出和导入数据 视图可用于将数据导出到其他应用程序。例如,您可能希望使用 pubs 数据库中的商店和销售表来使用 Microsoft® Excel 分析销售数据。为此,您可以创建基于商店和销售表的视图。然后可以使用 bcp 实用程序导出视图定义的数据。还可以使用 bcp 实用程序或 BULK INSERT 语句将数据从数据文件导入某些视图,前提是可以使用 INSERT 语句将行插入到视图中。有关将数据复制到视图的限制的更多信息,请参阅 INSERT。有关使用 bcp 实用程序和 BULK INSERT 语句将数据复制到视图和从视图复制数据的详细信息,请参阅复制到视图或从视图复制。

合并分区数据 Transact-SQL UNION 集合运算符可在视图中使用,以将来自不同表的两个或多个查询的结果合并为一个结果集。这在用户看来是一个称为分区视图的表。例如,如果一个表包含华盛顿的销售数据,而另一个表包含加利福尼亚的销售数据,则可以从这些表的 UNION 创建一个视图。该视图表示两个地区的销售数据。要使用分区视图,您需要创建几个相同的表,指定一个约束来确定可以添加到每个表的数据范围。然后使用这些基表创建视图。查询视图时,SQL Server 自动确定哪些表受查询影响并仅引用这些表。例如,如果查询指定仅需要华盛顿州的销售数据,则 SQL Server 仅读取包含华盛顿州销售数据的表;没有访问其他表。

分区视图可以基于来自多个异构源的数据,例如远程服务器,而不仅仅是同一数据库中的表。例如,要合并来自不同远程服务器的数据,每个服务器都存储组织不同区域的数据,您可以创建从每个数据源检索数据的分布式查询,然后基于这些分布式查询创建视图。任何查询仅从包含查询请求的数据的远程服务器上的表中读取数据;视图中分布式查询引用的其他服务器不被访问。

当您跨多个表或多个服务器对数据进行分区时,仅访问一小部分数据的查询可以运行得更快,因为要扫描的数据较少。如果表位于不同的服务器上,或者在多处理器的计算机上,也可以并行扫描查询中涉及的每个表,从而提高查询性能。此外,维护任务(例如重建索引或备份表)可以更快地执行。通过使用分区视图,数据仍然显示为单个表,并且可以这样查询,而无需手动引用正确的基础表。

如果满足以下任一条件,则分区视图是可更新的: 在具有支持 INSERT、UPDATE 和 DELETE 语句的逻辑的视图上定义了 INSTEAD OF 触发器。

视图和 INSERT、UPDATE 和 DELETE 语句都遵循为可更新分区视图定义的规则。有关更多信息,请参阅创建分区视图。

https://technet.microsoft.com/en-us/library/aa214282(v=sql.80).aspx#sql:join