이 장에서는 부적절하게 설계된 다른 소스에서 가져온 데이터로 작업을 할 때 손봐야 하는 부분을 다룬다. 외부 데이터의 제어권이 없으므로 데이터베이스 설계 내용을 변경할 수 없다. 직접 작성한 쿼리 일부를 변형해서 수행하는 방법과 객체를 생성하는 식으로 데이터 자체를 변형하는 방법을 알아보자.
BETTER WAY 18 설계를 변경할 수 없을 때는 뷰로 데이터를 간소화하자
뷰는 하나 이상의 테이블이나 다른 뷰에 SQL 쿼리를 미리 정의해 놓고는 테이블처럼 데이터를 볼 수 있는 객체다. 뷰를 사용해 역정규화에서 이슈 몇 가지를 개선할 수 있다.
뷰를 사용하는 이유를 정리하면 다음과 같다.
- 특정 데이터 집중 : 뷰로 특정 작업에 사용하는 특정 데이터에 집중할 수 있다.
- 컬럼 이름 간소화 또는 명료화 : 원래 컬럼 이름 대신 별칭을 사용해 좀 더 의미 있는 이름을 부여할 수 있다.
- 여러 테이블에 있는 데이터 통합 : 뷰로 여러 테이블 데이터를 결합해 논리적인 단일 레코드로 통합해서 볼 수 있다.
- 데이터 조작 간소화 : 뷰는 사용자가 데이터로 작업하는 방식을 간소하게 만들 수 있다. 예를 들어 보고서 데이터를 생성할 때마다 주요 쿼리를 작성할 필요없이 뷰를 사용할 수 있다.
- 중요 데이터 보호 : 테이블에 민감하고 중요한 데이터가 저장되어 있을 때 이 데이터를 뷰로 만들어 뺄 수 있다. 예를 들어 고객의 신용 카드 정보를 노출하는 대신 신용 카드 숫자를 변형해서 실제 숫자는 숨긴 채 기능을 수행하는 함수를 사용하는 뷰를 만들 수 있다.
- 하위 호환성 제공 : 하나 이상의 테이블 스키마를 변경해야 할 때 기존 테이블의 스키마와 동일한 뷰를 만들어 처리할 수 있다. 이렇게 하면 기존 애플리케이션은 원래 테이블 데이터를 조회하는 쿼리를 수정 없이 사용할 수 있다. 데이터를 조작할 때도 INSTEAD OF 트리거를 사용하면 주요 테이블의 뷰로 INSERT, UPDATE, DELETE 작업을 할 수 있다.
- 데이터 커스터마이징 : 뷰를 만들면 동일한 데이터를, 심지어 똑같은 시간에 다른 방식으로 보게 할 수 있다. 예를 들어 사용자의 로그인 ID 값에 따라 특정 사용자와 관련된 고객 정보를 조회하는 뷰를 만들어 사용할 수 있다.
- 요약 데이터 제공 : 집계 함수(SUM(), AVERAGE() 등)를 사용한 뷰로 데이터 일부분의 계산 결과 값만 볼 수 있다.
- 데이터 가져오기와 내보내기 : 뷰를 이용하면 다른 애플리케이션에 데이터를 내보낼 수 있다. 가져오기용 뷰를 만들면 주요 테이블에 있는 모든 컬럼이 아닌 필요한 컬럼 데이터만 가져와 사용할 수도 있다.
BETTER WAY 19 비관계형 데이터를 정보성 데이터로 변환할 때는 ETL을 사용하자
추출(Extract), 변환(Transform), 로드(Load)를 의미하는 ETL은 외부 소스에 있는 데이터를 추출한 후 관계형 설계 규칙이나 다른 요구 사항에 맞게 변환하고, 분석이나 다른 목적으로 사용하려고 데이터베이스에 로드하는 일련의 절차나 도구를 의미한다. 거의 모든 데이터베이스 시스템은 이런 처리를 지원하는 다양한 유틸리티를 제공한다. 이런 유틸리티는 꽤 빠르게 원시 데이터를 정보성 데이터로 변환해 준다.
ETL 도구를 사용하면 비관계형 데이터를 적은 노력으로도 데이터베이스로 가져올 수 있으며 데이터 형태를 변경하고 재배열해서 정보성 데이터로 탈바꿈할 수 있다. 흔히 저지르기 쉬운 실수는 읽어 오는 데이터에 맞춰 테이블을 만들고, 이 데이터를 애플리케이션에서 그대로 사용하는 것이다. 중요한 것은 도구들을 사용해 비즈니스가 요구하는 데이터 모델에 맞게 데이터를 변환하는 것이다.
BETTER WAY 20 요약 테이블을 만들어 관리하자
뷰를 이용하면 복잡한 쿼리를 단순화하고 데이터를 적절히 요약해 사용할 수 있다. 그런데 처리하는 데이터가 많다면 요약 테이블을 생성하는 것이 더 바람직할 수도 있다.요약 테이블을 생성하면 필요한 모든 데이터를 한 테이블로 모아 주므로 데이터 구조 파악이 쉽고 원하는 정보를 빠르게 파악할 수 있다.
트리거를 사용해 원본 테이블의 데이터가 변경될 때마다 요약 테이블의 데이터를 갱신하는 방법을 활용하면 가능하다. 하지만 원본 테이블이 빈번하게 변경된다면 많은 부하를 줄 수 있는 방법이기도 하다. (갱신이 잦을 경우 부하 발생)
또 다른 방법은 저장 프로시저를 사용해 주기적으로 요약 테이블을 갱신하는 것이다. 즉, 요약 테이블 데이터를 모두 삭제한 후 다시 요약 데이터를 생성하는 것이다.
SQL Server는 구체화된 뷰를 지원하지는 않지만 뷰에 인덱스를 만들어 비슷한 효과를 낼 수 있다. 따라서 비슷한 방식으로 인덱싱된 뷰를 사용할 수 있다.
요약 테이블에도 몇 가지 단점이 있다.
별도의 데이터를 저장하므로 저장 공간을 차지하고, 원본 테이블과 요약 테이블 간 데이터를 일관되게 유지하려면 관리 작업(트리거, 제약 조건, 저장 프로시저 등)이 필요하다. 또 스케줄을 만들어 요약 테이블 데이터를 갱신하도록 해야하고, 데이터의 주기적인 관리가 필요하다.
'도서 > SQL 코딩의 기술 (Effective SQL)' 카테고리의 다른 글
| 4장 데이터 필터링과 검색 (0) | 2024.08.12 |
|---|---|
| 2장 인덱스 설계와 프로그램적 처리 (0) | 2024.08.08 |
| 1장 데이터 모델 설계 (0) | 2024.08.06 |