2009-08-14 47 views
228

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

+0

检查我的【答案】(https://stackoverflow.com/a/47203703/5320562)到类似的问题,希望它帮助! – 2017-12-05 15:05:17

回答

398

一个视图提供了几个好处。

1次可以隐藏复杂

如果您有需要连接几个表,或有复杂的逻辑或计算的查询,您可以编写所有的逻辑到视图,然后从视图中选择刚就像你会坐桌子一样。

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

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

3视图可以简化支持传统的代码

如果您需要重构这会破坏大量的代码表,你可以用相同名称的视图替换表。该视图提供了与原始表完全相同的模式,而实际模式已更改。这可以保持引用表的遗留代码不中断,让您在闲暇时更改遗留代码。

这些都只是一些意见怎么可能是有用的例子很多。

+72

项目3是其他人似乎还没有指出的原因 – MedicineMan 2009-08-14 15:55:47

+2

我认为第3点比其他任何项目更多的是停止差距。最后,当你开始更新遗留代码时,你不仅需要更改视图背后的代码,而且还需要修改视图顶部构建的所有代码。我的2cents – super9 2009-09-04 10:06:11

+1

3真的是意见最强大的属性。这就是帮助提供*逻辑数据独立性的原因*您可以提供独立于底层逻辑数据库的数据库接口这一事实是一个非常强大的概念。 – Falaina 2009-10-06 23:25:23

1

当我想看的表(多个)的一个快照,和/或视图(在只读方式)

+1

你是什么意思的'表快照'?何时或为什么要这样做? – MedicineMan 2009-08-14 15:29:10

+0

有很多场景;假设你想在一个表上运行一个复杂的查询/存储过程而不影响和加下划线表。您创建一个视图(只读表示) – vehomzzz 2009-08-14 15:30:42

+0

您通常还会在报告环境中听到意见... – vehomzzz 2009-08-14 15:31:16

37

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

+0

所以你想创建一个视图,当你有一个复杂的查询?查询的复杂程度如何,阈值是多少?从观点来看你有什么收获? – MedicineMan 2009-08-14 15:30:01

+4

真正的个人选择有多复杂,没有设定的门槛。例如,如果您不想复制多个应用程序中的逻辑或应用程序中的不同点,则通常会使用视图。通过使它成为一个视图,您可以隐藏该逻辑并可以轻松共享。 – 2009-08-14 15:32:31

+1

难道你不能做一个具有select的存储过程吗?我错误地认为存储过程作为一种方式来存储复杂的查询逻辑?应该在视图中完成复杂的查询而不是存储过程?这里存储过程的优点是什么? – MedicineMan 2009-08-14 15:36:56

5

它可以作为您ORM和表格之间的良好“中间人”。

例子:

我们有我们需要改变它所以列SomeColumn将要被移动到另一个表的结构和将有一个一对多的关系到某个人表格。

但是,就Person而言,系统的大部分仍然使用SomeColumn作为单一事物,并不是很多事情。我们使用视图将所有的SomeColumns放在一起并放在视图中,这很好地解决了问题。

这样做是因为数据层发生了变化,但业务需求没有根本改变,所以业务对象不需要改变。如果业务对象不得不改变,我认为这不是一个可行的解决方案,但是视图肯定是一个好的中间点。

+0

有趣。就你而言,它几乎就像表格的一个接口。 – MedicineMan 2009-08-14 15:50:13

74

其中,它可以用于安全。如果您有“客户”表,则可能希望让所有销售人员访问姓名,地址,邮编等字段,但不能获得credit_card_number。您可以创建一个只包含他们需要访问的列的视图,然后授予他们对视图的访问权限。

+0

有趣。安全性是一个很好的答案。你有什么“其他的事情”? – MedicineMan 2009-08-14 15:31:15

+11

我认为这个问题的其他答案会描述“其他事情”。 :-) – 2009-08-14 15:32:25

23

我通常会创建视图以取消规范化和/或汇总经常用于报告目的的数据。

编辑

