2010-04-13 136 views
2

我读到分贝的观点是这样的:视图如何减少代码重复?

视图是令人难以置信的强大和脱颖而出 在其他所有的很好的理由原因之一 有用。 他们减少代码重复。即在大多数情况下, 的底线。如果 查询将在三个或更多 地方使用,那么视图将大大简化 的更改,如果模式或 查询参数发生变化。我曾经为 编辑22个存储过程来改变 的一些查询逻辑。如果原始的 体系结构已经使用了视图,那么 我只会有三个变化。

任何人都可以向我解释它是如何工作的,也许给我一些例子?

此致敬礼!

回答

0

http://msdn.microsoft.com/en-us/library/aa258253%28SQL.80%29.aspx

这里是介绍了创建视图的语法的链接。视图的其他好处之一是它们在服务器上而不是在客户端上执行。这意味着它们运行得比本地查询要快得多。

+0

查询也在服务器上执行。封装为视图的相同查询将花费相同的时间量运行(省略高级情况,如物化查询)。 – 2010-04-13 19:23:48

+0

-1,对不起,这个答案是不正确的,因为Larry Lustig已经指出的原因。 – 2010-04-13 21:02:16

+1

我想我应该澄清。当我在MS Access中进行开发时,视图比我在Access中生成的查询运行得更快。 – DoubleJ92 2010-04-14 15:57:44

4

视图允许基本表结构的改变,而不会影响您的应用程序是如何看待这些数据。由于视图通常代表跨越一个或多个表格(例如,从“航班”,“票价”和“航空公司”表格构建的“可用航班”视图)的更高级别域概念,因此他们可以在统一办法。

由于如何将原始数据库表到视图的逻辑在数据库中被捕获时,其结构的复杂性是不太可能达到您的应用程序。这意味着,如果你在很多地方使用Available Flights,然后讲讲Flights表更改,只有明确依赖Flights件需要改变,约Available Flights没有什么。

出于这个原因,它被认为是一个好主意,使用视图来降低复杂性和孤立打破架构更改回数据库,它不会影响到相关的应用程序尽可能多的风险。

+0

+1表示“允许底层表结构发生变化,而不会影响应用程序如何看待数据” – 2010-04-13 15:07:04

+1

只需要注意,如果您开始编写所有查询,并将多个视图连接在一起,则性能可能会变差。 – 2010-04-13 17:07:30

+0

视图提供物理数据存储与应用程序数据视图之间的抽象级别这一事实很重要,但仅部分涵盖视图减少重复的原因。 – 2010-04-13 19:14:26

1

视图就像一个预先确定的查询。您只需编写一个SELECT查询,该查询返回您的数据库表所需的列/数据 - 任何记录返回的查询都可以用作视图的基础。然后创建视图,将您编写的SQL查询作为视图的定义。

当您从视图中执行SELECT时,数据库引擎会执行您的查询并返回结果,就像您已完成SELECT column1, column2 FROM table一样。

有关意见的最好的部分是,你并不局限于单个表。所以想象一下,你有三个表在多对多的关系 - user <-> user_to_role <-> role

你可以写一个查询来获取用户和他们相关的角色:

选择 u.user_name, 河role_name FROM user u INNER JOIN user_to_role ur ON ur.user_id = u.id INNER JOIN role r ON r.id = ur.role_id;

现在创建使用上面的SQL定义(称为user_role_view)的图,然后你可以执行:在您的应用程序

SELECT * FROM user_role_view并获得包含user_namerole_name列的结果集,所有的链接正确:-)

正确使用时,视图可以非常强大,并且非常有助于降低应用程序层中SQL查询的复杂性。

1

简而言之,视图是由某个查询定义的虚拟表(也就是说,您可以查询它就像是表)。他们减少代码重复的原因可以这样解释:

假设你有一个带有列C1和C2的表T,然后,你在你的应用程序中有几个地方可以查询T:SELECT C1 FROM T WHERE C2 = 'cow'。有一天,您意识到cow不再是您查询所需的值,并且您想要更改为goat。要执行此更改,您需要找到每个SELECT语句并用goat替换cow

假若你是使用绑定到一个SELECT C1 FROM T WHERE C2 = 'cow'查看V,您的发言看起来更像SELECT * FROM V - 那么你可以改变V而不是改变个别报表,从而使一个变化,而不是几个。

MySQL reference提供了一些关于如何使用视图的很好的例子。

1

注意:下面的语句只是一个例子,实际上并不会因SELECT *而起作用。它只是显示可能的代码减少。

采取以下三个类似的查询。现在

SELECT 
    * 
FROM 
    Table1 
INNER JOIN 
    Table2 ON Table2.Id = Table1.Id 
INNER JOIN 
    Table3 ON Table3.Id = Table2.Id 
INNER JOIN 
    TableX ON TableX.Id = Table3.Id 

SELECT 
    * 
FROM 
    Table1 
INNER JOIN 
    Table2 ON Table2.Id = Table1.Id 
INNER JOIN 
    Table3 ON Table3.Id = Table2.Id 
INNER JOIN 
    TableY ON TableY.Id = Table3.Id 

SELECT 
    * 
FROM 
    Table1 
INNER JOIN 
    Table2 ON Table2.Id = Table1.Id 
INNER JOIN 
    Table3 ON Table3.Id = Table2.Id 
INNER JOIN 
    TableZ ON TableZ.Id = Table3.Id 

,如果我们要创造如

CREATE VIEW View123 AS 
SELECT 
    * 
FROM 
    Table1 
INNER JOIN 
    Table2 ON Table2.Id = Table1.Id 
INNER JOIN 
    Table3 ON Table3.Id = Table2.Id 

的三个查询现在可以写成

SELECT 
    * 
FROM 
    View123 
INNER JOIN 
    TableX ON TableX.Id = View123.Id 

SELECT 
    * 
FROM 
    View123 
INNER JOIN 
    TableY ON TableY.Id = View123.Id 

SELECT 
    * 
FROM 
    View123 
INNER JOIN 
    TableZ ON TableZ.Id = View123.Id 
0

次数减少代码的重复,因为面向数据的逻辑大量可以在视图的定义时被封装。由此产生的操作数据可以被应用程序访问,而不需要包括逻辑的应用程序,甚至不需要知道它。

例如,假设一个视图OrderDetailsEx:

CREATE VIEW OrderDetailsEx 
    (OrderID, OrderDate, ProductID, Description, 
    UnitPrice, Quantity, ExtendedPrice, Tax, TotalPrice) AS 
SELECT O.OrderID, O.OrderDate, D.ProductID, P.Description, 
    D.UnitPrice, D.Quantity, (D.Quantity * D.UnitPrice), 
    C.TaxRate, (C.TaxRate * D.Quantity * D.UnitPrice) 
FROM Orders O 
    INNER JOIN OrderDetails D ON O.OrderID = D.OrderID 
    INNER JOIN Products P ON P.ProductID = D.ProductID 
    INNER JOIN Customers C ON C.CustID = O.CustID 

现在,应用程序是免费的,只要是需要的订单信息,从该表中选择的记录。不需要将线路扩展,税收计算和连接逻辑编码到应用程序中。

如果仅将此信息用于一个位置,则表示您已将逻辑从应用程序重新定位到数据库。但是,这些信息的使用很可能在整个应用程序中分散并重复 - 在购物模块中,打印发票时,打印报表时,检查帐户时等等。如果这是真的,那么你已经消除了所有重复的逻辑,并将其粘在数据库中的单个声明性语句中。