[Database] Entity Relationships (1)

DB를 설계할 때, 가장 중요하게 생각해야 할 부분이 바로 Entity Relationships이다. 오늘은 Entity Relationships에 대해 소개하고자 한다. 그전에 Entity를 모르는 사람들을 위해 Entity에 대한 정확한 정의를 짚고 넘어가자.

 

Entity

 

엔터티(Entity)란 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합이다. 즉, 우리가 추적하고 저장하기 위한 두루뭉술한 설계도라고 생각하면 될 것 같다. 엔터티는 Entity Class(엔터티 클래스)와 Entity Instance(엔터티 인스턴스)로 크게 분류가 될 수 있을 것 같다. (위 엔터티 클래스와 엔터티 인스턴스는 파이썬 Class 개념을 생각하면 될 것 같다.)

 

Entity Class(엔터티 클래스)란, 엔터티의 전체적인 구조를 의미한다. 즉, 엔터티의 구조를 나타내는 것과 같다. 예를 들어, 아이템이라는 엔터티가 있다고 생각해보자. 아이템 엔터티는 여러 속성을 가지고 있을 것이다. 가령, 아이템 ID라던지 비용, 재고 등 각 아이템마다 여러 속성을 가지고 있을 것이다. 각 엔터티가 공통으로 가지고 있을만한 큰 틀이 바로 엔터티 클래스이다.

엔터티 클래스 예시

 

Entity Instance(엔터티 인스턴스)는 엔터티 클래스에 의해 생성된 객체이다. 정리하자면, 엔터티 클래스는 객체를 실체화하기 위해 만든 설계로라면, 엔터티 인스턴스는 클래스를 통해 실제로 구현된 객체라고 생각하면 된다.

엔터티 인스턴스

 

이렇게 만들어진 엔터티는 각 제품을 식별하기 위한 Identifier 속성과 일반 Attribute 속성을 가지게 된다.

 

 

Relationships

 

엔터티는 다른 엔터티와 relationshops을 가진다. 그 relationshios은 1:1, 1:N, N:M의 관계 형성이 가능하다.

 

 

1:1 (one-to-one)

 

1:1 관계는 하나의 엔터티 인스턴스가 다른 엔터티 인스턴스 한개만 연결된다는 의미다. 예를 들어 사용자-전화번호 관계를 생각할 수 있다. 일반적으로(예외적인 경우는 생각 X) 통신사에서 한 사람 당 하나의 전화번호가 부여되며 이 때 각 User와 Phone Relationship이 1:1로 연결될 수 있다.

 

 

1:N (one-to-many)

 

1:N 관계는 하나의 엔터티가 서로 다른 여러 개의 엔터티와 연결된 경우를 의미한다. 예를 들어 통신사에서 한 사람 당 여러 개의 전화번호를 가질 수 있도록 하는 경우에, 하나의 User record가 여러 개의 Phone record와 연결될 수 있음을 이해할 수 있다.

 

 

N:M (many-to-many)

 

N:M 관계는 여러 개의 엔터티가 다른 여러 개의 엔터티와 연결된 경우를 의미한다. 예를 들어 고객-패키지와의 관계를 예로 들 수 있다. 보통 고객 한명에 대해 여행사는 여러 상품(패키지)를 구매할 수 있도록 한다.(개수 제한 X) 그리고 여행 상품의 입장에서는 하나의 상품에 여러 명의 고객들이 구입할 수 있도록 한다. 즉, Customer 테이블에서는 고객 1명이 여러 개의 상품을 가질 수 있고 Package 상품 하나는 여러 고객들과 연결될 수 있다.

 

이때 주의해야 할 것이 N:M 관계의 경우에는 기존 2개의 엔터티 만으로 표현하기가 어렵기 때문에, 아래의 예시와 같이 N:M으로 연결된 엔터티 사이에 Join 테이블을 만들어 그 둘의 관계를 연결할 필요가 있다.