데이터베이스(DB: Database)/Database

[DB] 관계형 데이터베이스의 관계 (1:1, 1:N, N:M)

잇트루 2022. 10. 11. 20:06
반응형

관계형 데이터베이스

구조화된 데이터는 하나의 테이블로 표현할 수 있다.

사전에 정의된 테이블을 릴레이션(relation)이라 하고, 테이블을 사용하는 데이터베이스를 관계형 데이터베이스(Relational database)라고 한다.

 

각 테이블 사이에는 관계라는 개념이 존재하며, 관계는 일대일(1:1), 일대다(1:N), 다대다(N:M) 관계가 있다.

 

관계 종류

1:1 관계

하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우이다.

다음과 같이 User 테이블과 Phonebook 테이블이 있다고 가정한다.

User 테이블은 user_id, name, phone_id를 가지고 있으며, phone_id는 외래키(foreign key)로 Phonebook 테이블의 phone_id와 연결되어 있다.

Phonebook 테이블은 phone_id와 phone_number를 가지고 있다.

 

이는 각 전화번호는 단 한 명의 사용자와 연결되어 있고, 그 반대도 동일하다면 User 테이블과 Phonebook 테이블은 1:1 관계이다.

 

또는 User테이블에 phone_id를 대신하여 phone_number를 저장하는 방법 또한 1:1로 나타낼 수 있다.

 

이를 말로 풀어서 설명하면, 한 명의 사용자는 하나의 전화번호를 가질 수 있으며, 하나의 전화번호는 한 명의 사용자만을 가질 수 있다로 해석할 수 있다.

 

1:N 관계

일대다(1:N) 관계는 하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우이다.

User 테이블과 Phonebook 테이블의 관계를 다음과 같이 나타낸다고 가정한다.

해당 구조에는 한 명의 사용자는 여러 개의 전화번호를 가질 수 있으나, 여러 명의 유저가 하나의 전화번호를 가질 수는 없는 구조이다.

일반적으로 데이터베이스를 사용할 때 가장 많이 사용되는 관계이다.

 

N:M 관계

다대다(N:M) 관계는 여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우이다.

N:M 관계를 위해 스키마를 디자인할 때에는 Join 테이블을 만들어 관리한다.

1:N 관계와 비슷하지만, 양방향에서 다수의 레코드를 가질 수 있다.

 

다음과 같이 여행 상품을 관리하는 테이블이 있다고 가정한다.

여러 개의 여행 상품(Package)과 여러 명의 고객(Customer)이 있다.

이를 말로 설명하면, 한 명의 고객은 여러 개의 여행 패키지를 구매할 수 있고, 여행 패키지 하나는 여러 명의 고객이 구매할 수 있다.

따라서 Customer 테이블과 Package 테이블은 N:M 관계이다. 이를 데이터베이스에서 관계를 표현하기 위해서는 두 개의 1:N 관계와 모양이 유사하게 표현할 수 있다.

 

두 개의 테이블과 1:N 관계를 형성하는 새로운 테이블로 N:M 관계를 나타내는 것이다.

다음과 같이 customer_package라는 새로운 테이블을 만들어 1:N 관계를 두 개로 표현한다.

이는 고객 한 명이 여러 개의 여행 상품을 가질 수 있고, 여행 상품 하나는 여러 개의 고객을 가질 수 있도록 표현한 것이다.

 

즉, customer_package는 고객과 여행 상품을 중간에서 1:N 관계로 묶어주는 역할을 한다. 이 테이블을 통해 고객이 몇 개의 여행 상품을 구매하였는지 또는, 어떤 여행 상품이 몇 명의 고객을 가지고 있는지 등을 확인할 수 있다.

 

customer_package는 cp_id와 같은 기본키가 반드시 존재해야 한다.

 

자기 참조 관계(Self Referencing Relationship)

때로는 하나의 테이블 내에서 관계를 표현해야 할 수도 있다. 예를 들어, 특정 서비스에서 회원 가입을 진행할 때, 추천인 ID를 입력하는 등의 기능에 사용된다.

 

이러한 예시는 다음과 같이 표현할 수 있다.

User 테이블의 recommend_id는 같은 User 테이블의 user_id와 연결되어 있다.

한 명의 사용자(user_id)는 한 명의 추천인(recommend_id)을 가질 수 있다.

하지만 한 명의 추천인(recommend_id)은 여러 명의 사용자(user_id)에게 추천인으로 등록될 수 있다.

 

따라서 해당 관계는 1:N 관계와 매우 유사하다. 하지만, 일반적으로 1:N 관계는 서로 다른 테이블의 관계를 나타낼 때 사용하는 표현이다.

반응형