sql 视图
2016-05-12 00:00
260 查看
view
直接对某张表的操作,就是在对数据库系统的逻辑模型层的操作。但让所有用户都看到整个逻辑模型是不合适的。出于安全的考虑,如会隐藏某个属性。这时就需要这种‘虚表’,它向用户透露一部分的数据,它不属于逻辑模型层的。我们称它为视图。视图并不是预先计算并存储的,而是在使用的时候才通过执行查询被计算出来
定义一个视图:
create view V as <查询语句>
存在的视图也可以用来定义另一个视图
视图维护
为保证视图中数据的一致性,必需有一些的策略对其进行维护
第一种,数据库系统仅仅只是存储视图的查询表达式。当真正的用到该视图时才去执行这个查询。这种方式保证了数据的一致,但是如果频繁使用该视图,这种方式就不如直接存储视图内容来的划算。
第二种,数据库系统直接存储视图的内容。为保证数据的一致性,就要求在逻辑视图更新后,相应的视图也要即时的更新。同时暴露的问题就是,如果逻辑层更新频繁,那么视图也会跟着更新。最差的情况是,你还不怎么用这个视图。
第三种,存储内容后定期的更新视图。这种似乎综合上面两种方案。但有个致命的点是,你没法保证视图中的数据是最新的。
使用哪种方式,不仅要根据情况来定。而且最重要的是,数据库系统是否支持你使用以上三种的维护方式
视图更新
视图是一张”虚表“,想要这张表支持增删改,却是一个重大的问题。至少目前不能做到
直接对某张表的操作,就是在对数据库系统的逻辑模型层的操作。但让所有用户都看到整个逻辑模型是不合适的。出于安全的考虑,如会隐藏某个属性。这时就需要这种‘虚表’,它向用户透露一部分的数据,它不属于逻辑模型层的。我们称它为视图。视图并不是预先计算并存储的,而是在使用的时候才通过执行查询被计算出来
定义一个视图:
create view V as <查询语句>
[code=plain]create view stuent_view as select a.*,b.name as gradeName from student a join grade b on a.gradeId = b.id where a.age>20;
存在的视图也可以用来定义另一个视图
视图维护
为保证视图中数据的一致性,必需有一些的策略对其进行维护
第一种,数据库系统仅仅只是存储视图的查询表达式。当真正的用到该视图时才去执行这个查询。这种方式保证了数据的一致,但是如果频繁使用该视图,这种方式就不如直接存储视图内容来的划算。
第二种,数据库系统直接存储视图的内容。为保证数据的一致性,就要求在逻辑视图更新后,相应的视图也要即时的更新。同时暴露的问题就是,如果逻辑层更新频繁,那么视图也会跟着更新。最差的情况是,你还不怎么用这个视图。
第三种,存储内容后定期的更新视图。这种似乎综合上面两种方案。但有个致命的点是,你没法保证视图中的数据是最新的。
使用哪种方式,不仅要根据情况来定。而且最重要的是,数据库系统是否支持你使用以上三种的维护方式
视图更新
视图是一张”虚表“,想要这张表支持增删改,却是一个重大的问题。至少目前不能做到
相关文章推荐
- 用SparkPost发送邮件
- oracle时间戳-日期转换
- 360开源的类Redis存储系统:Pika
- 数据库连接池
- MySQL模糊查询出现的问题与解决办法
- SQLException: Could not open JDBC Connection for
- NoSQL
- Oracle Logminer 与 rman 官方文档英文
- MySQL主库切换
- windows配置mysql5.6免安装版
- PostgreSQL 学习一 安装和入门
- Oracle BRM处理逻辑
- XTRABACKUP原理及使用INNOBACKUPEX进行MYSQL数据库备份恢复
- 基础算法7:从数据库某个字段中取出现次数最多的几条数据形成“热门xxx”
- MySQL错误日志总结
- 2016年5月11日摘自知乎的一些Redis大概了解
- vsftpd的基于pam_mysql的虚拟用户机制实现数据传输
- vsftpd的基于pam_mysql的虚拟用户机制实现数据传输
- Redis之2-双端链表(adlist.c,adlist.h)
- hibernateTemplate.delete(t);删除不了语句,没有生成sql语句