Skip to main content

관계 (Relationship)

개요

관계(Relationship)는 엔터티 간의 연관성을 나타내는 개념으로,
두 개 이상의 엔터티가 업무적으로 어떻게 연결되어 있는지를 표현합니다.
관계는 데이터 모델링의 핵심 요소로, 엔터티 간의 상호작용과 데이터의 흐름을 정의합니다.

정의

관계는 엔터티 간의 관련성(Association)을 의미하며, 다음과 같은 특징을 가집니다:

  • 업무적으로 의미 있는 연결
  • 데이터의 참조 무결성 기반
  • 엔터티의 인스턴스 간 대응 관계 표현

관계의 분류

1. 정의에 따른 분류

관계종류 (Relationship Type)

존재관계 (Existence Relationship)

  • 고객은 관리점에 소속된다
  • 한 엔터티의 존재가 다른 엔터티의 존재에 의존
  • 부모-자식 관계에서 자식의 존재가 부모에 종속

행위관계 (Action Relationship)

  • 주문을 발주한다
  • 업무 프로세스에서 발생하는 행위나 이벤트를 통한 관계
  • 동적인 업무 활동을 표현

2. 관계차수 (Cardinality)에 따른 분류

관계차수는 두 엔터티 간에 참여하는 인스턴스의 수를 나타냅니다.

이어지는 내용에서 1:1, 1:N, N;M 개념이 나와 Cardinality 용어 정리를 하고 넘어갑니다.

관계차수 Cardinality 관계형 데이터베이스(RDB)에서 관계차수는 레이션(테이블)에 들어 있는 튜플(Row)의 개수를 뜻합니다.

관계차수 Cardinality = (Row, Tuple)의 수

학생 테이블
--------------
학생ID | 이름
--------------
S001 | 홍길동
S002 | 김영희
S003 | 박철수
=> 관계차수 3

RDB의 맥락에서 관계차수는 릴레이션의 크기(size)를 뜻합니다.

데이터 모델링 관점에서 Cardinality

관계차수(Cardinality) = 두 엔터티 간의 대응 수량 관계 (1:1, 1:N, N:M 등) ERD(개념 모델링)이나 논리 모델링 단계에서는 카디널리티가 두 엔터티 간의 관계에서 가능한 인스턴스 수의 제약을 의미합니다. ex:

  • 고객 1명은 여러 주문을 가질 수 있다 → 1:N
  • 부서 하나에 여러 사원이 속한다 → 1:N
  • 학생은 여러 과목을 수강할 수 있고, 과목은 여러 학생이 수강한다 → N:M

즉, “엔터티 관계의 카디널리티”는 → 1:1 / 1:N / N:M 을 가리킵니다.

최대기수성 (Maximum Cardinality)

1:1 (One-to-One) 관계

  • 완전 1:1: 고객은 고객등급 하나를 반드시 가진다

    • 양쪽 엔터티 모두 정확히 하나의 인스턴스와 대응
    • 필수 참여 관계
  • 선택적 1:1: 고객은 고객등급이 하나이거나 없을 수 있다

    • 한쪽 또는 양쪽이 선택적으로 참여
    • 비즈니스 규칙에 따라 결정

1:M (One-to-Many) 관계

  • 고객은 여러 개의 계좌를 가질 수 있다
  • 가장 흔하게 사용되는 관계 유형
  • 부모 엔터티의 하나의 인스턴스가 자식 엔터티의 여러 인스턴스와 연결
  • 실무에서 가장 자연스럽게 표현되는 관계

N:M (Many-to-Many) 관계

  • 한 명의 학생이 여러 개 과목을 수강할 수 있다. 과목은 여러명의 학생이 수강한다.
  • 양쪽 엔터티 모두 여러 인스턴스와 대응
  • 물리적 구현 시 교차 엔터티(Intersection Entity) 필요
  • 정규화 과정에서 두 개의 1:M 관계로 분해됨

최소기수성 (Minimum Cardinality)

필수 (Mandatory)

  • 반드시 하나가 있어야 하는 관계
  • 참조 무결성 제약 조건 적용
  • 자식 레코드는 반드시 부모 레코드를 참조해야 함

선택 (Optional)

  • 없을 수도 있는 관계
  • NULL 값 허용
  • 비즈니스 규칙에 따라 유연하게 설정

