数据库应用-View

主要内容

1.视图(View,Sicht)的概念
2.View的转换
3.数据库中得权限
4.
5.统计学的数据库

View的优点和缺点

优点:
1.简化了数据库的访问
2.使数据库结构化//秩三层结构
3.数据库改变不影响View(logische Datenunabhaengigkeit)//这算优点吗??
4.数据保护
缺点:
1.会自动更改访问操作//把你针对View的操作,该为针对数据库的操作
2.执行改变Sicht的操作时,可能会产生歧义甚至矛盾

例子

MGA(Mitarbeiter,Gehalt,Abteilung)
AL(Abteilung,Leiter)
有两个关系表,MGA给出了工作人员的基本信息:工资和部门
AL则给出了部门以及其对应的领导

Projection view

在SQL中创建View:
create view MA as
select Mitarbeiter, Abteilung from MGA
现在改变这个View MA:
insert into MA values(‘Zuse’,’Info’)
那么数据库执行的相应的指令是:
insert into MGA
values(‘Zuse’,null,’Info’)
存在问题:
如果Gehalt定义为not null,那么上述操作就存在问题了(Konsistenzerhaltung),违反了一致性原则
一致性原则(Konsistenzerhaltung)要求我们对Gehalt内容可以输入任意的值//感觉有点怪怪的,那not null岂不是一个很糟糕的类型,那这里究竟是view得错还是not null的错
违反了Minimal原则//Minimalitaet这个重来没有听过,究竟是神马东西。Operator的minimal就是知道的,但是好像和这也拉不上关系啊

Projection View2

关系Person:

PersoNr3545904711NameBohmBohm

首先创建一个View
create view PName as
select distinct Name from Person
现在加入改变view中Name 把Bohm改为Prof. Bohm就会出现问题。他是把Person关系中的所有的Bohm都改成Prof. Bohm呢?还是只改变其中一个。
如果两个都改变的话,那么这个改变就不是minimal的

Selection View

创建View:
create view MG as
select Mitarbeiter,Gehalt
from MGA
where Gehalt>20
然后把其中一项的值给改变了,使不满足View的条件
update MG set Gehalt=15
where Mitarbeiter=’Zuse’
这时数据库将怎么办呢?
这将取决于,是否加了with check option
如果定义View时用了以下语句:
create view MG as
select Mitarbeiter,Gehalt
from MGA
where Gehalt>20
with check option
那么,由于新改的数据不符合View的条件,它将会被驳回

JoinView

create view MGAL as
select Mitarbeiter,Gehalt,MGA.Abteilung,Leiter
from MGA,AL
where MGA.Abteilung=AL.Abteilung
对生成的View进行以下操作:
insert into MGAL
values (“Turing”,30,’Info’,’Zuse’)
这个操作比较难以翻译,因为他存在多种情况
insert into MGA
values(‘Turing’,30,’Info’)
MGA部分没有歧义,但是AL部分则存在两种情况
1.insert into AL values(‘Info’,’Zuse’)
2.update AL set Abteilung=’Info’
where Leiter=’Zuse’
/*第二种操作
Besser bezüglich Minimalitaetsforderung
Hat aber Seiteneffekte
(Widerspricht Effektkonformitaet)
实在是还木弄懂Minimalitaetsforderung和Effektkonfromitaet?????
Minimalitaetsforderung可以理解为使改变最小化吗 是的话那前面的Projektion view也没有违反minimal啊???,另外Effektkonfromitaet呢???
*/
那么存在针对View的很好翻译的操作吗

Aggregate View

create view As (Abteilung, SummeGehalt) as
select Abteilung, sum(Gehalt)
from MGA
group by Abteilung
下面的操作将不能直接被转化
update AS
set SummeGehalt=SummerGehalt+1000
where Abteilung=’Info’
这1000块大洋是部门评分呢?还是独吞了呢?

View进行操作时需要遵守的准则

1.Effektkonformität:效果一致。假如我们通过操作a生成了View,然后对View进行了b操作得到视图c,此时相应的基本数据库也会发生改变。Effektkonformitaet的要求就是,对改变后的基本数据库进行a操作生成的View和c是一致的。
2.Mnimalität:如果有多种改变的可能性,则执行对基本数据库改动最小的一个
3.Konsistenzerhaltung:对视图的改变不能影响基本数据库的完整性
4.Respektierung des Datenschutzes:///???指基本数据库中特定区域的数据不受影响???
针对上面的情况,我们有必要对针对View的操作进行限制

Standard SQL-92采取的措施

1.不满足Konsistenyerhaltung的操作将被驳回
2.违反Datenschutz(数据保护)的操作是否执行依赖于用户的决定:with check option
3.不满足Effektkonformität的操作,及不明确的操作(即存在多种解释的操作)同样也回被驳回

例子

View:Bibliothek=Proj[Nachname,ISBN](Buch_Exemplare JOIN Ausleihe JOIN Personen)
对这个View进行以下操作:
delete from Bibliothek
where Nachname=’Bohm’ and ISBN=’4711’
对基础数据库造成的影响是:
1.Ausleihe中相应的实例能被删掉
2.Person中得相应的数据不能被删掉,因为删掉他不符合Affektkonformität,因为这个人可能还借了其他的书
3.删除Buch中相应的数据:不满足minimal。但是他是可以实现的//这个最不好理解了???
但是这个操作在Standard中是不会被执行的

针对View的一些限制

1.只允许selection,projection view操作
(join等其他集合操作是不允许的,那么这些操作会引起什么后果呢???)
2.在projection view中不能使用distinct,从而使vier中得Tupel可以和基本数据库中得Tupel一一对应
3.在selection view中使用arithmetic和aggregate是不被允许的,比如:
select Name,PersKosten+laufendeKosten as
Gesamtkosten
from Abteilung
4.from中得每一个参数都指向单一的一个数据库。也就是说不允许出现join view,同时也不允许self join(就是自身和自身join)
//为什么不允许self join呢???self join本身又有什么意义呢???
5.不允许使用group by和having//having忘了???为什么不允许??
6.where中不允许自相关的访问,也就是说,一个嵌套访问中,最外层的关系名字,不能出现在里层的from部分中。

解析对View的访问

select:用基本数据库中的属性名字或运算式对sicht的属性进行替换
from:使用基本数据库中的关系名字
用并关系把view访问和view定义的where causal联合起来,用需要的话要进行重命名

例子

View:
create view MGAL2(name,salary,dept,boss) as
select Mitarbeiter,Gehalt,MGA.Abteilung, Leiter
from MGA, AL
where MGA.Abteilung=AL.Abteilung
and Gehalt>20
Query:
select name,salary
from MGAL2 where boss=’Klemmens’
将解析为:
select Mitarbeiter,Gehalt
from MAG,AL where Leiter=’Klemens’
and MGA.Abteilung=AL.Abteilung
and Gehalt>20

例子2:aggregate View访问中存在的问题

View:
create view DS (Abteilung,GehaltsSumme) as
select Abteilung,sum(Gehalt)
from MGA
group by Abteilung
Query:
select Abteilung
from DS
where GehaltsSumme > 500
解析:
select Abteilung
from MGA
where sum(Gehalt)> 500
group by Abteilung
这个看起来好像没什么问题,但其实他是错得。Where的作用是在对查询结果进行分组前,将不符合where条件的行去掉,条件中不能包含聚组函数。having的作用是筛选满足特定条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组(这段式kopy的)。因此正确的解析应该是:
select Abteilung
from MGA
group by Abteilung
having sum(Gehalt)>500
另外一中情况:
Query:
select avg(GehaltsSumme)
from DS
那么他相应的解析即是:
select avg(sum(Gehalt))
from MGA
group by Abteilung
但是这种aggregate操作的嵌套好像在SQL中是不允许 //那该怎么办呢??

数据库中的权限

视图可以方便数据库权限的控制。特定的用户只对相应的一些视图享有相应的权限。可以有效的防止用户通过视图更改基本数据库。具体看下面两张图片自行研究:
这里写图片描述

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值