갱신과 데이터 모델

양시준·2022년 2월 21일
0

SQL 레벨업

목록 보기
9/10
post-thumbnail

9장 갱신과 데이터 모델

SQL 레벨업이라는 도서를 정리한 내용입니다.

갱신

다양한 조건, 상황에서 여러가지 방법으로 갱신하는 법에 대해서 다룹니다.

  • NULL 채우기
    • 반대로 NULL을 작성
  • 레코드에서 필드로 갱신
  • 필드에서 레코드로 갱신

INSERT와 UPDATE 중 어떤 것이 좋을까?

갱신을 하는 방법에는 INSERT를 사용하는 방법과 UPDATE를 사용하는 방법이 있다.

INSERT를 사용하면 일반적으로 UPDATE에 비해 고속 처리를 기대할 수 있다. 그리고 MySQL과 같이 자기 참조를 허가하지 않는 데이터베이스에서도 사용할 수 있다.

하지만 단점은 같은 크기와 구조를 가진 테이블을 두 개 만들어야 한다는 것이다. 따라서 저장소 용량은 2배 이상 소비한다. 하지만 저장소 용량이 낮아지는 것을 생각하면 큰 단점은 아니다.

또 다른 방법이 있는데 바로 뷰를 사용하는 것이다. 이는 저장소 용량을 절약하며, 정보를 항상 최신으로 유지할 수 있다는 장점이 있다. 하지만 호출할 때마다 연산이 수행되므로 접근하는 쿼리의 성능이 낮아진다.

갱신이 초래하는 트레이드 오프

주문 하나에 대응하는 주문 테이블과 주문된 제품 하나에 대응하는 주문 명세 테이블이 있다.

주문 테이블의 주문일과 상품의 배송 예정일이 3일 이상 차이가 나면 주문자에게 배송이 늦어지고 있다는 연락을 하고 싶다고 한다.

SQL을 사용하는 방법

코드 생략

모델 갱신을 사용하는 방법

SQL 구문을 사용하는 것이 무조건 최적의 해답은 아니다. 이 문제는 'SQL에 의지하지 않고'도 해결할 가능성이 있다.

주문 테이블에 배송 지연 플래그 필드를 추가하고, 검색 쿼리는 해당 플래그만을 조건으로 삼으면 매우 간단하게 해결할 수 있다.

SQL을 사용해 해결하려는 것 말고도 다른 해결 방법이 있다는 것을 생각해야 한다.

모델 갱신의 주의점

높아지는 갱신 비용

위 내용을 예시로 들면 주문 테이블의 배송 지연 플래그 필드에 값을 넣는 처리가 필요하다. 이는 검색 부하를 갱신 부하로 미루는 꼴이다.

만약 주문 테이블에 레코드를 등록할 때 이미 플래그가 정해져 있다면 갱신 비용은 거의 올라가지 않지만, 현실적으로는 주문 접수 시점에 배송 예정일이 정해져 있지 않는 경우가 대부분일 것이다. 따라서 UPDATE를 해야 하므로 갱신 비용이 올라간다.

갱신까지의 시간 랙(Time Rag) 발생

주문 테이블의 배송 지연 플래그 필드와 주문 명세 테이블의 배송 예정일 필드가 실시간으로 동기화되지 않으므로 차이가 발생할 수 있다.

특히 야간 배치와 같이 일괄 처리를 한다면 시간 랙은 더 길어진다. 실시간성을 높이게 되면 위 그림에서 3과 4의 간격이 짧아져야 한다. 완전한 실시간성을 요구하는 경우는 3과 4가 동일한 트랜잭션으로 처리되어야 한다. 하지만 이는 성능과 실시간성 사이에 심각한 트레이드 오프가 발생한다.

모델 갱신비용 발생

RDB 데이터 모델 갱신은 코드 기반의 수정에 비해 대대적인 수정이 요구된다. 하지만 실무에서는 모델 갱신이 거의 불가능한 상황이 많다.

profile
야크 털 깎기와 러버덕 디버깅을 좋아하는 개발자

0개의 댓글