3. 식별관계와 비식별관계

식별관계 (Identifying Relationship)

계좌 - 계좌입금

  • 계좌는 강한 개체로 계좌입금 개체에 기본키를 공유함
  • 부모 엔터티의 주식별자가 자식 엔터티의 주식별자에 포함
  • 강한 종속 관계 표현
  • 자식 엔터티가 부모 없이 존재할 수 없음

특징:

  • 실선으로 표시
  • 부모의 PK가 자식의 PK이자 FK
  • 강한 결합도
  • 계층 구조 표현에 적합

비식별관계 (Non-Identifying Relationship)

강한 개체의 기본키를 다른 엔터티의 기본키가 아닌 일반 칼럼으로 관계를 가지는 것

  • 부모 엔터티의 주식별자가 자식 엔터티의 일반 속성으로만 사용
  • 자식 엔터티가 독립적인 식별자를 가짐
  • 느슨한 결합

특징:

  • 점선으로 표시
  • 부모의 PK가 자식의 일반 속성(FK)
  • 독립적인 생명주기
  • 유연한 데이터 모델링 가능

관계의 표기법

ERD 표기 규칙

ERD로 표현하면 다음과 같습니다:

[엔터티A] ----< [엔터티B]  (1:M 관계)
[엔터티A] ---- [엔터티B] (1:1 관계)
[엔터티A] >---< [엔터티B] (N:M 관계)

SQL로 구현하기

테이블을 작성하는 쿼리문과 함께 보면 좋을 것 같아 단순한 sql문을 작성했습니다.
식별, 비식별 관계와 1:1, 1:N, N:M 테이블을 쿼리문으로 작성해봅니다.

식별관계 구현 예시

식별 관계의 테이블을 작성하는 sql 쿼리문은 다음과 같습니다. 식별관계에서 부모의 PK는 자식의 PK이자 FK입니다.

-- 부모 테이블
CREATE TABLE 고객 (
고객ID VARCHAR(10) PRIMARY KEY,
고객명 VARCHAR(50)
);

-- 자식 테이블 (식별관계)
CREATE TABLE 계좌 (
고객ID VARCHAR(10),
계좌번호 VARCHAR(20),
PRIMARY KEY (고객ID, 계좌번호), -- 고객ID가 PK이자 FK입니다.
FOREIGN KEY (고객ID) REFERENCES 고객(고객ID) -- 강한 결합도
);

비식별관계 구현 예시

반면 비식별관계에서 부모 엔터티의 주식별자가 자식 엔터티의 일반 속성으로만 사용됩니다.

-- 부모 테이블
CREATE TABLE 부서 (
부서ID VARCHAR(10) PRIMARY KEY,
부서명 VARCHAR(50)
);

-- 자식 테이블 (비식별관계)
CREATE TABLE 사원 (
사원ID VARCHAR(10) PRIMARY KEY,
사원명 VARCHAR(50),
부서ID VARCHAR(10), -- 부모 테이블의 PK를 자식 테이블의 "부서ID"라는 속성에서 가져와 FK로 사용합니다.
FOREIGN KEY (부서ID) REFERENCES 부서(부서ID) -- 약한 결합도
);

N:M 관계 구현 예시

N:M, 다대다 관계의 테이블을 작성하는 sql 쿼리문은 다음과 같습니다:

-- 학생 테이블
CREATE TABLE 학생 (
학생ID VARCHAR(10) PRIMARY KEY,
학생명 VARCHAR(50)
);

-- 과목 테이블
CREATE TABLE 과목 (
과목ID VARCHAR(10) PRIMARY KEY,
과목명 VARCHAR(50)
);

-- 교차 테이블 (N:M 관계를 연결하기 위한 중간 테이블입니다.)
CREATE TABLE 수강 (
학생ID VARCHAR(10), -- 학생 과
과목ID VARCHAR(10), -- 과목 의 두 테이블 PK를 가져와 연결하고
수강일자 DATE, -- 수강 일자
성적 CHAR(1), -- 성적이라는 추가 속성을 갖는 "수강" 테이블입니다.
PRIMARY KEY (학생ID, 과목ID),
FOREIGN KEY (학생ID) REFERENCES 학생(학생ID),
FOREIGN KEY (과목ID) REFERENCES 과목(과목ID)
);

관련 개념