4.2 视图

4.2 视图

在上面的所有例子中,我们一直都在逻辑模型层操作,即我们假定了给定的集合中的关系都是实际存储在数据库中的
让所有用户都看到整个逻辑模型是不合适的。出于安全考虑,可能需要向用户隐藏特定的数据。考虑一个职员需要知道教师的标识姓名所在系名,但是没有权限看到教师的工资值。此人应该看到的关系由如下SQL语句所描述:

1
2
select ID,name,dept_name
from instructor;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> select ID,name,dept_name
from instructor;
+-------+------------+------------+
| ID | name | dept_name |
+-------+------------+------------+
| 10101 | Srinivasan | Comp. Sci. |
| 12121 | Wu | Finance |
| 15151 | Mozart | Music |
| 22222 | Einstein | Physics |
| 32343 | El Said | History |
| 33456 | Gold | Physics |
| 45565 | Katz | Comp. Sci. |
| 58583 | Califieri | History |
| 76543 | Singh | Finance |
| 76766 | Crick | Biology |
| 83821 | Brandt | Comp. Sci. |
| 98345 | Kim | Elec. Eng. |
+-------+------------+------------+
12 rows in set (0.04 sec)

除了安全考虑,我们还可能希望创建一个比逻辑模型更符合特定用户直觉的个人化的关系集合。我们可能希望有一个关于Physics系在2009年秋季学期所开设的所有课程段的列表,其中包括每个课程段在哪栋建筑的哪个房间授课的信息。为了得到这样的列表,我们需要创建的关系是:

1
2
3
4
5
6
select course.course_id, sec_id, building, room_number
from course,section
where course.course_id=section.course_id
and course.dept_name ='Physics'
and section.semester = 'Fall'
and section.year =2009;
1
2
3
4
5
6
7
8
9
10
11
12
mysql> select course.course_id, sec_id, building, room_number
from course,section
where course.course_id=section.course_id
and course.dept_name ='Physics'
and section.semester = 'Fall'
and section.year =2009;
+-----------+--------+----------+-------------+
| course_id | sec_id | building | room_number |
+-----------+--------+----------+-------------+
| PHY-101 | 1 | Watson | 100 |
+-----------+--------+----------+-------------+
1 row in set (0.04 sec)

我们可以计算出上述查询的结果并存储下来,然后把存储好关系提供给用户。
但如果这样做的话,一旦instructorcoursesection关系中的底层数据发生变化,那么所存储的查询结果就不再与在这些关系上重新执行查询的结果匹配。一般说来,对像上例那样的查询结果进行计算并存储不是一种好的方式(尽管也存在某些例外情况,我们会在后面讨论)。

虚关系

相反,SQL允许通过查询来定义”虚关系”,它在概念上包含查询的结果。
虚关系并不预先计算并存储,而是在使用虚关系的时候才通过执行查询被计算出来

什么是视图

任何像这种**不是逻辑模型的一部分,但作为虚关系对用户可见的关系称为视图(view)**。
在任何给定的实际关系集合上能够支持大量视图。