관계형 데이터베이스: 뷰, Views
이 글에서는 University Database가 사용된다.
View는 일종의 Virtual Relation이라고도 하며 이것과 반대되는 말인 Actual/Base relation은 실제적으로 존재하는 relation을 말한다.
DB에 저장되어 있는 relation을 actual/base relation이라고 하며, 물리적으로 저장되어 있다. view는 가상의 relation으로 실제로 존재하지 않으며 actual relation을 기반으로 한다.
모든 데이터를 보게 하는 것이 바람직하지 않을 때 이 view라는 메커니즘을 사용한다.
뷰는 다음과 같이 정의할 수 있다.
CREATE view (뷰 이름) AS (뷰에 대한 정의 SQL 쿼리문);
다음 쿼리는 교수 테이블에서 salary속성을 제외한 myProfessor라는 뷰를 생성한다.
CREATE view myProfessor AS
SELECT pID, name, deptName
FROM professor;
뷰는 Base Relation을 기반으로 하고있기 때문에 항상 최신의 데이터를 가지고 있다. (up to date)하다.
그리고 이미 생성된 뷰를 통해서 다른 뷰를 생성할 수도 있다.
쿼리문 안에 있는 view는 DB System이 View Expansion이라는 과정을 통해서 처리한다.
뷰를 포함하는 쿼리문이 있을 때, 쿼리문에 포함되는 모든 view를 정의된 쿼리로 치환해서 해결하는 것이다.
CREATE view myFaculty AS
SELECT pID, name, deptName
FROM professor
WHERE salary > 50000;
CREATE view myFacultyCS AS
SELECT pID, name
FROM myFaculty
WHERE deptName = 'CS';
위 쿼리문에서 myFacultyCS라는 뷰를 만들 때, myFaculty라는 뷰로부터 만드는데, 이때 myFaculty부분이 데이터베이스 시스템에 의해서 myFaculty를 정의하는 쿼리문으로 바뀌는 것이다.
이러한 뷰를 통해서 뷰의 데이터를 바꾸면 실제 테이블(Base Relation)도 변경될까? 정답은 '그렇다'이다. view는 가상의 relation이긴 하지만, Base Relation을 기반으로 하고 있으므로, view를 통해서 Base Relation을 변경할 수 있는 것이다.
하지만 몇몇 경우에는 데이터를 변경할 수 없다.
- Base Relation이 여러개인 경우
위와 같은 경우 Base Relation이 professor, department 두 가지이기 때문에 수정이 일어났을 경우 deptName속성의 값을 결정할 수 없다.CREATE view professorInfo AS SELECT pID, name, building FROM professor, department WHERE professor.deptName = department.deptName;
- 집계 함수를 사용한 경우
집계 함수를 사용하였기 때문에 해당 뷰의 내용을 바꾼다고 하면 기존 professor 테이블의 교수 이름에 대한 정보와 연봉에 대한 정보도 결정할 수 없다.CREATE view departmentTotalSalary(deptName, totalSalary) AS SELECT deptName, SUM(salary) FROM professor GROUP BY deptName;
- distinct가 포함된 경우
- GROUP BY나 HAVING절이 포함된 경우
등이 있다. 그리고 만약 뷰에는 포함되지 않은 속성이 있을 때, 뷰의 튜플을 변경하게 되면, 뷰에 없는 속성은 null로 채워진다.
다음 쿼리를 보자.
CREATE view CSProfessor AS
SELECT *
FROM professor WHERE deptName = 'CS';
INSERT INTO CSProfessor VALUES ('255', 'Brown', 'EE', 100000);
교수 중 CS학과인 교수만을 추출한 뷰인 CSProfessor를 만들었고, 뷰에 튜플을 삽입하고 있다.
오직하나의 Base Relation을 가지고, 집계 함수도 사용하지 않았으므로 튜플을 추가하는데 아무 문제가 없어 보이지만, CS학과 교수만을 추출한 뷰에 EE학과의 교수를 추가하고 있는 것을 볼 수 있다. Syntax상에서는 문제가 없지만 Semantic상에 문제가 있는 것이다.
사용자가 WITH CHECK OPTION을 추가해주면, 이러한 semantic한 부분도 데이터베이스 시스템이 체크해준다.