我很久以前就读过某个地方.该书指出我们不应该允许在sql Server中使用嵌套视图.我不确定为什么我们不能这样做或者我可能记得不正确的陈述.
学生们
SELECT studentID,first_name,last_name,SchoolID,... FROM students CREATE VIEW vw_eligible_student AS SELECT * FROM students WHERE enroll_this_year = 1
老师
SELECT TeacherID,... FROM teachers CREATE VIEW vw_eligible_teacher AS SELECT * FROM teachers WHERE HasCert = 1 AND enroll_this_year = 1
学校
CREATE VIEW vw_eligible_school AS SELECT TOP 100 PERCENT SchoolID,school_name FROM schools sh JOIN vw_eligible_student s ON s.SchoolID = sh.SchoolID JOIN vw_eligible_teacher t ON s.SchoolID = t.SchoolID
在我的工作场所,我调查了一个内部数据库应用程序.我检查了发现的对象,其中有两层或三层视图堆栈.所以这让我想起过去读过的东西.任何人都可以帮忙解释一下吗?
如果不这样做,我想知道它仅限于sql Server,或者它通常用于数据库设计.
附加信息:
我更新了我公司的一个例子.如果没有太多的技术(在这个例子中有太多列),我会稍微改变一下.大多数情况下,我们使用的嵌套视图基于抽象或聚合视图.例如,我们有一个包含数百列的大型学生表.比如,符合条件的学生观点是基于今年入学的学生.符合条件的学生可以使用其他地方,例如存储过程.
解决方法
无论平台如何,以下评论均适用.
( – )嵌套视图:
>更难理解和调试
例如此视图列引用了哪些表列? Lemme dig through 4级视图定义……
>使查询优化器更难以提出最有效的查询计划
有关轶事证据,请参见this,this,this和this.与this相比,它显示优化器通常足够智能,可以正确解压缩嵌套视图并选择最佳计划,但不能没有编译成本.
您可以通过将视图查询与针对基表编写的等效查询进行比较来衡量性能开销.
()另一方面,嵌套视图让您:
>集中和重用聚合或业务规则
>摘要你的底层结构(比如,来自其他数据库开发人员)
我发现他们很少需要.
在您的示例中,您使用嵌套视图来集中和重用某些业务定义(例如“什么是符合条件的学生?”).这是嵌套视图的有效用法.如果要维护或调整此数据库,请权衡将其与删除数据库相比较的成本.
> Keep:通过保持嵌套视图,您可以获得上面列举的优缺点.
>删除:删除嵌套视图:
>您需要使用基本查询替换所有出现的视图.>如果您对符合条件的学生/教师/学校的定义发生变化,您必须记得更新所有相关查询,而不是仅更新相关的视图定义.