Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

实用view视图 #14

Open
MaZiTeng opened this issue Apr 15, 2016 · 1 comment
Open

实用view视图 #14

MaZiTeng opened this issue Apr 15, 2016 · 1 comment

Comments

@MaZiTeng
Copy link
Member

问题提出:在做博客时会出现一个页面要显示的数据在多个不同的表中,有时需要将一个表的一个搜索结果作为另一个搜索的条件。举个例子:在登陆时,你可以输入你的是用户名登陆,但是在数据库里用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
Copy link
Contributor

tugui commented Apr 20, 2016

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

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants