데이터베이스를 설계할 때 테이블을 비공개로 유지하고 사용자가 뷰 집합을 통해서만 데이터에 접근할 수 있게 할 수 있다.
-- E-mail 정보를 마스킹하는 과정
create view customer_vw
(customer_id,
first_name,
last_name,
email
)
as
select customer_id, first_name, last_name,
concat(substr(email, 1, 2), '*****', substr(email, -4)) email
from customer;
뷰는 데이터를 사전 집계하여 데이터베이스에 저장하는 것처럼 보일 수 있는 좋은 방법이다.
미리 조인된 결과를 뷰에 저장하는 방식은 적절하게 활용하면 복잡한 쿼리를 단순화하고 성능을 향상시키는 데 도움이 된다.
하지만 데이터의 갱신 빈도와 성능 요구사항에 따라 일반 뷰와 Materialized View 중 적합한 방식을 선택하는 것이 중요하다.
만약 뷰에 있는 데이터를 일부 수정해야된다면 어떻게 해야할까?
뷰를 생성했던 원시 테이블에서 데이터를 수정하고 다시 뷰를 만들어야할까?
MySQL의 경우 다음 조건이 충족되면 뷰를 업데이트할 수 있다.
- max(), min(), avg() 등의 집계 함수가 사용되지 않았다.
- group by 또는 having 절을 사용하지 않는다.
- select 또는 from 절에 서브쿼리가 없으며 where 절의 서브쿼리는 from 절의 테이블을 참조하지 않는다.
- union, union all 또는 distinct를 사용하지 않는다.
- from 절에는 최소 하나 이상의 테이블 또는 갱신 가능한 뷰가 포함되어야 한다.
- from 절은 테이블이나 뷰가 둘 이상 있는 경우 inner 조인만 사용한다.
따라서 위 예제에서 이메일을 마스킹한 경우, 표현식을 사용했기 때문에 수정할 수 없다.