什么是使用SQL视图的好理由?
我通过SQL Server 2008圣经阅读,我涵盖的意见部分。 但笔者实在没有解释意见的目的 。 什么是好的用途意见? 我应该在我的网站中使用它们,它们有什么好处?
前面的答案似乎没有提到的另一个用法是更容易部署表结构更改。
比方说,您希望淘汰一个包含活跃用户数据的表(T_OLD),而是使用一个具有类似数据(名为T_NEW)的新表,但是有一个数据既可以用于活动用户,也可以用于非活动用户,并且一个额外的列是“活动的”。
如果你的系统有大量的SELECT whatever FROM T_OLD WHERE whatever
查询, SELECT whatever FROM T_OLD WHERE whatever
,你有两个select:
1)Cold Turkey – 更改数据库,同时更改,testing和发布包含上述查询的大量代码。 很难做(甚至协调),非常危险。 坏。
2)渐变 – 通过创buildT_NEW,删除T_OLD,而不是创build一个名为T_OLD,模仿T_OLD表100%的视图(例如,视图查询是SELECT all_fields_except_active FROM T_NEW WHERE active=1
)来SELECT all_fields_except_active FROM T_NEW WHERE active=1
。
这样可以避免释放当前从T_OLD中select的任何代码,并执行更改以将代码从T_OLD迁移到T_NEW。
这是一个简单的例子,还有其他更多的参与。
PS另一方面,你可能应该有一个存储过程的API而不是从T_OLD的直接查询,但事实并非总是如此。
(从Googlesearch中的第一个教程复制而来,但它具有我自己手动input的所有好处。)
视图有以下好处:
- 安全性 – 用户可以访问视图,而底层表不能直接访问。 这允许DBA只给用户所需的数据,同时保护同一表中的其他数据。
- 简单 – 视图可以用来隐藏和重用复杂的查询。
- 列名简化或澄清 – 视图可以用来提供列名的别名,使它们更加难忘和/或有意义。
- 踏脚石 – 意见可以提供“多层次”查询的垫脚石。 例如,您可以创build一个查询视图,计算每个销售人员的销售数量。 然后,您可以查询该视图,按销售人员的数量对销售人员进行分组。
VIEWS可以用作SELECT / CODE的可重用部分,可以将其包含在其他要join的select/查询中,并使用各种不同的filter,而不必每次都重新创build整个SELECT。
这也将逻辑放在一个单一的位置,所以你不必在整个代码库中改变它。
看一下
存储过程,函数,视图,触发器,内联SQL之间的select
视图的主要优点是在大多数情况下它可以像表一样使用,但与表不同,它可以封装非常复杂的计算和常用的连接。 除了存储过程,它也可以在db中使用几乎任何对象。 视图是最有用的,当你总是需要join相同的一套表,说一个订单与订单明细得到汇总计算字段等
来自维基百科的一些原因:
视图可以提供优于表格的优点:
- 视图可以表示包含在表中的数据的子集
- 视图可以将多个表连接并简化为一个虚拟表
- 视图可以作为聚集表 ,数据库引擎在其中汇总数据(总和,平均值等),并将计算结果作为数据的一部分呈现
- 视图可以隐藏数据的复杂性 ; 例如一个视图可能会显示为Sales2000或Sales2001,透明地分区实际的基础表
- 意见只占用很小的空间来储存 ; 数据库只包含一个视图的定义,而不是它提供的所有数据的副本
- 根据所使用的SQL引擎,视图可以提供额外的安全性
- 意见可以限制一个或多个桌子暴露在外面的程度
一个视图是一个抽象层,它可以完成任何好的抽象层,包括封装数据库模式,并保护您免受更改内部实现细节的影响。
这是一个界面。
这是使用视图通过一些标准约束实体的一个非常常见的用法。
表:USERS包含所有用户
查看:ACTIVE_USERS包含所有用户,不包括那些被暂停,禁止,等待被激活的用户,并且不符合您将来可能select定义的任何标准作为活动要求的一部分。 这样就不必删除USERS表中的任何行,因为ACTIVE_USERS总是可以隐藏不需要的行。
通过这种方式,您可以在用户pipe理页面中使用该表,但其他应用程序可以使用ACTIVE_USERS,因为它们可能是唯一应该能够执行进程和访问/修改数据的用户。
视图允许您合并来自多个不同表格的数据并对其进行格式设置(组合字段,提供更有意义的字段名称等),以便最终用户更容易。 它们是数据库模型的抽象。 它们也可以用来让用户访问表中的数据,而不用直接访问表本身。
常见原因/用途的小列表:
-
使用它们来更改数据的格式或“外观”(即,您可能会同时join姓氏和名字)
对数据执行计算或其他查找
对数据进行非规范化(将数据从多个表中提取到一个点)
不能总是更新视图的基础表。
例如,尝试
创build查看theyshallnotpass作为select*从
并有一个更新的一个讨厌的惊喜…
(MSSQL)
以下是直接使用视图而不是表格的一些原因
- 简单 – 视图可以用来隐藏复杂的查询。
- 安全 – 视图可以通过在一些选定的列上创build视图来隐藏最终用户的一些重要信息
- 安全 – 安全表使用VIEW更改它的结构。
- 冗余 – 通过使用通用视图减less每个过程/查询中的冗余代码。
- 计算 – 所有计算都可以在查看查询中完成一次。
- 有意义的名称 – 表可能具有像tbl_org_emp_id这样的id的名称,可以使用别名,例如[Employee No]或一些有意义的名称。
从imexploring.com
意见是邪恶的! 如果可能的话,避免使用它们,仅用于DVK提到的原因 – 临时数据迁移。
你应该明白,在一个有100个表的数据库中,很难记住每个表的目的。 现在,如果在这里添加另外300个视图,它将变得完全混乱。 比“查看爱好者”倾向于使用嵌套视图,然后使用存储过程中的嵌套视图。 我personnaly现在工作与一个数据库,其中有4倍的视图嵌套深度! 所以为了理解一个简单的存储过程的逻辑,我必须首先浏览所有的视图。