100steps/Blogs

实用view视图

MaZiTeng opened this issue · 1 comments

问题提出:在做博客时会出现一个页面要显示的数据在多个不同的表中,有时需要将一个表的一个搜索结果作为另一个搜索的条件。举个例子:在登陆时,你可以输入你的是用户名登陆,但是在数据库里用password和id在表basic里,id,user_name,nickname,sex,age,email,phone....在basic_information里。如果有人用aaaa为用户名登陆,我就要搜索表basic_information找到aaaa对应的id,然后把这个搜索结果放到表basic里搜索password并进行匹配,这样会有很多问题。首先逻辑不易判断,要考虑在两个表间传递时可能出现的各种错误,而且性能上问题也会比较严重,所以引入“视图”。
先给一个基本定义:计算机数据库中的视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。(baike.baidu.com/link?url=KcZfe4OHUMZLAbXh1c4G8NPc1wkldMGec1s1i53jh3Q6vag4k596FUH9s8Yqts-6gR0OOzDQ-Q8Dyd18YryU1_)
还用我这个例子,我建立一个视图,将表basic和basic_information建立视图,
create algorithm=temptable view log_in (id,password,user_name) as select basic.id ,basic.password ,basic_information.user_name from basic ,basic_information where basic.id=basic_information.id;
tips:括号内的可以省略不写。
接着我只要搜索这个虚拟表log_in就可以了,这样就跳过了id这个中介,直接让买家(user_name)找到了卖家(password),你就能省下一笔中介费。
select * frm where user_name = "aaaa";
再从中提取出password进行匹配就OK了。
最后我们来删除这个没有用的视图,毕竟让一个存有用户名和密码的表存在是很危险的
Drop view log_in;
这样就算是彻底优化了我的登录功能。
现在我们知道视图是什么了,那么我们再来看看他都有什么功能:
1.合并多表:现阶段我们用的最多的功能。就像我这个例子,把多个表合并在一起提高搜索效率并简化查询语句。
2.权限控制:在开放权限时,可以只开放这个视图的权限,他们就不知道nickname,sex,age,email,phone....的信息,如果哪天有人让我提供昵称,我可再做一个视图而不用改我的整个表了。
3.大数据分表:表的行数据超过200万行时,速度就会变慢。如果我的博客系统做的很成功,有400万人用,那我为了兼顾效率,就要进行分表出处理,但是我不能在他们登陆时一个一个表去找啊,所以用视图把4个100万条数据的表组合起来
create view basic_informations as select * from basic_information1 union select * from basic_information2 union select * from basic_information3 union select * from basic_information4;
4.....(等待你们补充哦!)
made by mzt
本文参考引用:
http://www.cnblogs.com/zzwlovegfj/archive/2012/06/23/2559596.html
baike.baidu.com/link?url=KcZfe4OHUMZLAbXh1c4G8NPc1wkldMGec1s1i53jh3Q6vag4k596FUH9s8Yqts-6gR0OOzDQ-Q8Dyd18YryU1_
http://www.cnblogs.com/wangtao_20/archive/2011/02/24/1964276.html
http://blog.itpub.net/28194062/viewspace-772902/

tugui commented

补充一下吧,其实视图是可以简化查询语句(SQL)的,但是查询效率是否得到提高,还要看数据库对语句的解析和优化是否到位。比如MySQL中对视图的处理方式有两种(algorithm):简单地把视图定义语句替换到查询语句中(merge),或者是先执行视图定义语句生成临时表(temptable)再对表执行SQL语句,而一般来说是前者的效果更好。

在权限控制方面,更多地还是考虑到安全性的需要。视图就像一个接口,可以供开发人员调用,同时又确保他们不会干多余的事情或看到不该看的东西。就像这句话所说:

Seperating the people who are administering the data from the ones who are actually accessing it.

然后第四个功能是:在改动具体的表结构时,可以使得外部查询不受影响(虽然生成视图的语句还是要改),这样大部分的工作就落在了数据库管理员这边。

最后要提的就是,对于视图的操作(增删改)也会影响到实际的表,所以在权限规划方面要慎之又慎,一般来说视图仅用于查询会比较好(避免产生数据错误)。