通过阐述的方式,如果我有一个数据库,其中一些实体是个人,公司,角色,所有者类型,订单,订单明细,地址和电话,其中,人员表存储员工和联系人,地址和电话表存储电话号码给个人和公司,开发团队的任务是生成报告(或向非开发人员提供报告数据),例如员工销售或销售按客户,按地区划分的销售额,按月的销售额,按州划分的客户等等。我会创建一组视图,将数据库实体之间的关系解除规范化,以便实现更加完整的视图(无双关语)可以使用实体实体。一些好处可能包括:

  1. 书面减少冗余查询
  2. 建立标准与实体
  3. 提供了机会 评估,最大限度提高性能 复杂的计算和连接 (例如,在架构绑定索引在MSSQL中查看 )
  4. 使数据更易于访问, 对团队成员和非开发人员都很直观。
+1

你能详细解释一下吗?你的答案已被投票了很多,但我没有得到其他人似乎的价值 – MedicineMan 2009-08-14 15:43:21

9

几个原因: 如果您有复杂的连接,有时最好能有一个观点,这样任何访问将永远有加入正确的,并且开发商不;吨要记住,他们可能需要的所有表。通常情况下,这可能适用于财务应用程序,因为所有财务报告都基于同一组数据是非常重要的。

如果你想限制他们才能看到这些记录的用户,可以使用视图,让他们只对视图访问不是底层表,然后查询视图

Crystal报表似乎更喜欢使用视图来存储特效,所以做大量报表写作的人往往会使用很多视图

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

+0

+1它消除了重复。即使SQL可以(在某种程度上)在运行查询时执行DRY – 2009-08-14 16:18:05

2

有多个原因可以做到这一点。有时可以使通用连接查询变得容易,因为只需查询表名即可,而不必执行所有连接。

另一个原因是限制数据给不同的用户。因此,例如:

表1:Colums - USER_ID;用户名; SSN

管理员用户可以有你不想访问说SSN实际表PRIVS,但用户,创建查看为

 
CREATE VIEW USERNAMES AS SELECT user_id, username FROM Table1; 

然后给他们privs访问视图而不是表格。

1

当我只运行查询时,我喜欢使用存储过程的视图。视图还可以简化安全性,可用于轻松插入/更新多个表,并可用于快照/实现数据(运行长时间运行的查询,并保持结果缓存)。

我已经使用物化视图进行实时查询,而这些查询并不需要保持准确。

+0

而不是?为什么?当你使用一个视图时,你知道你只是执行一个DML操作,当你调用一个SP时,在你得到你的数据之前你不会发生什么其他的事情,这一点并不是很有意义 – MedicineMan 2009-08-14 15:57:59

+0

。即调用缓存函数可能会返回缓存的数据集,但这并不意味着您应该将所需的数据调用到SP中。它简化了API到数据的IMO – MattH 2009-08-17 10:57:28

4

以下是两个常见原因:

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

您可以使用它来方便。将视图中一直使用的一些表格合并在一起。这可以使查询更加一致和简单。

2

当对传统数据库进行报告时,视图可能是天赐之物。特别是,您可以使用感性表格名称而不是隐藏的5个字母名称(其中2个是常用前缀!),或者列表名称全是缩写,我当时确定这些缩写是有意义的。

1

意见也打破非常复杂的设置和表格到,很容易对查询可管理块。在我们的数据库中,我们的整个表管理系统从一张大表中分解成多个视图。

1

这并不完全回答你的问题,但我认为这将是值得一提的物化视图。我的经验主要是Oracle,但据推测SQL-Server非常相似。

我们用我们的架构来解决XML的性能问题类似的东西。我们的系统设计时将大量数据作为XML存储在一行中,应用程序可能需要查询其中的特定值。处理大量XMLType并在大量行上运行XPath会对性能产生巨大影响,因此,只要基表发生变化,我们就可以使用物化视图的形式将所需的XML节点抽取到关系表中。这有效地提供了查询在某个时间点的物理快照,而不是按需运行查询的标准视图。

1

我看到一个存储过程的更多,因为我可以调用针对我的数据的方法,而在我的视图提供了一种机制来创建原始数据的合成版本针对其查询或存储过程可以被创建。当简化或聚合有意义时,我会创建一个视图。当我想提供非常特定的服务时,我会编写一个存储过程。

+0

