视图的使用

 为什么引入视图(Views)

如果您读过其他类似的书,可能会看到这些书在介绍视图时列举了许多引入视图的原因。其中认为最重要的原因是维护数据的独立性。那么什么是数据的独立性呢?

早期信息系统的设计与开发多采用模块驱动方式,即设计与开发者首先根据用户的需求建立功能模块(过程和函数),再由这些模块来决定数据结构和存储。以这种方法设计和开发的信息系统在绝大多数情况下是很难维护的。因为在当今这个经济快速发展的社会中,商业环境和市场在不断变化,用户的需求也在不断变化。当然带来的后果也就可想而知了,即相应的模块也要变,随之而来的是数据结构和数据存储都要变。这可以说是牵一发而动全身。在现代化的社会中,变化是不可避免的。也许当今世界上惟一不变的是"变"这个字。

面对变化是不可避免的这一事实时,设计与开发者如何才能设计和开发出相对稳定的信息系统呢?即信息系统的某一局部变化时,不需要修改相应的数据结构和数据存储。研究表明:虽然随着用户的需求的变化,模块的变化几乎是不可避免的,但是信息系统中的数据却几乎是不变的(数据的排列可能会变化)。这样的发现就导致了一种与模块驱动方式完全不同的信息系统设计与开发方法的诞生,这种信息系统设计与开发方法就叫做数据驱动法。

采用数据驱动方式来设计和开发信息系统时,设计和开发者在前期可以完全不考虑系统的硬件、软件(包括操作系统和数据库管理系统)和功能模块(因此也就不用考虑程序设计语言)。设计和开发者在前期要收集信息系统所需的全部数据、化分实体(表)以及定义表与表之间的关系。之后用规范化(Normalization)决定哪些列应该放在哪个表中,最后产生一个基本上只包括了三范式表的实体关系图。当然这是一个漫长和需要多次反复的过程。

许多行家认为一旦完成了这一步,信息系统的设计已完成了一半或以上。因为接下去的工作已经很轻松了,只要将这个图中的实体转换成关系数据库的表,将实体与实体之间的关系转换成关系数据库的约束即可。之后只要将数据装入相应的表中就可以利用SQL语句使用这一信息系统了,只是用户界面不太友好而已。

下面我们用图14.1,一个简化的信息系统设计来说明采用数据驱动方式来设计和开发信息系统给信息系统维护带来的好处。

 

假设在图14.1中的表包含了信息系统所需的全部数据,而且每一个表都是三范式。很显然某一模块所需的数据可能分别存在于多个表中(例如订单)。这时就可以为这一模块创建一个视图,开发人员只能看到和操作通过这一视图所看到的数据,虽然这些数据是来自不同的表,但对于开发人员来说这些数据就好像来自一个表一样。当模块的功能变化需要不同的数据时,需要改变的只是相应的视图而不需要改变真正的表。这样信息系统的维护就简单多了。

从前面的讨论可以看出使用视图有以下的好处:

■ 可以把复杂的SQL语句简单化。您可以看出例14-2中的SQL语句是很复杂的。

在该语句中包含了分组函数(Group Functions),还包含了GROUPBY子句和两个表的连接,并为查询中的每一列取了别名。但用户却可使用像例14-4那样最简单的查询语句从视图average中提取同样的信息。

可以限制数据库的访问。用户通过视图 average只能访问“部门”、“平均工资”、“平均佣金”和“员工数”这4列。

可以使数据独立于应用程序(数据独立性)。见14.1节的讨论。

可以使相同的数据以不同的形式出现在不同的视图中。例如您可以为每一个部门创建一个只包含该部门员工信息的视图,这样当用户使用视图来访问数据时就只能看到他/她所在部门员工的信息。

如何创建视图(Views)

实际上您已经在14.2中创建了一个视图,下面我们给出创建视图比较完整的格式。

CREATE【OR REPLACE】【FORCE|NOFORCE】VIEW 视图名

【(别名】,别名】…)】AS 子查询语句

【WITH CHECK OPTION 【CONSTRAINT约束名】】

[WITH READ ONLY]其中每个选项的含义如下:

OR REPLACE:如果所创建的视图已存在,Oracle系统会重建这个视图。在这里值得注意的一个问题是:可能系统中已有一个同名的视图而且它是一个有用的视图。此时您如果使用OR REPLACE来创建视图就会把系统中有用的视图覆盖掉。因此为了防止这种灾难的发生,您应该在创建视图之前使用SQL*PLUS的DESC 看看这个视图是否已存在。

