什么是好的观点?

时间:2008-10-17 23:03:56

标签: sql views rdbms-agnostic

我只是想大致了解RDBMSes中使用的视图。也就是说,我知道一个观点是什么以及如何制作一个观点。我也知道我过去用过的东西。

但我想确保彻底了解视图的用途以及视图不应该有用的内容。更具体地说:

  1. 什么是有用的视图?
    • 在不使用视图的情况下,是否存在使用视图的诱惑?
    • 为什么要使用视图代替表值函数,反之亦然?
    • 是否有任何情况下视图可能有用,乍一看并不明显?
  2. (并且为了记录,其中一些问题是故意天真的。这部分是概念检查。)

14 个答案:

答案 0 :(得分:43)

在某种程度上,视图就像一个界面。您可以根据需要更改基础表结构,但该视图为代码提供了一种不必更改的方法。

视图是提供简单报告作者的好方法。如果您的业务用户想要从Crystal Reports中访问数据,您可以在他们的帐户中为他们提供一些简化数据的视图 - 甚至可以为他们进行非规范化。

答案 1 :(得分:41)

1)什么是有用的视图?

IOPO 仅在一个地方

•无论您是考虑数据本身还是引用连接表的查询,利用视图都可以避免不必要的冗余。

•视图还提供了一个抽象层,阻止了对表的直接访问(以及由此产生的手铐引用物理依赖性)。事实上,我认为良好做法 1 仅提供对基础数据的抽象访问(使用视图和表值函数),包括
CREATE VIEW AS
      SELECT * FROM tblData


1 我承认在这个建议中有很多“按我说的做,不像我做的那样”;)

2)在不使用视图的情况下,是否存在使用视图的诱惑?

视图连接中的性能曾经是一个问题(例如SQL 2000)。我不是专家,但我有一段时间没有担心。 (我也无法想到我目前正在使用视图连接的位置。)

视图可能过度的另一种情况是视图仅从一个调用位置引用,并且可以使用派生表代替。就像匿名类型比.NET中的类更好,如果匿名类型只使用/引用一次。

•请参阅http://msdn.microsoft.com/en中的派生表描述-us /库/ ms177634.aspx

3)为什么你会用一个视图代替像表值函数那样的东西,反之亦然?

(除了性能原因)表值函数在功能上等同于参数化视图。实际上,一个常见的简单表值函数用例只是将WHERE子句过滤器添加到单个对象中的现有视图中。

4)在任何情况下,视图可能有用而乍一看并不明显吗?

我无法想到我头顶的任何非明显用途。 (我想如果可以,那会让他们显而易见;)

答案 2 :(得分:20)

视图可用于提供安全性(即:用户可以访问仅访问表中某些列的视图),视图可以为更新,插入等提供额外的安全性。视图还提供了一种别名列名称的方法(和sp一样)但是视图更像是与实际表格的隔离。

答案 3 :(得分:17)

在某种意义上,视图是非规范化的。有时需要非规范化以更有意义的方式提供数据。这是许多应用程序通过对象中的域建模进行的操作。它们有助于以更接近业务角度的方式呈现数据。

答案 4 :(得分:11)

视图隐藏了数据库的复杂性。它们有很多原因,并且在很多情况下都很有用,但是如果您允许用户编写自己的查询和报告,您可以使用它们作为安全措施,以确保它们不会提交设计错误查询使用令人讨厌的笛卡尔联接来删除数据库服务器。

答案 5 :(得分:9)

除了其他人所说的内容之外,视图对于从应用程序中删除更多复杂的SQL查询也很有用。

作为示例,而不是在应用程序中执行:

  

sql =“从table1 union中选择a,b   从table2中选择a,b;

您可以将其抽象为视图:

  

创建视图union_table1_table2_v为
  从table1中选择a,b   工会
  从table2中选择a,b

在应用代码中,只需:

  

sql =“从union_table1_table2_v中选择a,b”;

此外,如果数据结构发生变化,您将不必更改应用程序代码,重新编译和重新部署。你只需要改变数据库中的视图。

答案 6 :(得分:6)

OP询问是否存在使用视图的诱惑,但这不合适。

您不想使用视图是替代复杂连接。也就是说,不要让程序编程习惯将问题分解成更小的部分,导致您使用多个视图连接在一起而不是一个更大的连接。这样做会破坏数据库引擎的效率,因为它实际上是在执行多个单独的查询而不是一个更大的查询。

例如,假设您必须将表A,B,C和D连接在一起。您可能很想从表格A& A中查看。 B和C& C的观点D,然后将两个视图连接在一起。在一个查询中加入A,B,C和D会好得多。

答案 7 :(得分:5)

视图可以集中或整合数据。我在哪里我们在几个不同的链接服务器上有许多不同的数据库。每个数据库都保存不同应用程序的数据。其中一些数据库包含与许多不同应用程序相关的信息。在这种情况下我们要做的是在该应用程序的数据库中创建一个视图,该数据库只从真正存储数据的数据库中提取数据,这样我们编写的查询看起来就不会跨越不同的数据库。 / p>

答案 8 :(得分:4)

到目前为止的回答都是正确的 - 视图有助于提供安全性,非规范化(尽管如果做错了会有很多痛苦),数据模型抽象等等。

此外,视图通常用于实现业务逻辑(失效用户是指在过去40天内未登录的用户,这类事情)。

答案 9 :(得分:3)

视图在SQL脚本中保存了大量重复的复杂JOIN语句。您可以在某些视图中封装一些复杂的JOIN,并在需要时在SELECT语句中调用它。这有时比在每个查询中写出连接语句更方便,更直接,更容易。

答案 10 :(得分:2)

视图只是一个存储的命名SELECT语句。想想像库函数这样的视图。

答案 11 :(得分:1)

我想强调使用视图进行报告。通常,规范化数据库表以加快性能(尤其是编辑和插入数据(OLTP使用))和非规范化以减少报表和分析查询(OLAP使用)的表连接数之间存在冲突。必要时,OLTP通常会获胜,因为数据输入必须具有最佳性能。然后,创建视图以获得最佳报告性能可以帮助满足两类用户(数据输入和报告查看者)。

答案 12 :(得分:1)

我记得很长的SELECT涉及多个UNION。每个UNION都包含一个价格表的连接,该价格表是由SELECT本身创建的,它本身相当长且难以理解。我认为有一个创建价格表的观点是个好主意。它会将整体SELECT缩短一半左右。

我不知道数据库是否会一次评估视图,或者每次调用一次。谁知道?如果是前者,使用视图会提高性能。

答案 13 :(得分:0)

任何时候你需要[my_interface]!= [user_interface]。

示例:

表A:

  • ID
  • 信息

表A的视图:

  • 客户信息

这是一种可以隐藏客户ID并将信息重命名为更详细的名称的方法。

视图将使用主键id的基础索引,因此您不会看到性能损失,只是更好地抽象选择查询。