데이터 모델링
-데이터를 어떻게 하면 효과적으로 다룰 수 있는지
-내부구조나 기능을 활용하여 속도를 향상시키는 방법
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) 자주 조회되지 않는 정보가 포함된 테이블이 있는 경우
-예를 들어 가사에 대한 정보는 자주 조회되지 않지만 데이터 크가가 크다면
가사에 대한 정보를 다른 테이블로 분리한다
'SQL > 모두를 위한 postgreSQL' 카테고리의 다른 글
[PostgreSQL] 7. 데이터 인덱싱_(2) (1) | 2023.03.23 |
---|---|
[PostgreSQL] 7. 데이터 인덱싱_(1) (0) | 2023.03.21 |
[PostgreSQL] 5. 데이터의 결합_3 (0) | 2023.03.18 |
[PostgreSQL] 5. 데이터의 집계_2 (0) | 2023.03.17 |
[PostgreSQL] 5. 데이터의 집계 및 결합_1 (0) | 2023.03.16 |