When to use a View instead of a Table?

When should a View actually be used over an actual Table? What gains should I expect this to produce?

Overall, what are the advantages of using a view over a table? Shouldn't I design the table in the way the view should look like in the first place?

123131 次浏览

如果需要从多个表中进行选择,或者只是为了获取表的子集,则视图非常方便。

您应该按照数据库为 很正常(最小重复)的方式设计表。这会使查询变得有些困难。

视图有一点分离,允许您以与存储表不同的方式 view表中的数据。

一种常见的做法是在视图中隐藏联接,以便向用户显示一个更加非规范化的数据模型。其他用途包括安全性(例如隐藏某些列和/或行)或性能(在物化视图的情况下)

意见可以:

  • 简化复杂的表结构
  • 通过允许您以更简单的方式筛选敏感数据和分配权限,可以简化您的安全模型
  • 允许您在不更改输出结构的情况下更改逻辑和行为(输出保持不变,但底层 SELECT 可能会发生显著更改)
  • Increase performance (Sql Server Indexed Views)
  • 使用视图提供特定的查询优化,否则可能难以收集

还有 不应将表设计为与视图匹配。您的基本模型应该关注数据的高效存储和检索。视图在一定程度上是一种工具,它通过允许您抽象复杂性来减轻高效、规范化模型所产生的复杂性。

此外,还要问“在表上使用视图有什么好处?”不是一个很好的比较。你不能没有桌子,但是你可以没有视图。他们的存在理由各不相同。表是具体的模型,视图是抽象的视图。

首先,正如名称所暗示的那样,视图是不可变的。这是因为视图只不过是从数据库中存储的查询创建的虚表。 正因为如此,你有一些观点的特点:

  • 您只能显示数据的一个子集
  • you can join multiple tables into a single view
  • you can aggregate data in a view (select count)
  • View 并不实际保存数据,它们不需要任何表空间,因为它们是基础表的虚拟聚合

so there are a gazillion of use cases for which views are better fitted than tables, just think about only displaying active users on a website. a view would be better because you operate only on a subset of the data which actually is in your DB (active and inactive users)

看看这个 文章

希望这对你有帮助。

哦,你需要考虑很多不同之处

选择意见:

  1. 视图提供对表的抽象。您可以轻松地在视图中添加/删除字段,而无需修改基础模式
  2. 视图可以轻松地对复杂连接建模。
  3. 视图可以向您隐藏特定于数据库的内容。例如,如果您需要使用 Oracle SYS _ CONTEXT 函数或许多其他东西进行一些检查
  4. 您可以轻松地直接在视图上管理 GRANTS,而不必管理实际的表。如果您知道某个用户只能访问一个视图,那么管理起来会更容易。
  5. 视图可以帮助您实现向后兼容性。您可以更改基础架构,但视图可以向特定客户端隐藏这些事实。

插入/更新视图:

  1. 可以直接在视图中使用 Oracle 的“ WITHCHECKOPTION”子句等功能来处理视图的安全问题

缺点

  1. 您将丢失有关关系(主键、外键)的信息
  2. 您是否能够插入/更新视图并不明显,因为视图对您隐藏了它的底层连接

当您需要确保每次都遵循复杂的逻辑时,视图是可以接受的。例如,我们有一个创建所有财务报告所需原始数据的视图。通过让所有报表都使用这个视图,每个人都是从同一个数据集工作,而不是一个报表使用一组连接,而另一个报表忘记使用一组连接,从而得到不同的结果。

如果希望将用户限制在特定的数据子集中,则视图是可接受的。例如,如果不删除记录,而仅将当前版本标记为活动记录,而将旧版本标记为非活动记录,则需要一个仅用于选择活动记录的视图。这样可以防止人们忘记在查询中放置 where 子句并得到不好的结果。

可以使用视图来确保用户只能访问一组记录——例如,某个特定客户端的表的视图和表上没有安全权限可能意味着该客户端的用户只能看到该客户端的数据。

视图在重构数据库时非常有用。

当使用视图调用可能导致糟糕性能的视图时(至少在 SQLServer 中) ,视图是不可接受的。我们几乎失去了一个价值数百万美元的客户机,因为有人选择这种方式抽象数据库,而且性能糟糕透顶,经常超时。我们也必须为修复付费,而不是客户端,因为性能问题完全是我们的错。当视图调用视图时,它们必须完全生成基础视图。我见过这种情况,视图被称为视图,视图被称为视图,为了看到用户最终需要的三个视图,生成了数百万条记录。我记得其中一个视图花了8分钟来做一个简单的记录计数(*)。视图称为视图是一个非常糟糕的想法。

视图通常不适合用来更新记录,因为通常只能更新同一个表中的字段(同样是 SQLServer,其他数据库可能有所不同)。如果是这种情况,直接更新表更有意义,这样您就知道哪些字段是可用的。

You should design your table WITHOUT considering the views.
除了保存连接和条件之外,视图还有一个性能优势: SQLServer 可以计算并在视图中保存其执行计划,因此比“动态”SQL 语句更快。
视图还可以简化您在字段级别的用户访问方面的工作。

根据 Wikipedia,

与表格相比,视图有许多优点:

  • 视图可以表示表中包含的数据 的子集。
  • 视图可以限制底层表对外部世界的暴露程度 : 给定的用户可能有查询视图的权限,同时拒绝访问基表的其余部分。

  • 视图可以将多个表 联接并简化为单个虚表。

  • 视图可以作为聚合表 ,其中数据库引擎聚合数据(总和、平均值等)并将计算结果作为数据的一部分呈现。

  • 视图可以隐藏数据的复杂性 。例如,视图可以显示为 Sales2000或 Sales2001,透明地对实际的基础表进行分区。

  • 视图只需要很少的空间来存储 ; 数据库只包含视图的定义,而不包含它所呈现的所有数据的副本。

  • 视图可以根据所使用的 SQL 引擎提供额外的安全性