관계형 데이터베이스( MySQL, Oracle, MS-SQL, SQLite 등 )는 엔티티(객체)끼리 관계를 맺을 수 있어서 관계형 DB라는 이름이 붙었습니다.

관계는 두 엔티티가 서로 관련이 있을 때를 말하는데, 다음과 같은 관계를 맺을 수 있습니다.

  • 일대일 ( 1:1 )
  • 일대다 ( 1:N )
  • 다대다 ( N:M )




1. 일대일 관계 ( 1:1 )

1 : 1 관계란 어느 엔티티 쪽에서 상대 엔티티를 보더라도 반드시 단 하나씩 관계를 가지는 것을 말합니다.


예를 들면, 우리나라에서 결혼제도는 일부일처제입니다.

즉, 한 남자는 한 여자와, 한 여자는 한 남자와 밖에 결혼을 할 수 없습니다.

법적으로 남편을 또는 부인을 2명 이상 둘 수 없습니다.

이러한 관계를 1:1 관계라고 합니다.





2. 일대다 관계 ( 1:N )

1 : M 관계는 한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것을 의미합니다.

이 관계는 매우 흔한 방식이며, 실제 DB를 설계할 때 자주 쓰이는 방식입니다.


예를 들면, 부모와 자식 관계라고 생각하시면 됩니다.

부모는 자식을 1명만 낳을 수도 있고, 2명, 3명, 4명, 10명 그 이상도 낳을수 있습니다.

DB에서는 이를 부모가 자식을 소유한다고 ( has a 관계 ) 표현합니다.

반대로 자식 입장에서는 부모( 어머니, 아버지의 쌍 )를 하나만 가질 수 밖에 없습니다.


이러한 관계를 1 : N 관계라고 하며, 계층적인 구조로 이해할 수도 있습니다.





3. 다대다 관계 ( N:M )

N : M 관계는 관계를 가진 양쪽 엔티티 모두에서 1 : M 관계가 존재할 때 나타나는 모습입니다.

즉, 서로가 서로를 1:N 관계로 보고 있는 것입니다.


예를 들면, 쇼핑몰에서 회원과 상품이 관계를 맺을 수 있습니다.

한 회원은 쇼핑몰의 여러 상품들을 가질 수 있습니다.

청바지, 모자, 티셔츠, 남방 등... 다 제가 가질 수 있죠.


반대로 한 티셔츠도 여러 회원들을 가질 수 있습니다.

하나의 티셔츠를 나도 친구도 부모님도 가질 수 있습니다.


이처럼 관계를 맺은 두 엔티티가 서로 많이 가질 수 있을 때, 이를 N : M 관계라고 합니다.





4. 대표키와 외래키

table을 각 엔티티를 식별할 수 있는 대표 키( PK, Primary key )가 존재합니다.

대표키는 중복되지 않는 값입니다. ( unique )


예를 들어, 주민 번호는 대한민국 국민들을 식별할 수 있는 대표 키가 됩니다.

주민등록증이 같은 사람은 있을 수 없기 때문에, 대표 키로서 기능을 할 수 있습니다.



테이블간의 관계를 맺을 때, 흔히 대표키를 이용하여 관계를 맺습니다.

예를 들어, 1 : N 관계의 대표적인 예로 게시글과 댓글을 생각해보겠습니다.

게시글은 여러 댓글들을 가지고 있으며, 댓글은 어떤 한 게시글에만 속해 있습니다.

따라서 게시글과 댓글은 1:N 관계라 할 수 있습니다.


게시글은 자신이 어떤 댓글들을 가지고 있는지 어떻게 알 수 있을까요?

댓글 테이블을 설계할 때 컬럼에는 아래와 같은 정보들이 있을 수 있습니다.

  • 댓글 아이디 ( PK )
  • 작성자 명
  • 내용
  • 작성일

여기서 어떤 게시글에 속해 있는지에 대한 정보가 필요하므로 하나의 컬럼이 더 필요한데, 이를 외래키( FK, Foreign key )라 합니다.

  • 게시글 아이디 ( FK )

여기서 게시글 아이디는 게시글 테이블의 대표 키이며, 이를 댓글 테이블의 외래키로 지정하여 관계를 맺을 수 있습니다.


즉, 게시글은 어떤 댓글들이 자신의 댓글들인지 알 필요 없고, 댓글만 자신이 어떤 게시글에 속하는지만 알면 1:N 관계를 성립할 수 있습니다.

그 역할이 외래키인 것이죠.


그렇다면 N : M 관계에서는 어떨까요?

여기서는 서로가 서로를 1 : M  ,  1 : N  관계로 갖고 있기 때문에, 서로의 PK가 자신의 외래키 컬럼으로 갖고 있으면 됩니다.

일반적으로 N : M 관계는 두 테이블의 대표키를 컬럼으로 갖는 또 다른 테이블을 생성해서 관리합니다.





이상으로 관계형 데이터베이스에서 갖는 관계의 종류에 대해 알아보았습니다.


[ 참고자료 ]

http://www.dbguide.net/db.db?cmd=view&boardUid=12851&boardConfigUid=9&categoryUid=216&boardIdx=40&boardStep=1