데이터베이스 발표자료 본문

카테고리 없음

데이터베이스 발표자료

violet4795 2019. 10. 5. 02:16

비정규화 vs 정규화 데이터베이스

 

  • 비정규형 모델은 정규화를 하지 않은 모델이 아니라, 정규화를 마친 후에 비정규화를 한 모델이다.
  • 비정규화(Denormalization)는 조회 성능을 향상시키기 위해 데이터를 중복하거나 그룹핑하는 과정을 의미한다.

  • 비정규형을 사용하는 유일한 목적은 조회성능을 향상시키기 위해서다.
  • 단순히 조인(Join)을 피하고자,사용의 편이를 위해 중복 속성을 사용해선 안 된다.
  • 중복된 데이터는 원천 데이터와 정합성을 맞춰야 해서 사용하기 편하지 않다.
  • 무조건 빠른 것보다는 문제가 없고 정확한 데이터를 선호하고 있다.

정규화를 하면 좀 더 논리적인 모델을 얻을 수 있지만...

 

만약 LG시스템 내의 출장자 정보를 가진 테이블이 있다고 하자.

 

누가 갔는지는 알야아하니 사번과 출장번호를 묶어 기본키로 잡았다.

 

하지만 이름은 넣지 않았다. 이미 사번-이름 대칭하는 사원테이블이 있기때문.

 

그러나... 사원의 수는 약 20만명이 넘는다고하고, 출장자 데이터는 단순히 100만건이 넘을때 이를 전부 조인한다...

 

는 것은 너무 고코스트의 작업이다.

 

아무리 인덱싱을 하던 말던 간에 인덱스와 힌트도 결국 공간을 차지하는 작업이고 힌트 등은 데이터의 연산이 들어갔을 때 제대로 동작하지 않는 단점이 있다.

 

이 경우에 차라리 출장데이터 하나에 이름처럼 거의 매번쓰이는 데이터 정도는 

 

중복이 되더라도 같이 싣는 경우가 종종 보인다.

 

 

 

 

 

 

Apartments (아파트) Buildings ( 건물 ) Requests
AptID int BuildingID int RequestID int
UnitNumber varchar(10) ComplexID int Status varchar(100)
BuildingID int BuildingName varchar(100) AptID int
    Address varchar(500) Description varchar(500)

 

Complexes ( 단지 ) AptTenants Tenants (거주자)
ComplexID int TenantsID int TenantID int
ComplexName varchar(100) AptID int TenantName varchar(100)

 

14.1 하나이상의 집

하나이상의 집을 대여한 모든 거주자의 목록을 구하는 SQL문 작성

더보기

 

아파트 는 건물에 속하고 건물은 단지에 속한다.

 

SELECT              T.tenantName

FROM               Tenants T

INNER JOIN

      (SELECT       TenantID

      FROM         AptTenants

      GROUP BY   TenantID

      HAVING       count(*) > 1) C

ON                   Tenants.TenantID = C.TenantID

 

 

14.2 Open 상태인 Request : 모든 건물 목록과 Status가 Open인 모든 Request의 개수를 구하라.

 

더보기

먼저 request의 상태가 open인놈들부터 buildingID와 count만 뽑아내고

 

 

( SELECT          a.BuildingID, count(*) AS 'Count'

FROM            Requests r

INNER JOIN    Apartments a

ON               r.AptID = a.AptID

WHERE          Requests.Status = 'Open'

GROUP BY      a.BuildingID ) ReqCounts

 

조인을합니다

 

SELECT BuildingName, ISNULL(Count, 0) AS 'Count'

FROM  Buildings 

LEFT JOIN 

      ( SELECT          a.BuildingID, count(*) AS 'Count'

        FROM            Requests r

        INNER JOIN    Apartments a

        ON               r.AptID = a.AptID

        WHERE          Requests.Status = 'Open'

        GROUP BY      a.BuildingID ) ReqCounts

ON ReqCounts.BuildingID = Buildings.BuildingID

 

 

14.3 Request를 Close로 바꾸기 : 11번 빌딩에서 대규모 리모델링 공사를 진행 중이다.

이 건물에 있는 모든 집에 대한 모든 Request의 Status를 Close로 변경해주는 질의문 작성하라

 

