使用 SQL 视图的充分理由是啥?
Posted
技术标签:
【中文标题】使用 SQL 视图的充分理由是啥?【英文标题】:What is a good reason to use SQL views?使用 SQL 视图的充分理由是什么? 【发布时间】:2010-04-21 03:54:25 【问题描述】:我正在阅读 SQL Server 2008 圣经,并且正在介绍视图部分。但是作者确实没有解释视图的目的。视图有什么用处?我应该在我的网站中使用它们吗?它们有什么好处?
【问题讨论】:
能否请您提供那本书“SQL Server 2008 Bible”的数据库文件?作者的网站已经死了,我联系不上他。 这能回答你的问题吗? Why do you create a View in a database? 【参考方案1】:之前的答案似乎都没有提到的另一个用途是更容易部署表结构更改。
假设您希望停用包含活动用户数据的表 (T_OLD
),而是使用具有相似数据的新表(名为 T_NEW
)但同时包含活动和非活动用户的数据,多一列active
。
如果您的系统有大量查询来执行SELECT whatever FROM T_OLD WHERE whatever
,那么您有两种推出选择:
1) Cold Turkey - 更改数据库,同时更改、测试和发布包含上述查询的大量代码。很难做(甚至协调),风险很大。不好。
2) 渐进 - 通过创建 T_NEW
表、删除 T_OLD
表并创建一个名为 T_OLD
的 VIEW 来更改数据库T_OLD
表 100%(例如视图查询是 SELECT all_fields_except_active FROM T_NEW WHERE active=1
)。
这将允许您避免发布当前从 T_OLD
中选择的任何代码,并在闲暇时进行更改以将代码从 T_OLD
迁移到 T_NEW
。
这是一个简单的例子,还有很多其他的例子。
附:另一方面,您可能应该有一个存储过程 API,而不是来自 T_OLD
的直接查询,但情况并非总是如此。
【讨论】:
我对“存储过程 API”这个术语和相关的优缺点一无所知,但发现这篇文章很有帮助:codinghorror.com/blog/2005/05/… 对不起,我迟到了,但是性能怎么样。如果我需要对原始表进行联接,而我将加入视图,它会使用最佳执行计划吗? @Zikato 是的,如果是indexed view V 好征兆 有没有办法在不引用所有其他列的情况下有效地“选择 all_fields_except_active”?【参考方案2】:(复制自 Google 搜索中出现的第一个教程(链接现已失效),但它具有我自己手动输入的所有好处。)
视图有以下好处:
安全 - 用户可以访问视图,而不能直接访问基础表。这允许 DBA 仅向用户提供他们需要的数据,同时保护同一个表中的其他数据。 简单性 - 视图可用于隐藏和重用复杂查询。 列名简化或澄清 - 视图可用于为列名提供别名,以使它们更容易记住和/或更有意义。 垫脚石 - 视图可以在“多级”查询中提供垫脚石。例如,您可以创建一个查询视图,该视图计算每个销售人员的销售额。然后,您可以查询该视图,按销售人员的销售额对他们进行分组。
【讨论】:
因为我喜欢您的回答,并且认为添加另一个没有什么意义,我可以建议您在列表中添加两个吗?索引视图可以提高性能。针对视图而不是直接对表运行更新可以提高您不会错误地更新该关键生产表的信心:) 您的列表中还有一点,大多数 DBA 都希望使用视图,因为他们可以调整一个视图,并且大多数(并非总是)使用该视图的所有查询都将被调整。 这是我书中 99% 的答案。 顺便说一句 @David 断开链接 最后一点,我们不能使用临时表吗?【参考方案3】:来自Wikipedia的一些原因:
视图可以提供优于表格的优势:
-
视图可以表示表中包含的数据的子集
视图可以连接多个表并将其简化为一个单个虚拟表
视图可以充当聚合表,数据库引擎在其中聚合
数据(总和、平均值等)并将计算结果显示为数据的一部分
视图可以隐藏数据的复杂性;例如,视图可能显示为
Sales2000 或 Sales2001,透明地对实际基础表进行分区
视图存储空间很小;该数据库仅包含
视图的定义,而不是它呈现的所有数据的副本
根据所使用的 SQL 引擎,视图可以提供额外的安全性
视图可以限制一个或多个表格对外部世界的暴露程度
【讨论】:
【参考方案4】:VIEWS 可以用作 SELECT/CODE 的可重用部分,可以包含在要加入的其他选择/查询中,并使用各种不同的过滤器,而不必每次都重新创建整个 SELECT。
这还将逻辑放置在一个位置,因此您不必在整个代码库中更改它。
看看
Choice Between Stored Procedures, Functions, Views, Triggers, Inline SQL
视图的主要美在于它 在大多数情况下可以像桌子一样使用 情况,但与表不同,它可以 封装非常复杂的计算 和常用的连接。它还可以 使用数据库中的几乎任何对象 除了存储过程。意见 当您总是需要时最有用 加入同一组表说 带有订单详细信息的订单以获取 汇总计算字段等
【讨论】:
这样做时要非常小心。如果您使用调用其他视图的视图,您可能会造成巨大的性能混乱。 您可以通过创建方法并将 SQL 查询放入方法中来实现。这种方法每次都可以重复使用。那为什么要看???【参考方案5】:视图是一个抽象层,它做任何好的抽象层所做的事情,包括封装数据库模式和保护您免受更改内部实现细节的后果。
这是一个界面。
【讨论】:
只要您不在视图上堆叠视图以进行进一步抽象。 我认为我已经有效地否定了关系数据库中的任何类型的多级抽象。而且我也不从存储过程中调用存储过程。 :)【参考方案6】:这里有很多使用视图而不是直接使用表格的原因
简单性 - 视图可用于隐藏复杂查询。 安全性 - 视图可以通过在某些选定列上创建视图来向最终用户隐藏一些重要信息 安全性 - 保护表以使用 VIEW 更改其结构。 冗余 - 使用通用视图减少每个过程/查询中的冗余代码。 计算 - 所有计算都可以在视图查询中完成一次。 有意义的名称 - 表可能具有 id 的名称,例如 tbl_org_emp_id,它可以别名为 [Employee No] 或一些有意义的名称。来自imexploring.com
【讨论】:
【参考方案7】:这是使用视图通过某些标准约束实体的一种非常常见的用法。
表:USERS 包含所有用户
查看:ACTIVE_USERS 包含所有用户,不包括那些被暂停、禁止、等待激活并且不符合您将来可能选择定义为活动要求的一部分的任何标准的用户。如果您选择不删除,则无需从 USERS 表中删除任何行,因为 ACTIVE_USERS 始终可以隐藏不需要的行。
这样,您可以在用户管理页面中使用该表,但应用程序的其余部分可以使用 ACTIVE_USERS,因为他们可能是唯一应该能够执行流程和访问/修改数据的用户。
【讨论】:
即使它看起来像您所说的“常见”,您的视图示例与使用 SELECT ... FROM Users WHERE IsActive = false 相比有什么好处?【参考方案8】:视图可以让您组合来自多个不同表的数据并对其进行格式化(组合字段、提供更有意义的字段名称等),以便最终用户使用起来更轻松。它们是数据库模型的抽象。它们还可用于让用户访问表中的数据,而无需直接访问表本身。
【讨论】:
【参考方案9】:常见原因/用途的小清单:
使用它们来更改格式或 数据的“外观”(即您可能加入一个 名字和姓氏一起)
执行计算或其他查找 关于数据
非规范化数据(从 几张桌子放在一个地方)
【讨论】:
【参考方案10】:观点是邪恶的!尽可能避免使用它们,仅出于 DVK 提到的原因使用它们 - 临时数据迁移。
您应该了解,在包含 100 个表的数据库中,很难记住每个表的用途。现在,如果您在此处添加另外 300 个视图,它将变得一团糟。比“视图爱好者”更倾向于使用嵌套视图,然后在存储过程中使用嵌套视图。我个人现在使用一个数据库,其中有 4 次深度嵌套的视图! 因此,要了解存储过程的最简单逻辑,我必须先浏览所有视图。
【讨论】:
-1 浏览量不错。如果您不恰当地使用它们,它们可能变得邪恶 - 但任何事情都是如此。 如果使用不当,视图可能是邪恶的。最常使用它们的人似乎是那些使用它们来抽象事物然后按您说的做的人,调用视图调用视图调用视图到您可能需要在返回结果之前实现 1000 万个记录的地步一组 3 个。直接调用表的视图非常有用。 @HGLEM 有没有办法限制来自其他视图的视图调用?以上是关于使用 SQL 视图的充分理由是啥?的主要内容,如果未能解决你的问题,请参考以下文章