何时使用视图代替表格?


108

什么时候应该在实际表上实际使用视图?我期望这会产生什么收益?

总体而言,在表上使用视图有什么好处?我不应该以表的外观设计表格的方式吗?

Answers:


80

哦,您需要考虑很多差异

供选择的视图:

  1. 视图提供对表的抽象。您可以轻松地在视图中添加/删除字段,而无需修改基础架构
  2. 视图可以轻松地为复杂的连接建模。
  3. 视图可以向您隐藏特定于数据库的内容。例如,如果您需要使用Oracle的SYS_CONTEXT函数或许多其他功能进行检查
  4. 您可以轻松地直接在视图上而不是实际表上管理GRANTS。如果您知道某个用户只能访问一个视图,则管理起来会更容易。
  5. 视图可以帮助您向后兼容。您可以更改基础架构,但是视图可以向特定客户端隐藏这些事实。

插入/更新的视图:

  1. 您可以通过直接在视图中使用Oracle的“ WITH CHECK OPTION”子句等功能来处理视图的安全问题。

缺点

  1. 您会丢失有关关系的信息(主键,外键)
  2. 您是否能够插入/更新视图并不清楚,因为该视图向您隐藏了其基础联接

3
快速提问:视图是“永久的”,还是仅持续到会话的整个生命周期?我问的原因:我们的系统有时会在长时间运行代码时崩溃。我通过将部分代码咬入中间表中来节省中间结果,从而减轻了这种情况。因此,如果系统在代码完成之前就开始鸣叫,那么我只需从上次保存的临时表开始拾取即可。如果它们提供相同的永久性,我可能会改用视图。否则,我将继续这样做,并在运行结束时降低温度。谢谢!
ouonomos 2015年

8
@ouonomos:普通视图不包含任何数据。它只是一个存储的SQL语句,即对基础数据的视图。一些数据库(例如Oracle,PostgreSQL)支持实例化视图,这些视图将“视图”临时存储在另一个表中,以加快访问速度。这样做是为了在视图复杂时加快读取访问速度。但这对您没有帮助,因为物化视图仍然是视图,而不是单独的数据。您的方法可能还可以。
卢卡斯·埃德

44

视图可以:

  • 简化复杂的表格结构
  • 通过允许您以更简单的方式过滤敏感数据和分配权限来简化安全模型
  • 允许您在不更改输出结构的情况下更改逻辑和行为(输出保持不变,但基础的SELECT可能会发生重大变化)
  • 提高性能(SQL Server索引视图)
  • 提供可能难以收集的视图特定查询优化

而且您不应该设计表格以匹配视图。您的基本模型应与数据的有效存储和检索有关。视图在某种程度上是一种工具,可通过允许您抽象出复杂性来减轻由有效的标准化模型引起的复杂性。

同样,问“在表上使用视图有什么好处?”并不是一个很好的比较。您不能没有表,但不能没有视图。它们各自存在的原因非常不同。表是具体的模型,视图是抽象的视图。


1
+1视图在某种程度上是一种工具,可通过允许您抽象该复杂性来减轻由有效的标准化模型引起的复杂性。
metdos 2011年

34

当您需要确保每次都遵循复杂的逻辑时,可以接受视图。例如,我们有一个视图可以创建所有财务报告所需的原始数据。通过使所有报表都使用此视图,每个人都可以使用相同的数据集,而不是一个报表使用一组联接,而另一个报表却忘记使用提供不同结果的报表。

当您想限制用户使用特定的数据子集时,可以接受视图。例如,如果您不删除记录,而仅将当前记录标记为活动记录,而将较旧的版本标记为非活动记录,则希望视图用于仅选择活动记录。这样可以防止人们忘记将where子句放在查询中并得到不好的结果。

视图可用于确保用户只能访问一组记录-例如,特定客户端的表视图,并且表上没有安全权限,这意味着该客户端的用户只能看到数据为那个客户。

重构数据库时,视图非常有帮助。

当您使用视图调用视图可能导致糟糕的性能时(至少在SQL Server中),视图是不可接受的。我们几乎失去了一个价值数百万美元的客户,因为有人选择以这种方式抽象数据库,并且性能令人恐惧,而且超时频繁。由于性能问题完全是我们的错,因此我们也必须为修复付出代价,而不是由客户支付。当视图调用视图时,它们必须完全生成基础视图。我已经看到了,视图称为视图,视图称为视图,并且生成了数百万条记录以查看用户最终需要的三个记录。我记得这些视图之一花了8分钟来对记录进行简单的计数(*)。视图调用视图是一个非常糟糕的主意。

使用视图来更新记录通常不是一个好主意,因为通常只能更新同一表中的字段(同样,这是SQL Server,其他数据库可能会有所不同)。在这种情况下,无论如何直接更新表更有意义,这样您就知道哪些字段可用。


1
不知道视图调用视图存在性能问题。好像很奇怪 查询优化器不是正确处理吗?您使用的是哪个版本的SQL Server?
Patrick Honorez 2010年

7

当您需要从多个表中进行选择,或者仅需要获取表的子集时,视图就很方便。

设计表的方式应使数据库规范化(最小重复)。这会使查询有些困难。

视图有点分离,可以让您以不同于存储的方式查看表中的数据。


7

一种常见的做法是在视图中隐藏联接,以向用户提供更非规范化的数据模型。其他用途涉及安全性(例如,通过隐藏某些列和/或行)或性能(在实例化视图的情况下)


6

您应该在不考虑视图的情况下设计表。
除了保存联接和条件外,视图还具有性能优势:SQL Server可以在视图中计算并保存其执行计划,因此使其比“即时” SQL语句更快。
视图还可以简化您在字段级别上与用户访问有关的工作。


5

首先,顾名思义,视图是不可变的。那就是因为视图不过是从数据库中存储的查询创建的虚拟表而已。因此,您具有一些视图特征:

  • 您只能显示一部分数据
  • 您可以将多个表合并到一个视图中
  • 您可以在视图中聚合数据(选择计数)
  • 视图实际上不保存数据,它们不需要任何表空间,因为它们是基础表的虚拟聚合

因此,有成千上万个用例比表更适合视图的用例,只需考虑只在网站上显示活跃用户即可。一个视图会更好,因为您只对数据库中实际存在的数据子集(活动和不活动的用户)进行操作

查看这篇文章

希望这有所帮助..


2

根据维基百科

与表相比,视图可以提供许多优势:

  • 视图可以代表表中包含的数据的子集
  • 视图可以限制基础表对外界的暴露程度:给定的用户可能有权查询该视图,而拒绝访问其余的基表。

  • 视图可以将多个表合并并简化为一个虚拟表。

  • 视图可以充当汇总表,数据库引擎在其中汇总数据(总和,平均值等),并将计算结果作为数据的一部分呈现。

  • 视图可以隐藏数据的复杂性。例如,一个视图可能显示为Sales2000或Sales2001,从而透明地划分了实际的基础表。

  • 视图只占用很小的空间;数据库仅包含视图的定义,而不包含视图提供的所有数据的副本。

  • 视图可以提供额外的安全性,具体取决于所使用的SQL引擎。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.