[Database Modeling] 관계

DaeHoon·2023년 7월 26일
0

Database Modeling

목록 보기
3/5

1. 1:M 관계

  • 1:M 관계는 한 쪽이 관계를 맺은 쪽의 여러 객체를 갖는 것을 의미하며, 가장 흔하게 나타나는 매우 일반적인 형태이다.
  • 부모와 자식 관계, 컴퓨터 디렉토리 등

  • M은 1에 종속되어 있다.

1:M 재귀적 관계

  • 재귀적 관계를 표시하는 방법은 하나의 테이블안에 PK와 FK가 있게 설계하면 된다.
  • 위의 예시는 부서 밑에 세부 부서를 표현하고 있음. 이 때 ID (PK)와 부모 ID (FK)로 두어 테이블 간 재귀적 관계를 생성하여 부서의 계층 관계를 표현할 수 있다.

2. M:N 관계

  • M:N 관계는 관계를 가진 양쪽 당사자 모두에서 1 : M 관계가 존재할 때 나타나는 모습이다.
  • 학생과 과목의 관계를 예시로 들을 수 있다. 학생 입장에서는 여러 개 과목을 수강할 수 있고, 과목 입장에서 보면 여러 학생이 이 과목을 선택할 수 있음. 다:다 관계가 성립함.
  • 선천적으로는 학생과 과목은 관계가 없다 그러나, 각 테이블 사이에 수강이라는 관계를 맺어 줌으로써 이들간의 관계를 형성할 수 있다.

잘못된 M:N 관계

  • 이렇게 중간에 관계 테이블 없이 직접적으로 매핑 시, 각 테이블의 PK가 중복이 되는 상황이 발생한다.
  • 이런 관계를 해결하기 위해 M:N 관계일 때는 반드시 관계 테이블을 설계해야 한다.

관계 테이블의 PK

1. 독립형 PK

  • 관계 테이블에 독립형 PK를 사용하는 모델
  • Q) 관계 테이블의 값이 저렇게 중복으로 들어가도 될까?
    • A) 비즈니스 로직에 따라 다르다. 위와 같은 경우에는 고객이 여러개의 상품을 구매할 수 있어, 주문 테이블의 중복 데이터가 허용이 되지만. 특정 시간 대의 학생이 수강하는 과목을 표현한다고 하면 학생은 그 시간대에 단 하나의 수업만 들을 수 있으니 중복이 허용이 되어서는 안된다.

2. 상속형 PK

  • 학생과 과목의 FK를 상속받아 새로운 PK를 만들었다.
  • 수강은 weak Entity로 구현됨.

6) 독립형 PK

  • 관계 테이블에 PK와 대체키(보조키) (alternate key)를 사용하는 모델
  • PK를 구성하는 컬럼이 너무 많을 때 대체 키를 두어서 어플리케이션 개발이나 쿼리 요청을 쉽게 할 수 있다.
PK
select * from 수강 where 학생Id = '1' and 과목Id = 'c';

AK
select * from 수강 where seq = 5;

3. 1:1 관계

  • 하나의 엔티티에서 다른 엔티티를 보더라도 반드시 단 하나씩 관계를 가지는 것을 말한다.
  • 예를 들어 일부일처제인 혼인 제도에서 한 남자는 한 여자와, 한 여자는 한 남자와 밖에 결혼을 할 수 없다.
  • 개념 상 하나로 합쳐도 전혀 이상이 없음

개념 상 합쳐도 이상이 없는데 왜 1:1 관계를 사용해야 할까?

  • 이러한 요구사항을 모델링한다고 가정해보자.

1) 1:M

  • 문서가 3개 정도 있을 때는 잘 돌아갈수도 있는 것처럼 보이지만, 문서가 200개 정도 있을 경우에는?
  • 각 문서마다 요구하는 형태가 다를 수 있다 -> 곧 건 테이블에 컬럼을 추가해야한다.
  • 컬럼을 추가하면 무슨 문제가 생기는데? -> 필요없는 컬럼에도 빈 값을 넣어줘야 한다.
    • 예를 들어 집 문서와 거래 문서가 있고 집 문서에서는 집 주소라는 값이 반드시 필요하지만, 거래 문서에서는 필요 없다고 가정했을 때, 위와 같이 테이블을 설계하면 거래 문서를 표현 할 때에도 집 주소라는 값에다가 NULL이나 빈 값을 넣어줘야 한다.
  • 즉, 노는 컬럼들이 생김.

2) 1:1

  • 모든 문서에서 공통으로 쓰는 컬럼을 건정보공통이라는 엔티티로 설계하고 테이블명이라는 컬럼을 추가했다.
  • 그 외 해당 문서마다 요구하는 컬럼들이 다르므로 문서별로 엔티티를 만들어주었다.
  • 중요한거는 PK는 다 같다. 즉 위의 모델링에서 모든 서브테이블에 테이블명이라는 컬럼을 추가하고 테이블명으로 조인을 해서 해당 데이터를 조회하는 것은 넌센스다.
  • 모든 관계가 1대1 관계이므로 N개의 서브테이블 중에서 단 하나의 테이블에만 데이터가 존재해야 한다. 이 때 해당하는 테이블명을 건정보공통의 테이블명 컬럼에 저장해주면 추후에 데이터를 조회할 때 테이블명으로 조회할 수 있다.

Reference: RDBMS Modeling 기초 (인프런)

profile
평범한 백엔드 개발자

0개의 댓글