视图如何减少代码重复?

时间:2010-04-13 14:58:54

标签: sql database views

我读过类似db视图的内容:

  

视图非常强大   有用的原因有一个突出   高于所有其他非常好的理由。   它们减少了代码重复。那是,   在大多数情况下,底线。如果一个   查询将使用三个或更多   地方,然后一个视图将大幅度   如果架构或简化您的更改   查询参数更改。我曾经不得不这样做   编辑22个存储过程进行更改   一些查询逻辑。如果是原件   然后,架构利用了观点   我本来只有三次改变。

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

祝你好运!

7 个答案:

答案 0 :(得分:4)

视图允许更改基础表结构,而不会影响应用程序查看数据的方式。因为视图通常代表跨越一个或多个表的更高级域概念(例如,当从“航班”,“票价”和“航空公司”表格构建时的“可用航班”视图),它们可以统一呈现复杂的想法方式。

由于在数据库中捕获了如何将原始数据库表转换为视图的逻辑,因此构造的复杂性不太可能到达您的应用程序。这意味着,如果您在许多地方使用Available Flights,然后对Flights表进行了更改,则只需要更改明确依赖Flights的部分,而不需要更改Available Flights 1}}。

出于这个原因,使用视图降低复杂性并将模式更改分解回数据库的风险被认为是一个好主意,因为它不会影响依赖应用程序。

答案 1 :(得分:1)

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

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

有关视图的最佳部分是您不限于单个表。因此,假设您有多对多关系的三个表 - user <-> user_to_role <-> role

您可以编写查询以获取用户及其相关角色:

选择     u.user_name,     r.role_name 从     用户你         INNER JOIN user_to_role ur ON ur.user_id = u.id.         INNER JOIN角色r ON r.id = ur.role_id;

现在使用上面的SQL定义(称为user_role_view)创建一个视图,然后执行:

在您的应用中

SELECT * FROM user_role_view并获得包含user_namerole_name列的结果集,所有这些列都正确关联: - )

如果使用得当,视图可以非常强大,并且非常有助于降低应用程序层的SQL查询的复杂性。

答案 2 :(得分:1)

简单地说,视图是由某个查询定义的虚拟表(即,您可以像查询表一样查询它)。他们减少代码重复的原因可以这样说明:

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

如果您使用的视图V绑定到SELECT C1 FROM T WHERE C2 = 'cow',您的语句看起来更像SELECT * FROM V - 那么您可以更改V而不是更改单个语句,从而做出一个改变,而不是几个。

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

答案 3 :(得分: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

现在,如果我们要创建一个VIEW,例如

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

视图是一个宏。没什么,没什么。

如果您开始在视图上加入视图,那么这些视图可能会被淘汰/扩展为服务器查杀。

它们具有一些用途,例如隐藏表架构更改以及索引/物化视图,但它们不是灵丹妙药。 “封装”你的代码是诱人的,但明智地使用

Is writing a query using Views a good strategy?

Tony Rogerson: VIEWS - they offer no optimisation benefits; they are simply inline macros - use sparingly

答案 6 :(得分: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

现在,只要需要订单信息,应用程序就可以自由选择此表中的记录。无需将行扩展,税收计算和连接逻辑编码到应用程序中。

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