Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL

데이터베이스 일대다(1:N) 관계 모델 완벽 이해하기

일대다(One-to-Many) 관계란?

'수업 명부(class roster)' 데이터베이스에서 한 명의 교사는 없거나 하나 이상의 수업을 담당할 수 있지만, 하나의 수업은 반드시 한 명의 교사에 의해서만 진행됩니다. '회사' 데이터베이스에서는 한 명의 관리자가 없거나 여러 명의 직원을 관리할 수 있지만, 각 직원은 오직 한 명의 관리자에게만 속합니다. '상품 판매' 데이터베이스에서도 한 고객이 여러 건의 주문을 할 수 있는 반면, 각 주문은 특정한 한 고객에 의해 생성됩니다.

이처럼 한쪽 엔티티 하나가 다른 쪽 엔티티 여러 개와 연결되는 관계를 일대다(one-to-many, 1:N) 관계라고 하며, 관계형 데이터베이스 설계에서 가장 널리 사용되는 관계 유형입니다.

왜 단일 테이블로는 표현할 수 없을까?

일대다 관계는 하나의 테이블만으로는 제대로 표현할 수 없습니다. 예를 들어 '수업 명부' 데이터베이스에서 교사 정보(이름, 사무실, 전화번호, 이메일 등)를 담는 Teachers 테이블을 먼저 만든다고 가정해 봅시다. 각 교사가 가르치는 수업을 저장하기 위해 class1, class2, class3 같은 열(column)을 추가할 수 있지만, 과연 몇 개의 열을 만들어야 하는지 처음부터 문제에 부딪히게 됩니다.

반대로 수업 정보를 담는 Classes 테이블에서 출발하여, 해당 수업의 교사 정보를 저장하는 열을 추가하는 방식도 생각해 볼 수 있습니다. 그러나 한 교사가 여러 수업을 담당할 수 있기 때문에 동일한 교사 데이터가 Classes 테이블의 수많은 행(row)에 걸쳐 중복 저장되는 비효율이 발생합니다. 이는 데이터 무결성 문제와 저장 공간 낭비로 이어질 수 있습니다.

두 개의 테이블로 일대다 관계 구현하기

일대다 관계를 올바르게 지원하려면 테이블을 두 개로 분리하여 설계해야 합니다. 예를 들어 다음과 같이 구성합니다.

  • Classes 테이블 — 수업 정보를 저장하며, classID를 기본 키(primary key)로 사용
  • Teachers 테이블 — 교사 정보를 저장하며, teacherID를 기본 키로 사용

그런 다음 '다(N)' 쪽에 해당하는 자식(child) 테이블인 Classes'하나(1)' 쪽에 해당하는 부모(parent) 테이블인 Teachers의 기본 키인 teacherID를 함께 저장함으로써 두 테이블을 연결합니다. 아래 그림은 이러한 구조를 보여줍니다.

데이터베이스 일대다(1:N) 관계 모델 완벽 이해하기

외래 키(Foreign Key)의 역할

자식 테이블인 Classes에 포함된 teacherID 열을 외래 키(foreign key)라고 부릅니다. 외래 키는 부모 테이블의 기본 키를 자식 테이블에 가져다 놓은 것으로, 부모 테이블의 레코드를 참조하는 역할을 합니다. 이 외래 키 덕분에 한 교사가 어떤 수업들을 가르치는지, 또는 각 수업이 누구에게 담당되는지를 중복 없이 명확하게 조회하고 관리할 수 있습니다.