2013-07-03 33 views
1

我正在创建预订应用程序并尽可能地规范了数据库。我的问题是以下几点,我应该在数据库中创建视图,在我对WHERE子句中的组合视图进行选择性选择之前再次组合表,还是在将视图加入视图之前过滤表更好?规范化表,SQL联接和视图

编辑:包括的例子。

第一种方案首先创建组合视图,然后在组合视图执行SELECT(这个视图可能有数以千计的记录):

CREATE VIEW appc as 
SELECT * FROM appointment 
LEFT OUTER JOIN chair 
ON appointment.chair_idchair = chair.idchair 

SELECT * FROM appc 
WHERE chair_idchair = 1; 

第二种方案将第一过滤表的左的连接,然后创建基于过滤表的视图,那么连接将使用这种更小的观点提出:

CREATE VIEW appf as 
SELECT * FROM appointment 
WHERE chair_idchair = 1; 

SELECT * FROM appf 
LEFT OUTER JOIN chair 
ON appf.chair_idchair = chair.idchair 
+0

你可以举一个你想到的两种不同风格的例子吗? –

回答

1

它对MySQL没有什么不同。 MySQL(与其他一些RDBMS品牌不同)不会在视图本身中存储任何内容。想象一个更像宏观的MySQL视图。在大多数情况下,查询视图与执行您定义为视图的查询完全相同。

查询视图时,应用随后的条件在WHERE子句中与视图的查询相结合相当透明的,因为如果你写了完整的查询,并给它一个条件。

例外情况:您可以选择使用ALGORITHM=TEMPTABLE创建视图,强制它将视图的结果存储在临时表中,然后应用您在查询中指定的额外条件。在这种情况下,最好将条件构建到视图的查询中,以减少生成的临时表的大小。

请参阅http://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html了解更多详情。

+0

谢谢Bill,我现在明白了。 – georgelappies

1

一般来说,优化是非常聪明,而且可以通过正确的看构建查询计划时的视图。如果您试图通过预先选择某些数据来“帮助”优化程序,那么您可能会隐藏优化程序的信息,从而使其能够创建更智能,更优化的计划。