FORCE:不管所引用的表是否存在,Oracle系统都会创建这个视图。

NOFORCE:只有当所引用的表都存在时,Oracle系统才会创建这个视图(这是■

ORACL系统的默认方式)。视图名:所要创建的视图的名字。

别名:为视图所产生的列定义的列名(别名的个数一定要与视图所产生的列数相等)。

■子查询语句:一个完整的查询语句(您也可以在该语句定义别名)。

WITH CHECK OPTION:所插入或修改的数据行必须满足视图所定义的约束条件。

约束名:WITH CHECK OPTION 中的约束名。

WITHREADONLY:保证在该视图上不能进行任何DML操作。

需要注意的是:在子查询语句中不能包含ORDER BY子句。这可能是因为视图给出的数据并不是最终的结果。如果您想让您的查询结果按某一种有序的方式显示,您可以在查询视图时加入ORDER BY子句。

SQL> CREATE OR REPLACE VIEW acct

2.("名字","工资","职位","雇用日期")

3 AS

4 SELECT ename,sal,job,hiredate

5 FROM emp

6 WHERE deptno = 10;

如何修改视图(Views)

例14-8

SQL> CREATE OR REPLACE VIEW acct

2 ("名字","工资","职位","雇用日期","部门","地点")

3 AS

4 SELECT ename,sal,job,hiredate,dname,loc

5 FROM emp, dept

6 WHERE emp.deptno = dept.deptno

7 AND emp.deptno = 10;

Oracle系统如何管理视图(Views)

当您使用CREATEVIEW语句成功地创建了视图后,这个视图就被存在了Oracle数据字典中。那么一个用户怎样才能知道他/她的账号下有多少个视图,以及这些视图的定义呢?您可以通过查询数据字典user_views来得到这方面的信息(例14-11)。

例14-11

SQL> SELECT view_name,text_length,text

2 FROM user_views;

Oracle系统的执行步骤如下:

(1)从数据字典中取出视图的定义,即查询语句。(2)检查该视图所引用的表的权限。(3)执行视图所定义的查询语句。

从以上Oracle系统的执行步骤可以看出,在使用视图访问数据库时,至少要两次访问硬盘(第一次访问数据字典,第二次访问表中的数据)。因此虽然使用视图给我们带来了诸多的方便,但是它却可能带来一些效率方面的问题。因为磁盘的I/O操作对系统效率的冲击是非常大的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/12170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Win10搭建我的世界Minecraft服务器

简单几步在windwos搭建我的世界服务器,并通过cpolar工具将本地服务暴露到公网连接 1. Java环境搭建 以windows10系统为例,配置java环境,搭建我的世界服务器,下载最新版java版本 Java Downloads | Oracle 选择exe文件,下载完成后双击安装包…

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala 前言 【本文适合有一定计算机基础/半年工作经验的读者食用。立个Flg,愿天下不再有肤浅的SQL Boy】 谈到大数据开发,占据绝大多数人口的就是SQL Boy,不接受反驳,毕竟大…

开发者笑疯了! LLaMa惊天泄露引爆ChatGPT平替狂潮,开源LLM领域变天

来源: 新智源 微信号:AI-era Meta的LLaMA模型开源,让文本大模型迎来了Stable Diffustion时刻。谁都没想 谁能想到,一次意外的LLaMA泄漏,竟点燃了开源LLM领域最大的创新火花。 一系列表现出色的ChatGPT开源替代品——「羊驼家族」…

全网最详细,Jmeter性能测试-性能基础详解,接口关联与编写Java脚本(三)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 接口关联 接口关联…

水塘抽样解决随机选择问题

1.简介 水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到内存的情况。最常见例子为Jeffrey Vitter在其论文中所提及的算法R。 2.算法步骤&#xff1…

机器学习算法系列(三)

机器学习算法之–对数几率回归(逻辑斯蒂回归)算法 上个算法(算法系列二)介绍了如何使用线性模型进行回归学习,但若要做的是分类任务,则需要找一个单调可微函数将分类任务的真实标记y与线性回归模型的预测值…

一次etcd变更引发的惨案

问题描述 在做etcd的数据变更时候,etcd在组成集群的时候出现leader不断切换问题,导致集群不稳定,都面将不健康的etcd节点踢出,只剩etcd单节点,后面将踢出的etcd节点重新加入现有etcd,导致etcd集群奔溃&…

【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

