관계 (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)
);
관련 개념
- 엔터티 (Entity)
- 속성 (Attribute)
- 식별자 (Identifier)
- 정규화 (Normalization)
- 참조 무결성 (Referential Integrity)