본문 바로가기

SQL/모두를 위한 postgreSQL

[PostgreSQL] 6. 데이터 모델링

728x90

데이터 모델링
-데이터를 어떻게 하면 효과적으로 다룰 수 있는지
-내부구조나 기능을 활용하여 속도를 향상시키는 방법

1. 테이블 사이의 관계
    -관계형 데이터베이스인 postgresql은 데이터를 담기 위해 테이블이라는 그릇이 항상 필요하다
      많은 정보를 테이블로 표현하기 위해서는 전략적으로 구성해야한다 
    -저장할 데이터의 구조를 정하는 작업을 데이터 모델링 이라고 한다
    -데이터 모델링은 많은 양의 데이터를 빈번하게 조회하는 서비스에서 특히 중요하다

    1) 데이터 모델링 예시
        -게시판은 여러개의 게시글을 가질 수 있고, 게시글은 하나의 게시판에 속해 있다
        -사용자는 여러 개의 게시글을 쓸 수 있고, 게시글에는 하나의 글쓴이가 있다
        -사용자는 여러개의 게시글을 조회할 수 있고, 게시글은 여러명의 사용자가 조회할 수 있다
        -사용자는 하나의 점수를 갖고 점수는 하나의 사용자를 갖는다

        -게시판과 게시글의 관계는 일대다 관계(1:n)이라고 한다
        -사용자와 게시글의 관계는 다대다 관계(m:n)이라고 한다
        -사용자와 점수 사이의 관계는 일대일 관계(1:1)라고 한다

    2) 일대다(1:n) 관계
        -하나의 테이블이 다른 테이블에 속하는 관계
        -하나의 게시판에는 여러 개의 게시글이 있고, 각각의 게시글은 하나의 게시판에 속해 있어야 한다
        -일대다 관계를 의미하는 정보는 일반적으로 속하는 테이블(게시글)에 속해지는 테이블id 값을 저장한다 
        -일대다 관계를 이용하면 정보의 중복을 최소화하면서 정보를 저장할 수 있다
         이와 같이 서로간의 불필요한 정보의 중복이 없는 상태를 정규화된 상태라고 한다
        
    3) 다대다(m:n) 관계
        -두 테이블이 서로 다수의 관계를 가지는 관계
        -사용자가 게시글을 조회할 수 있고, 게시글은 여러 사용자에게 조회 당한다
        -3개의 테이블을 두번의 일대다 관계로 연결을 하면 정규화 된 다대다 관계를 만들 수 있다
         (게시글테이블 / 조회테이블 / 사용자테이블)
        -한쪽테이블 로우에서 다른쪽 테이블 로우의 값을 배열로 가지고 있으면 다대다 관계를 만들 수 있다
         (단점은 한 방향으로는 정보 접근이 쉽지만 반대쪽 방향으로는 정보 접근이
          어려워지는 문제가 생기고 관계 연결을 수정할 때도 복잡해지는 문제가 있다)

    4) 일대일(1:1) 관계
        -2개의 테이블이 서로 일대일로 연결되어 있는 관계
        -일대일 관계를 연결하는 정보는 일대다 관계와 마찬가지로 상대방 테이블의 값을 저장하면서 이루어진다
        -저장하는 정보를 하나의 테이블으로 묶기에는 의미적으로 맞지 않거나
         성능을 향상시키시 위해 2개의 테이블으로 나누서 사용해야 할 때 사용한다


2. 정규화 비정규화
    1) 정규화 이해하기
        -정규화 : 중복성을 제거하거나 줄이기 위해 데이터를 구성하는 과정이다
        -일반적인 의미의 정규화 : 크고, 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조직된 테이블과 관계들로 

                                                 나누는 것을 의미한다
        -정규화된 테이블이 보기에 간결하고 명확하긴 하지만 데이터 조회시 비효율적일 수 있다
        -정규화된 테이블들은 정보가 여러 테이블에 분산되어 있는 특징을 가지게된다 

          이런 특징은 많은 JOIN문을 사용하게 한다

    2) 비정규화를 하는 이유
        -정규화된 테이블처럼 중간에 JOIN과 같은 연산이 필요없이

           테이블 하나를 조회하는 작업만으로 결과를 확인 할 수 있다
        -비정규화된 모델은 데이터의 중복이 있기 때문에 쓰기 작업시 더 불리해지는 경향
        -쓰기 작업을 할 때 잘못된 코드가 작성되어 있다면 데이터의 무결성이 깨질 위험도 있다

    3) 비정규화의 유형
        -완전이 정규화한 모델에서 비정규화를 고려
        (1) 자주 함께 조회하는 테이블
            -음악, 가수, 앨범 테이블이 있다고 가정할때 음악테이블안에 가수명과 앨범명을 중복해서 저장한다
             이와같이 데이터를 중복해서 저장하면 JOIN연산 없이 빠르게 원하는 정보를 조회할 수 있다
            -중복해서 데이터를 저장하게 되면 데이터 무결성이 훼손될 우려가 있다
             이러한 문제는 트리거 또는 구체화된 뷰를 활용하면 해결할 수 있다
            
        (2) 집계 연산이 빈번하게 일어나는 상황
            -예를 들어 음악에 대한 평점을 사용자가 줄 수 있다 중복해서 주는 상황을 막기위해 다대다 관계로 설정
            -음악평점에 대한 정보로 평균평점과 평점의 수를 빈번하게 보여준다면 

              매번 집계연산을 하는 것보다 미리 집계된 정보를 음악테이블에 미리 저장해 놓는 것이다

        (3) 자주 조회되지 않는 정보가 포함된 테이블이 있는 경우
            -예를 들어 가사에 대한 정보는 자주 조회되지 않지만 데이터 크가가 크다면 
             가사에 대한 정보를 다른 테이블로 분리한다

728x90