SQL

SQL 데이터 모델링

봄다온 2025. 2. 11. 15:52

데이터베이스에서 하드웨어 개선 없이도 내부 구조나 기능을 활용하여 속도를 향상시키는 방법이 있는데,
대표적인 방법이 데이터 모델링과 데이터 인덱싱이다. 그 중, 데이터 모델링을 살펴보자.


인터넷 커뮤니티 사이트를 만든다고 가정해보자. 아래와 같은 조건이 필요할것이다.

  • 사용자는 이름과 생년월일, 그리고 점수를 가진다.
  • 게시판은 이름을 가진다.
  • 게시글은 사용자가 게시판에 작성 가능하고, 제목과 내용 조회수를 표시한다.
  • 조회수는 사용자당 1씩만 올릴 수 있고, 다시 게시글을 읽어도 조회수가 오르지 않는다

커뮤니티 사이트 모델링 예시

각 상자는 테이블을 의미하고, 상자 안의 항목들은 테이블이 가지는 컬럼을 의미.
각 테이블의 id 컬럼은 그 테이블의 프라이머리 키.
게시글과 조회 테이블은 다른 테이블의 id값을 저장하여 서로 다른 테이블과 관계를 형성.

게시판과 게시글의 관계는 일대다 관계(1:N)
사용자와 게시글의 관계는 다대다 관계(M:N)
사용자와 점수의 관계는 일대일 관계(1:1)

일대다 관계(1:N)

게시판과 게시글의 관계에서 하나의 게시판엔 여러개의 게시글이 있고, 각각의 게시글은 하나의 게시판에 속해 있어야한다.
이처럼 하나의 테이블에 여러개의 테이블이 속하는 관계를 일대다(1:N) 관계라고 한다.
일반적으로 이러한 관계를 의미하는 정보는 속하는 테이블(N)에 속해지는 테이블(1)의 id값을 저장한다.

일대다 관계 예시

일대다 방식을 사용하면 정보의 중복을 최소화하면서 정보를 저장할 수 있다.
서로간의 불필요한 정보의 중복이 없는 상태를 정규화된 상태라고 한다.
정보의 중복을 허용한다면 1개의 테이블로 일대다 관계를 표현할 수 있다.

비정규화 된 일대다 관계 예시

하나의 테이블로 일대다관계를 표현하면 두 테이블을 JOIN하여 불러오는것보다 읽기효율이 좋다.
하지만 게시판 이름을 수정해야할 일이 생긴다면 모든 행의 게시판 이름을 수정해야하고, 실수로 몇개 행의 게시판이름을 수정하지 못했다면
이전 게시판 이름과 수정후 게시판 이름이 공존할 수도 있다.
정규화된 형태로 테이블이 구성되어있다면 게시판 테이블의 게시판 이름을 가진 행 하나만 수정하면 된다.

이처럼 하나의 테이블로 일대다 관계를 표현하면 읽기 성능은 향상되지만, 중복되는 정보를 수정할때 효율이 나빠지고 일관성이 깨진다는 단점이 있다.

다대다 관계(M:N)

사용자와 게시글의 관계에서 사용자는 여러개의 글을 조회할 수 있고, 게시글은 여러 사용자에게 조회당한다.
이러한 관계를 다대다(M:N) 관계라고 한다.

다대다 관계 예시1

게시글과 사용자 테이블 사이의 다대다 관계를 표현하기 위해 중간에 조회 테이블이 있다.
게시글 테이블과 조회 테이블을 일대다 관게로 연결 후, 사용자 테이블과 조회 테이블을 일대다 관계로 연결했다.
즉 3개의 테이블을 두 번의 일대다 관계로 연결하여 정규화 된 다대다 관계를 만든것이다.

다대다 관계 예시2

조회 테이블을 삭제한 대신 게시글 테이블의 사용자id 값을 배열로 변경하여 2개의 테이블로 다대다 관계를 표현했다.
이 경우 저장되는 데이터의 양이 줄어들고, 게시글을 읽어서 조회한 사용자를 불러올 때 정보교환도 줄어든다.
그러나 1명의 사용자가 어떤 글을 읽었는지 확인하려면 모든 행에 조회 사용자 ids컬럼의 값을 하나하나 검색해야한다.
결국 한방향으로는 정보 접근이 쉽지만 반대방향으로는 정보 접근이 어려워지는 문제가 생긴다.
또한 관계 연결을 수정할 때도 복잡해지는 문제가 있다.

다대다 관계 예시3

다대다 관계 예시2에서의 문제저 때문에 두 테이블 사이의 id 값들을 양쪽에 배열로 저장한 방식이다.
양쪽 데이터로 접근할때 더 편하지만 그만큼 저장되는 데이터의 양이 늘어난다.

이런 방법이외에도 정규화 되지 않은 형태로 데이터를 모델링 하는 경우도 많이 있다.
일대다 관계에서 테이블 한개에 모든 정보를 표현한것처럼 다대다 관계에서도 마찬가지로 한 테이블에 모든 정보를 표현할 수도 있다.
이 경우 여러테이블을JOIN하여 조회하는것보다 조회성능은 좋아지지만, 테이블의 정보를 수정하는 경우 문제점이 많고 성능이 더 내려가게된다.

일대일 관계(1:1)

일대일 관계 예시

일대일 관계는 정보를 하나의 테이블에 저장하기엔 의미적으로 맞지 않거나, 성능을 향상시키기 위해 테이블을 나눠야할때 사용한다.
테이블 내에 쓰기 작업이 빈번한 컬럼과 읽기 작업이 빈번한 컬럼을 나눌때 사용하기도 한다.

'SQL' 카테고리의 다른 글

SQL 정규화와 비정규화  (0) 2025.02.11
SQL django와 연동  (0) 2025.02.06
SQL 6장 실습문제  (0) 2025.02.05
SQL 테이블 열연결 응용  (0) 2025.02.05
SQL 테이블 열연결(JOIN)  (0) 2025.02.05