何时使用视图而不是表?
什么时候应该实际上使用一个实际的表视图? 我应该预期这会产生什么收益?
总体而言,在表格上使用视图有什么优势? 我不应该以视图应该看起来的样子devise桌子吗?
哦,你需要考虑很多不同之处
select的意见:
- 视图提供对表的抽象。 您可以在视图中轻松添加/删除字段,而无需修改您的基础架构
- 视图可以轻松地build模复杂的联接。
- 视图可以隐藏您的数据库特定的东西。 例如,如果你需要使用ORACLE SYS_CONTEXT函数或许多其他的东西来做一些检查
- 您可以直接在视图上直接pipe理您的GRANTS,而不是实际的表格。 如果您知道某个用户只能访问某个视图,则更容易pipe理。
- 视图可以帮助您向后兼容。 您可以更改基础架构,但视图可以从某个客户端隐藏这些事实。
插入/更新视图:
- 您可以直接在视图中使用Oracle的“WITH CHECK OPTION”子句等function来处理视图的安全问题
缺点
- 你失去了有关关系的信息(主键,外键)
- 您是否能够插入/更新视图并不明显,因为视图隐藏了您的底层联接
意见可以:
- 简化一个复杂的表格结构
- 简化您的安全模型,允许您以更简单的方式过滤敏感数据并分配权限
- 允许您在不更改输出结构的情况下更改逻辑和行为(输出保持不变,但底层的SELECT可能会发生显着变化)
- 提高性能(Sql Server索引视图)
- 提供具体的查询优化与否则可能很难收集的观点
而且你不应该devise表格来匹配视图 。 您的基础模型应该关注高效的数据存储和检索。 观点部分地是一个工具,通过允许你抽象复杂性来减轻高效的,规范化的模型产生的复杂性。
另外,问“使用视图的好处是什么?”并不是一个很好的比较。 你不能没有桌子,但你可以没有意见。 他们每个人都有一个非常不同的原因。 表格是具体的模型,视图是一个抽象的,很好的视图。
当您需要确保每次都遵循复杂的逻辑时,视图是可以接受的。 例如,我们有一种观点,即创build所有财务报告所需的原始数据。 通过让所有的报告都使用这个视图,每个人都使用相同的数据集,而不是一个使用一组联接的报告,而另一个则忘记使用一个给出不同结果的报告。
当您想限制用户到特定的数据子集时,视图是可以接受的。 例如,如果您不删除logging,但只将当前标记标记为活动标记,将旧版本标记为非活动标记,则需要使用视图来仅select活动logging。 这样可以防止人们忘记在查询中放入where子句并获得不好的结果。
可以使用视图来确保用户只能访问一组logging – 例如,特定客户端的表的视图,并且表上没有任何安全权限可能意味着该客户端的用户只能看到数据为那个客户。
视图在重构数据库时非常有用。
当您使用视图调用视图时,视图是不可接受的,这会导致可怕的性能(至less在SQL Server中)。 我们几乎失去了一个数百万美元的客户,因为有人select这样抽象数据库,性能是可怕的,并经常超时。 我们不得不为客户解决问题,因为性能问题完全是我们的错。 当视图调用视图时,他们必须完全生成基础视图。 我已经看到这个视图称为一个视图,称为一个视图,并生成了数以百万计的logging,以查看用户最终需要的三个。 我记得其中的一个意见花了8分钟做一个简单的计数(*)的logging。 调用视图的视图是一个非常糟糕的主意。
由于通常只能从同一个表中更新字段(这也是SQL Server,其他数据库可能有所不同),所以使用视图通常是一个不好的主意。 如果是这样的话,直接更新表格更有意义,这样就可以知道哪些字段可用。
通常的做法是在视图中隐藏连接以向用户呈现更为非规范化的数据模型。 其他用途涉及安全性(例如通过隐藏某些列和/或行)或性能(在物化视图的情况下)
如果您需要从多个表中进行select,或者只是为了获取表的子集,则视图很方便。
你应该devise你的表格,使你的数据库很好地规范化 (最小重复)。 这可以使查询有些困难。
视图有一点分离,允许您以不同的方式查看表中的数据。
你应该devise你的桌子,而不考虑意见。
除保存联接和条件外,视图确实具有性能优势:SQL Server可以计算视图中的执行计划,并将其保存在视图中,因此比“实时”SQL语句更快。
查看也可能会减轻您在现场级别访问用户的工作量。
首先顾名思义,一个观点是不可改变的。 那是因为视图不过是从DB中存储的查询创build的虚拟表。 正因为如此,你有一些观点的特点:
- 您只能显示数据的一个子集
- 您可以将多个表join一个视图
- 您可以在视图中汇总数据(select计数)
- 视图不实际保存数据,他们不需要任何表空间,因为它们是基础表的虚拟聚合
所以有很多用例的视图比表格更适合,只要考虑只在网站上显示活动用户即可。 一个视图会更好,因为您只操作实际存在于数据库中的数据的子集(活动用户和非活动用户)
看看这篇文章
希望这有助于..
根据维基百科 ,
视图可以为表格提供许多优点:
- 视图可以表示包含在表中的数据的子集 。
-
视图可以限制底层表暴露给外部世界的程度:给定的用户可能有查询视图的权限,而拒绝访问基表的其余部分。
-
视图可以将多个表连接并简化为一个虚拟表。
-
视图可以作为聚合表 ,数据库引擎在其中汇总数据(总和,平均值等),并将计算结果作为数据的一部分呈现。
-
视图可以隐藏数据的复杂性 。 例如,视图可以显示为Sales2000或Sales2001,透明地分区实际的基础表。
-
意见只占用很小的空间来储存 ; 数据库仅包含视图的定义,而不包含其呈现的所有数据的副本。
-
视图可以提供额外的安全性 ,这取决于所使用的SQL引擎。