April 18, 2020
어떤 경우에는 데이터베이스 사용자에게 테이블안에 있는 모든 정보를 다 보여주는게 좋지 않을 수도 있다. 예를 들어, 회사의 사원 데이터베이스를 누구나 조회해서 이름과 직무를 확인하게 할 수는 있지만, 사원번호, 연봉 등은 공유되지 않게 하고싶을 수도 있다. 그리고 이런 테이블이 꽤나 자주 사용될 수도 있다고 하자.
이런 경우에 View 를 이용하면 실제로 저장되어 있는 테이블 처럼 보이지만, 물리적으로 존재하지는 않은 가상 테이블을 만들어 사용할 수 있다.
developers
| id | name | age | job | salary |
|---|---|---|---|---|
| 1 | 여훈 | 26 | FE | 3000 |
| 2 | 운이 | 24 | BE | 3500 |
| 3 | 현기 | 21 | DO | 2700 |
| 4 | 국인 | 22 | FE | 3000 |
| 5 | 수윤 | 22 | BE | 2700 |
앞서 글로 설명했던 예시 테이블에서 view 를 만든다고 하자. 우리는 이 테이블에서 salary, age 정보를 숨기고 id, name, job 만 보여주길 원한다고 하자.
CREATE VIEW devlist AS
SELECT id, name, job
FROM developers;이렇게 쿼리를 사용하면, developers 테이블에서 id, name, job 만 뽑아서 View 가 만들어진다. 이제 devlist 라는 이름을 사용하면, 마치 물리적으로 저장된 테이블을 사용하는 것 처럼 view 로 만들어진 테이블을 사용하는 것이 가능하다.
일반 테이블에 쿼리문을 사용하는 것 처럼 view 를 통해서 새로운 view를 만들어낼 수도 있다.
View 는 일반적으로 이미 attribute들이 필터되어 있는 상태이기 때문에 새로운 정보를 다시 필터할 때 쿼리문이 매우 단순해지고 관리가 쉬워진다.
CREATE VIEW devlist AS
SELECT id, name, job
FROM developers;위에서 만들었던 developers view를 이용해서 새로운 view를 만들어보자. 우리는 여기서 FrontEnd 로 일하고 있는 개발자들의 정보만을 가진 view를 만들어보자.
CREATE VIEW FElit AS
SELECT *
FROM devlist
WHERE job = 'FE';기존의 developers 테이블을 통해서 만들었다면, 몇가지 조건이 더 추가되어서 복잡한 쿼리문 처럼 보였겠지만, 이렇게 하니 쿼리문이 단순해졌다. 지금은 테이블 내에 정보가 많지 않기 때문에 편리성을 크게 느끼지 못할 수도 있겠지만, 여러 정보들로 얽히고 섥힌 테이블들을 정보를 필터할 때는 view의 사용이 더 용이할 수도 있다.
View expansion은 어떤 view 가 다른 view 를 통해서 만들어졌을 때, 소스가 된 view 를 기존 쿼리로 펼쳐서 해당 view가 의믜하는 것이 무엇인지 파악하는 방법이다. 조금 복잡한 예시가 필요하기에 교수님이 주신 예제 쿼리를 사용해보도록 하겠다.
CREATE VIEW physics_fall_2017_watson AS
SELECT course_id, room_number
FROM physics_fall_2017
WHERE building='Watson';physicsfall2017 이라는 view가 이미 만들어져 있고, 해당 테이블에는 2017년에 열린 물리학 수업 정보가 들어가 있다고 해보자. 그리고 위 쿼리는 해당 view에서 Watson 건물에서 열린 수업을 모두 필터하는 새로운 view를 만드는 쿼리이다.
View expansion은 위 쿼리에서 소스로 사용된 view 인 physicsfall2017 을 해당 view를 만들기 위해 사용됐던 쿼리로 펼치는 것을 의미한다. 따라서 위 쿼리에 view expansion 을 적용하면 다음과 같은 쿼리가 완성된다.
CREATE VIEW physics_fall_2017_watson AS
SELECT course_id, room_number
FROM (
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 = '2017')
WHERE building='Watson';이렇게 physicsfall2017 이라는 view가 쿼리문으로 펼져졌다.
View 에는 두 가지 종류가 있다.
Materiallized view 는 실제로 데이터베이스에 물리적으로 저장이 된다. 만약 어떤 복잡한 연산이 요구되는 쿼리가 빈번하게 사용된다면, 해당 쿼리의 결과를 미리 만들어두고 계속 사용하는 편이 더 효율 적일 수도 있다. Matreialize View는 쿼리의 결과를 저장해두기 때문에 반복되는 연산을 여러번 할 필요가 없게 한다.
하지만 단점도 존재하는데, Materialized View를 만들때 사용된 소스가 업데이트 된다면, 더 이상 Materilaized view 가 가지고 있는 결과가 의미가 없어진다는 것이다. 따라서 Materialized view 를 만드는데 사용된 데이터가 업데이트 될 때, 새로 Materialized view 를 다시 만들어 값을 함께 업데이트 시켜주는 것이 일반적이다.
view 도 일종의 테이블이기 때문에 새로운 tuple을 추가하거나 값을 갱신하는 것이 가능하다. 하지만 대부분의 View 는 단순한 쿼리로 만들어져 있는 view 에 대한 연산만을 허용하는데, 일반적으로 그 조건은 다음과 같다.