你能举出一些小型服务的例子: – MedicineMan 2009-08-14 18:09:21

6

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

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

如果你想查看的从查询能力在FROM条款中,但你也希望能够传入参数,也有办法做到这一点。它被称为表值函数。

下面是关于这一主题的非常有用的文章:

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

编辑:顺便说一句,排序的这提出了一个问题,确实视图有超过一表值函数有什么优势?我没有一个很好的答案,但我会注意到创建视图的T-SQL语法比表值函数更简单,并且数据库的用户可能更熟悉视图。有关意见

+0

+1,它是针对SELECT语句处理存储过程问题的少数答案之一。你提出表函数的问题是正确的。基本上,视图可能比功能表现更好,因为它们共享相同的引擎。从SQL切换到事务性SQL(即PL/SQL)时,需要支付一笔开销(至少在Oracle中)。但所有其他的东西 - 安全性,封装等 - 同样适用于视图的程序或功能。 – APC 2009-08-14 21:14:44

+0

根据视图的结构,可以对一些视图编制索引。这是对表值函数的重大改进。 – HLGEM 2015-10-05 14:58:07

1

一个奇怪的事情是,他们是由Microsoft Access视为表:当您安装一个Microsoft Access前端使用ODBC,您会看到可用表列表中的表和视图的SQL数据库。因此,如果您在MS Access中准备复杂的报告,则可以让SQL Server执行连接和查询,并大大简化您的生活。在MS Excel中准备查询的同上。它

1

一般来说,我可以欣赏到使生活更轻松,从一个储存多个表(消除大量的代码加入,以提高可读性)某些实体获得更多的细节,有时分享在多个数据库中的数据,甚至使刀片更容易读书。

1

我只有在我的生产数据库10点左右的观点。我总是使用几个用于我使用的列。我使用的一组数据来自7个表格,有些使用外部连接,而不是重复写入,我只需要在选择中调用该视图并进行一次或两次连接。对我来说,这只是一个节省时间。

+0

如果这不在问题的范围之内,请原谅我,但有几个人提到了这一点 - 您是否因为这样做而承担某种表现的惩罚? – MedicineMan 2009-08-14 21:25:39

+0

没有。 SQL Server优化器显示完全相同的计划来选择*从视图,因为它为SQL连接等同于视图 – 2009-08-18 19:24:00

1

我创建XXX,一个主表之间和参考表(如ProductType或ProductDescriptionByLanguage)的所有关系(如产品表)映射。这将创建一个视图,使我可以检索产品,并将其所有细节从其外键转换为其描述。 然后我可以使用ORM创建对象来轻松构建网格,组合框等。

0

我觉得第一个。要隐藏查询的复杂性。它非常适合于视图。当我们规范化数据库表时如何增加。当表数目增加时,现在取数据是非常困难的。所以最好的处理方法是跟踪视图。如果我错了我的话。

+0

如果你google它你会得到一个非常明确的信息这个问题。 – Chella 2012-12-18 09:08:35

2

这里是如何使用的权限沿视图来限制用户可以更新表中的列。

/* 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 
0

我们在table.If创建视图来限制或ristrict访问所有行/列的业主想只有特定的或有限的行/列需要被共享,那么他将创造与列的视图。

+0

这只是你应该/可以使用视图的唯一原因。 – Alexander 2015-03-20 10:52:23

1

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

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

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

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

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

结合分区数据 在Transact-SQL UNION设置操作者可以在一个视图中被用于从不同的表中两个或更多个查询的结果组合成单个结果集。这对用户来说显示为一个称为分区视图的表。例如,如果一张表包含华盛顿的销售数据,而另一张表包含加利福尼亚州的销售数据,则可以从这些表的联盟创建视图。该视图代表两个地区的销售数据。 要使用分区视图,可以创建多个相同的表,并指定一个约束来确定可添加到每个表的数据范围。然后使用这些基表创建视图。查询视图时,SQL Server自动确定哪些表受查询影响,并仅引用这些表。例如,如果查询指定仅需要华盛顿州的销售数据,则SQL Server只读取包含华盛顿销售数据的表;没有其他表格被访问。

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

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

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

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

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

相关问题