더보기

UPDATE Requests

SET       Status = 'Closed'

WHERE  AptID IN ( SELECT AptID 

                          FROM  Apartments

                          WHERE BuildingID = 11 )

 

 

14.4 서로 다른 JOIN의 종류에는 어떤 것들이 있는가? 각각이 어떻게 다르고, 어떤 상황에서 어떤 JOIN과 어울리는지 설명하라. 

 

 

INNER JOIN     -- 조건에 부합하는 데이터만 결과 집합에 포함된다.

OUTER JOIN

 -LEFT OUTER JOIN ( LEFT JOIN ) 왼쪽 데이터의 모든 데이터가 조회된다.

                                            매칭되지 않은 데이터들의 값은 NULL로 채워진다.

 -RIGHT OUTER JOIN ( RIGHT JOIN ) 오른쪽 데이터의 모든 데이터가 조회된다.

                                            매칭되지 않은 데이터들의 값은 NULL로 채워진다.

 -FULL OUTER JOIN ( FULL JOIN ) 양쪽 데이터의 모든 데이터가 조회된다.

                                            거의 안 쓰인다.

 

14.5 비정규화란 무엇인가 장단점을 설명하라.

 

장점 : 성능때문

오로지 성능때문이다.

JOIN은 고코스트 연산이다.

데이터베이스에서는 인덱스와 힌트라는 스캔에 도움을 줄 수 있는 기능을 제공하는데

해당 기능이 없다면..

1억건과 10건의 데이터만 단순 조인하면 10억건의 조회도 이루어 질 수 있다.

 

인덱스 남발

인덱스와 힌트도 다른 메모리에 저장되어있고

 

인덱스가 잡힌 컬럼을 연산하려면 새로 인덱스를 잡아줘야하는 점등등.. 때문에

 

차라리 데이터중복을 감안하더라도, 1억건의 데이터에 컬럼하나 추가해서 만드는것이 이득인 셈.

 

그래서 비정규화를 하는 것이다. 하지만 비정규화라고 무조건 성능이 좋아지지는 않는다. 

 

 

7.3. 비정규형의 단점

  • 정합성
    • 비정규화 > 데이터중복 > 정합성 훼손 > 품질저하
  • 쓰기성능 저하
    • 중복 자료 : 읽기 성능 향상
    • 정합성 일치 : 쓰기 성능 저하
  • 데이터 성격이 불명확

  • 모델 확장성 저하
    • 군더더기가 많은 비정규형을 수정하는 것은 어려워 확장성이 떨어진다.
  • 개발 어려움
    • 조인이 줄어 조회 성능 및 개발이 쉽다?
    • 중복 데이터의 정합성을 맞추기 위한 개발의 난이도가 높고
    • 유지보수시 확장성이 떨어져 시스템은 점점 누더기가 되고
    • 후회하는 시점에 정규화를 도입하려고 해도 쉽지 않다.
  • 공간차지
    • 중복 데이터의 공간 차지 > 성능 저하
  • 일부 조회성능 저하
    • 데이터를 빨리 조회하기 위해 선택한 비정규형 > 성능 저하의 원인이 될 수 있다.
    • 많은 중복 속성 > 인스턴스의 길이 증가 > 블럭의 증가

 

 

데이터베이스 인덱스란?

 

관계형 데이터베이스에서 테이블의 일부를 따로 저장하여, 정렬과 검색에 빠른정보 제공을 목표로하는 기능.

https://lalwr.blogspot.com/2016/02/db-index.html

 

 

데이터베이스 힌트란?

 

DB는 쿼리의 실행계획을 가지고 실행을 하는데 그 과정에서 실행 방법을 어떻게 할지 지시를 내린다.

 

데이터베이스 쿼리에서 다양한 SQL 구현체들은 데이터베이스 엔진에 쿼리 실행 방법을 지시하는 SQL 표준의 추가분으로서 힌트(hint)를 사용한다. 이를테면 힌트는 엔진에게 가능한 메모리를 덜 쓰도록 지시할 수도 있고(쿼리가 느리게 동작하더라도), 색인의 사용 여부를 알릴 수도 있다(쿼리 최적화에 관계 없이).