快速搭建第一个SpringCloud程序

目录 1、Spring Boot项目脚手架快速搭建 1.1 生成工程基本配置 1.2 生成工程。 1.3 导入开发工具(此处为Idea) 1.4 运行代码 1.5 验证是否能访问 2、Spring Cloud环境搭建 2.1 版本匹配问题 2.2 Spring Cloud环境测试 3、引入Eureka Server 3…

运行时内存数据区之虚拟机栈——局部变量表

这篇内容十分重要,文字也很多,仔细阅读后,你必定有所收获! 基本内容 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型&#xf…

【从零开始学Skynet】基础篇(六):MySql数据库安装操作

游戏服务端的另一项重要功能是保存玩家数据,Skynet提供了操作MySQL数据库、MongoDB数据库的模块。1、数据库安装 首先安装Mysql服务器,打开终端输入如下指令: sudo apt-get install mysql-server 按下回车,输入密码后开始安装&a…

项目1实现login登录功能方案设计第三版

需求优化点:MySQL表常用功能模块实现方案index页面home页面需求 实现一个登录功能 实现的功能 注册(邮箱注册)登录(邮箱密码)重置密码查看操作记录(登录, 注册, 重置密码, 登出. 都算操作)登出在第2版的基础上进行优化:\ 优化点: VerificationCode(验证码储存库): 增加时间字段…

青藤首提“业安融合”理念,正式发布先进云安全方案CNAPP

4月18日,以“云时代,安全变了”为主题的2023年云安全高峰论坛在北京举行。会上,青藤首次提出“业安融合”理念,正式发布先进云安全方案CNAPP。 中国全面进入云和数字化时代 当前,全球已进入数字经济时代,…

前端自动化测试之葵花宝典

首先聊一下概念,Web 前端自动化测试是一种通过编写代码来自动化执行 Web 应用程序的测试任务的方法,它通常使用 JavaScript 和测试框架 (如 Selenium、Appium 等) 来实现。 Web 前端自动化测试的优点是可以提高测试效率、减少测试时间和测试成本&#x…

工业机器人远程监控解决方案

一、项目背景 随着我国科技不断进步发展和产业升级的不断进行,现阶段机器人应用在生产制造行业以及运输行业已经变得越来越广泛。工业机器人机构复杂、维护成本高,机器人应用的这一行业现状,对工业机器人生产企业的产品高品质服务能力提出了…

Mac远程控制工具有哪些

适用于Mac的远程控制工具有很多,这里我们给大家列举五个常用软件。 1、Apple Remote Desktop 苹果自带远程桌面正如其名称所承诺的那样。作为 Apple 出品的应用程序,您可以想象它的配置和上手是多么容易。从 App Store 下载 Apple Remote Desktop 后&a…

数据结构初阶(算法的复杂度 + 包装类 + 泛型)

文章目录一、算法复杂度1. 算法效率2. 时间复杂度(1) O的渐进表示法3. 空间复杂度二、包装2.1 为什么会出现包装2.2 分类2.3 装箱和拆箱(1)装箱/装包(2)拆箱/拆箱三、泛型3.1 泛型的基本概念3.2 泛型的使用…

【Elastic (ELK) Stack 实战教程】10、ELK 架构升级-引入消息队列 Redis、Kafka

目录 一、ELK 架构面临的问题 1.1 耦合度过高 1.2 性能瓶颈 二、ELK 对接 Redis 实践 2.1 配置 Redis 2.1.1 安装 Redis 2.1.2 配置 Redis 2.1.3 启动 Redis 2.2 配置 Filebeat 2.3 配置 Logstash 2.4 数据消费 2.5 配置 kibana 三、消息队列基本概述 3.1 什么是…

Spring Cloud Gateway: 网关

文章目录 网关Hello world路由: Route谓词: Predicate过滤器: FilterGateway实现限流: RequestRateLimiter过滤器使用Gateway实现服务降级 自定义全局过滤器GateWay中执行流程 网关 API网关就是实现了前端项目和服务端项目之间的统一入口 Nginx实现的是用户和前端项目之间调用…

Spring AOP

目录 AOP 为什么使用AOP Spring AOP AOP的组成 实现Spring AOP AOP表达式 Spring AOP的实现原理 在介绍Spring AOP之前需要先介绍AOP AOP AOP(面向切面编程)就像我们之前学习的OOP(面向对象编程)它是一种思想,它是对某一类事情的集中处理,比如用户登录的校验,在没学AOP…