数据库视图(普通视图和物化视图)

(1)物化视图

     sqlserver中并没有物化视图这一概念,而是用索引视图来替代(具体参考:https://msdn.microsoft.com/zh-cn/library/ms191432.aspx 和https://msdn.microsoft.com/zh-cn/library/aa290257%28VS.71%29.aspx),这里的物化视图主要指oracle数据库中的物化视图。

(2)普通视图 和 物化视图 

      物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好

(3)视图优点

    A. 视点集中
    视图使得用户只关心它感兴趣的那些特定数据和他们所负责的特定任务。这样通过只允许用户看到视图中所定义的数据而不是视图引用表中的数据而提高了数据的安全性。
    B.简化操作
    视图大大简化了用户对数据的操作。因为在定义视图时,若视图本身就是一个复杂查询的结果集,这样在每一次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间的复杂的连接操作,也简化查询操作。
    C.定制数据
    视图能够实现让不同的用户以不同的方式看到不同或相同的数据集。因此,当有许多不同水平的用户共用同一数据库时,这显得极为重要。
    D. 合并分割数据
    在有些情况下,由于表中数据量太大,故在表的设计时常将表进行水平分割或垂直分割,但表的结构的变化却对应用程序产生不良的影响。如果使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。

(3)视图的可更新性

     如果视图满足以下条件是可更新的:

  • form子句 只有一个数据库关系表,即只从一个表查询得到的视图,而不能是从两个表及以上所查询得到的视图
  • select 子句 只包含了数据库关系表属性名,不包含任何的表达式、聚集函数 或 distinct等关键字,否则不能更新
  • 数据库关系表中没有出现在 select 子句后面的属性,都可以取null(空值),即  这些属性没有not null 约束,或 不构成主码的一部分,因为这些约束条件限制属性不能为null
  • 不能为分组查询,即不能有group by 或having等语句

       从上面可以很容易理解,如果一个视图由多个表查询所得,那么它不能被更新,因为一旦更新会涉及到多张表,而这些是视图所不允许的;同时如果视图包含复杂的查询,例如分组或聚集查询,也是不能更新,因为这些查询得到的视图和原始关系表数据无法对应起来,也就没法更新;而第三条为何强调 “数据库关系表中没有出现在 select 子句后面的属性” ,因为视图中的属性只是原关系表的一部分属性,那么遇到插入数据的时候,就只能插入视图包含的属性,对于不包含的属性,数据库就只能为空,因此就要求视图不包含的属性允许为空。

        即便视图满足这些条件,某些情况下更新视图也会有各种问题。同时,不同的数据库系统指定了不同的条件以允许更新视图关系,具体请参考数据库手册获得详细信息。此外,对于多个表查询所得视图,也有办法进行更新,可以使用触发器的办法进行更新,具体的更新办法这里不多介绍。

        即便如此,从各方面来考虑,也不建议对视图进行更新,而是对原数据库关系表进行更新。



你可能感兴趣的:(数据库)