SQL视图与数据库抽象(代码中)

时间:2011-06-15 13:51:56

标签: sql database-design views

我刚刚了解了SQL视图,看起来不错,但如果我将表连接到数据访问类,那么这不会完成同样的事情吗?你对此有何看法?我之前从未使用过视图,所以这对我来说都很新鲜。

6 个答案:

答案 0 :(得分:3)

请记住,并非所有命中数据库的应用程序都可能使用相同的数据访问类。它们也不用于出口或报告。如果你想要一致性,那些观点是抽象一些复杂事物(比如如何获得某些类型的财务信息)的更好的地方。但是,不要过分夸大事物来观察。视图不应该调用视图(至少在Sql Server中,但我也怀疑在其他dbs中),因为您必须实现所有底层视图以获取顶层的数据。这意味着要获得所需的三条记录,最终可能会最终实现数百万条记录。对于大型桌子,这可能会产生梦魇比例的性能问题。当需要修复某些内容时,调用视图调用视图的其他视图将成为一个真正困难的维护问题。

答案 1 :(得分:3)

视图的主要目的是抽象创建特定结果集的复杂性。在大型关系数据库中,您经常需要将多个表连接在一起以获取有用的数据。通过创建视图,任何客户端都可以访问它而无需访问您的数据库访问层。

此外,几乎所有RDMS都会通过缓存已解析的执行计划来优化视图。如果查询足够复杂,则在执行查询时可能会遇到大量的查询计划命中。但是,使用视图时,将在创建视图或首次使用视图时创建和保存查询计划。

视图对于保持向后兼容性也很有用。假设您有一个需要更改的表,但是很难一次更新所有客户端以使用新的表模式。您可以使用提供向后兼容性的旧表名创建视图。然后,您可以使用新架构创建新表。

答案 2 :(得分:1)

我认为视图的主要目的之一是简化复杂数据库(无论是星型模式/ OLTP)与另一层(用户/ OLAP多维数据集/报告界面)之间的接口。

我想我会说,如果可以通过多种方式访问​​您的数据库(MS Excel / .net应用程序),那么您可能希望使用SQL视图,因为它们可供所有人使用,否则如果您在c#(例如)中创建一个数据访问类,然后MS Excel人员就无法使用它。

答案 3 :(得分:1)

视图简单地说,减少了在sql查询中放在一起的所有连接的复杂外观。 因此,不是在30个表上执行连接,而是一个视图执行30个表连接,但之后可以在另一个视图/ sproc中重用,只需说:

SELECT * FROM myView

而不是:

SELECT...
FROM
...
INNER JOIN
...
INNER JOIN
...
INNER JOIN
...

它基本上隐藏了所有这些细节。这篇文章应该是一个很好的参考:http://www.craigsmullins.com/cnr_0299b.htm

关键是视图不是物理结构,它们只是数据库系统中一个或多个表的关系模型或“视图”。

答案 4 :(得分:1)

抽象到数据访问类的连接可能会为您提供相同的数据,但它可能不会为您提供相同的性能。

此外,对于大多数企业而言,数据库是共享资源。假设有些应用程序已经访问数据库而不能或不会通过您的数据访问类是明智的。假设某些未来的应用程序不能或不会通过您的数据访问类也是明智的。作为一个简单的例子,命令行界面和您使用的任何dbms的图形界面都不会使用您的数据访问类。

视图也是SQL数据库实现逻辑数据独立性的方式。将它们视为公共界面的一部分。

答案 5 :(得分:0)

视图可以由交互式SQL用户,报表编写者,OLAP工具和使用不同语言编写的应用程序共享,也可以由不与eahc其他人共享类的多个编程团队共享。

因此,这是数据库设计人员在整个数据用户社区内共享标准化查询的好方法。