뷰
뷰는 일종의 테이블이다. 하지만 그 스키마와 데이터가 저장되는 것이 아니라, 뷰 정의에 따라 계산된다.
따라서 이름 그대로 한 테이블에 대한 '뷰', 관점을 저장하는 것과 같다.
뷰는 다음과 같이 생성한다.
CREATE VIEW YoungActiveStudents(name, grade)
AS SELECT S.name, E.grade
FROM Students S, Enrolled E
WHERE S.sid = E.sid AND S.age > 21
AS 절 이후에 이 뷰의 정의를 SQL 형식으로 적으면 된다.
그래서 어떻게보면 뷰는 일종의 함수처럼 생각하여 그때 그때 계산하는 값으로 볼 수 있다.
뷰는 기본 테이블(데이터베이스에 저장된 실제 테이블)처럼 사용될 수 있다.
따라서 다른 뷰를 정의할 때 사용될 수도 있고, 그냥 일반적인 쿼리를 날릴 때 From 절에 담아서 사용할 수도 있다.
뷰를 삭제할 때는 테이블을 지우듯이 DROP VIEW 를 해주면 된다.
그런데 만약 어떤 테이블을 참조하는 뷰가 있을 때 그 테이블을 지우려고 하면 어떻게 될까?
이때는 기본적으로는 테이블을 지울 수 없고, 테이블을 지우고자 한다면 CASCADE 옵션을 걸어서 참조하는 뷰까지 같이 지워지도록 해야한다.
데이터 독립성과 보안
뷰는 데이터 독립성과 보안 목적으로 사용하기 좋다.
먼저 데이터 독립성 관점에서 보면, 뷰는 데이터베이스의 추상화 단계에서 제일 위에 있다.
(외부 스키마 - 개념 스키마 - 물리 스키마) 단계에서 외부 스키마에 속한다.
외부 스키마는 개념 스키마와는 독립된 개념이며, 개념 스키마에서 변경이 발생하면 외부 스키마에 반영되므로 직접 개념 스키마를 조회하지 않고도 외부 스키마를 통해 변경 사항을 조회할 수 있다.
보안 목적으로는 어떤 사용자 그룹에 대해서 특정 필드를 조회할 수 없도록 하고 싶은 경우에는 해당 필드를 제외하고 조회하는 뷰를 대신 제공하여 해당 뷰를 기반으로 데이터를 조회하도록 할 수 있다.
뷰에 대한 갱신
처음에는 뷰는 그저 기본 테이블에 대해 실행한 쿼리의 결과물 복사본 정도로 생각했기 때문에, 뷰에 대해서는 갱신이 절대 이루어질 수 없다고 생각했다.
하지만 뷰도 기본 테이블처럼 From 절에 들어갈 수 있으므로, 기본 테이블 다루듯이 레코드를 다룰 수도 있다고 한다.
CREATE VIEW TEST(sid, sname)
AS SELECT S.sid, S.sname
FROM sailors S;
INSERT INTO TEST (sid, sname) VALUES (1000, 'test');
실행을 해보니 실제로 이렇게 했을 때 Sailors 테이블에 데이터가 추가되었다. (age, rating 속성은 null이 들어간다.)
그런데 항상 뷰를 갱신할 수 있는 것은 아니다.
SQL-92 표준에서는 단일 기본 테이블을 대상으로, aggregation 연산을 사용하지 않고 where, select 절만 사용하여 정의된 뷰에 대해 갱신 (update) 이 가능하도록 명시하였다.
이런 제한을 걸어둔 데에는 이유가 있는데, 다음과 같은 상황을 생각해보자.
먼저 동아리 테이블과 학생 테이블을 다음과 같이 정의해보자.
Clubs(cname : string, jyear: date, mname: string)
Stududent(sid: integer, login: string, name: string)
사실은 물론 Clubs 테이블의 mname 이 학생 한명을 식별할 수 있는 후보키가 아니지만, 이렇게 설계하는 것이 아예 불가능 한 것은 아니다. (외래키는 아니지만 어떻게든 조인을 걸려면 걸 수 있다.)
그리고 이렇게 정의한 상태에서 다음과 같은 뷰를 만들었다고 해보자.
CREATE VIEW ActiveStudents(name, login, cname, since)
AS SELECT S.name, S.login, C.cname, C.jyear
FROM Students S, Clubs C
WHERE S.name = C.mname AND S.gpa > 3
학생과 동아리 테이블을 조인한 뒤, 이름이 같은 학생으로 묶어서 조회하였다.
그리고 각각의 테이블과 뷰 실행 결과가 위와 같다고 해보자.
만약 뷰에서 (Smith, smith@ee, Hiking, 1997) 튜플을 삭제하고 싶다면 어떻게 해야할까?
뷰는 기본적으로 다른 테이블에 대한 실행 결과이므로, 기본 테이블의 데이터를 조작하여 변경하는 것이 바람직하다.
따라서 기존 테이블의 데이터를 삭제하여 뷰에 대한 데이터를 삭제하려는 경우, 동아리 테이블에서 삭제하거나, 학생 테이블에서 삭제하거나, 둘 모두에서 삭제하여 뷰의 조회 내용을 바꾸는 방법이 있을 것이다.
그런데 만약에 동아리 테이블에서 데이터를 삭제하기 위해 (Hiking, 1997, Smith) 튜플을 삭제하는 경우, 뷰에서는 (Smith, smith@math, Hiking, 1997) 이라는 데이터도 함께 삭제되어 버린다.
따라서 동아리 테이블에서 데이터를 삭제하는 것은 의도된 결과를 가져오지 않는다.
학생 테이블에서 삭제해도 마찬가지이다.
만약 (53688, Smith, smith@ee, 18, 3.2) 튜플을 삭제한다면, 뷰에서는 (Smith, smith@ee, Rowing, 1998) 튜플 역시 함께 삭제할 것이다.
따라서 뷰에 대해서는 갱신이 가능한 상황이 있고, 불가능한 상황이 있다.
'CS > 기초데이터베이스' 카테고리의 다른 글
[데이터베이스] 11. 관계 대수 연습 문제 (0) | 2024.10.19 |
---|---|
[데이터베이스] 10. 관계 대수 (0) | 2024.10.19 |
[데이터베이스] 8. 논리적 데이터베이스 설계 (1) | 2024.10.16 |
[데이터베이스] 7. Relational Model 기본 개념 (1) | 2024.10.16 |
[데이터베이스] 6. 개념적 데이터베이스 설계 (0) | 2024.10.14 |