我只是想大致了解RDBMSes中使用的视图.也就是说,我知道一个观点是什么以及如何制作一个观点.我也知道我过去曾用过它们.
但我想确保我彻底了解视图的用处以及视图不应该有用的内容.进一步来说:
什么是有用的视图?
在不使用视图的情况下,是否存在使用视图的诱惑?
为什么要使用视图来代替表值函数,反之亦然?
是否有任何情况下视图可能有用,乍一看并不明显?
(并且为了记录,其中一些问题是故意天真的.这部分是概念检查.)
在某种程度上,视图就像一个界面.您可以根据需要更改基础表结构,但视图为代码提供了一种不必更改的方法.
视图是一种提供简单报告作者的好方法.如果您的业务用户想要从Crystal Reports中访问数据,您可以在他们的帐户中为他们提供一些简化数据的视图 - 甚至可以为他们进行非规范化.
1)什么是有用的视图?
IOPO仅在一个地方
•无论您是考虑数据本身还是引用连接表的查询,利用视图都可以避免不必要的冗余.
•视图还提供了一个抽象层,阻止了对表的直接访问(以及由此产生的手铐引用物理依赖性).事实上,我认为提供对基础数据的抽象访问(使用视图和表值函数)是一种好的做法1,包括1等视图我承认有很多"像我说的那样;不是我做"在那个建议;)CREATE VIEW AS
SELECT * FROM tblData
2)在不使用视图的情况下,是否存在使用视图的诱惑?
视图连接中的性能曾经是一个问题(例如SQL 2000).我不是专家,但我有一段时间没有担心.(我也无法想到我目前正在使用视图连接的位置.)
视图可能过度杀戮的另一种情况是,视图仅从一个调用位置引用,而可以使用派生表.就像匿名类型比.NET中的类更好,如果匿名类型只使用/引用一次.
•请参阅http://msdn.microsoft.com/en-us/library/ms177634.aspx中的派生表说明
3)为什么你会使用视图代替表值函数,反之亦然?
(除了性能原因)表值函数在功能上等同于参数化视图.实际上,一个常见的简单表值函数用例只是将WHERE子句过滤器添加到单个对象中的现有视图中.
4)在任何情况下,视图可能是有用的,乍一看并不明显吗?
我无法想到我头顶的任何非明显用途.(我想如果可以,那会让他们显而易见;)
视图可用于提供安全性(即:用户可以访问仅访问表中某些列的视图),视图可以为更新,插入等提供额外的安全性.视图还提供了一种别名列名称的方法(如同sp())但是视图更像是与实际表的隔离.
在某种意义上,视图是非规范化的.有时需要非规范化以更有意义的方式提供数据.这是许多应用程序通过对象中的域建模进行的操作.它们有助于以更接近业务角度的方式呈现数据.
视图隐藏数据库的复杂性.它们有很多原因,并且在很多情况下都很有用,但是如果您允许用户编写自己的查询和报告,您可以使用它们作为安全措施,以确保它们不会提交设计错误查询使用令人讨厌的笛卡尔联接来删除数据库服务器.
除了其他人所说的内容之外,视图对于从应用程序中删除更复杂的SQL查询也很有用.
例如,而不是在应用程序中执行:
sql ="select a,b from table1 union select a,b from table2";
您可以将其抽象为视图:
创建视图union_table1_table2_v作为
选择a,b从table1
union
选择a,b从table2
并在应用程序代码中,只需:
sql ="从union_table1_table2_v中选择a,b";
此外,如果数据结构发生变化,您将不必更改应用程序代码,重新编译和重新部署.你只需要更改数据库中的视图.
OP询问是否存在使用视图的诱惑,但这是不合适的.
您不想使用视图的是替代复杂的连接.也就是说,不要让程序编程习惯将问题分解成更小的部分,导致您使用多个视图连接在一起而不是一个更大的连接.这样做会破坏数据库引擎的效率,因为它实际上是在执行几个单独的查询而不是一个更大的查询.
例如,假设您必须将表A,B,C和D连接在一起.您可能想要从表A和B以及C&D中的视图中查看视图,然后将两个视图一起加入.在一个查询中加入A,B,C和D要好得多.
视图可以集中或整合数据.我在哪里,我们在几个不同的链接服务器上有许多不同的数据库.每个数据库都保存不同应用程序的数据.其中一些数据库包含与许多不同应用程序相关的信息.在这种情况下我们要做的是在该应用程序的数据库中创建一个视图,该数据库只从真正存储数据的数据库中提取数据,这样我们编写的查询看起来就不会跨越不同的数据库.