Search
moon
sun

02.엔터티 · 속성 · 관계

•
어떤 개념이 엔터티가 될 수 있는지 6가지 조건으로 판정할 수 있다.
•
속성을 특성(기본/설계/파생)과 분해수준(단일/복합/다중값)으로 분류할 수 있다.
•
관계의 차수(1:1, 1:M, M:N) 와 선택사양(필수/선택) 을 ERD에서 읽어낼 수 있다.
•
M:N 관계를 교차 엔터티로 해소할 수 있고, 왜 해소해야 하는지 설명할 수 있다.

1. 엔터티 (Entity)

1) 정의

•
업무에서 관리해야 하는, 의미 있는 정보의 집합
•
저장되고 관리되어야 하는 "덩어리"
•
물리 모델에서는 대부분 테이블이 된다
구분
용어 (논리 모델)
용어 (물리 모델/DB)
집합 전체
엔터티 (Entity)
테이블 (Table)
한 건의 데이터
인스턴스 (Instance)
행 (Row)
각 항목
속성 (Attribute)
컬럼 (Column)
📋 엔터티 PLAYER 를 표로 그려보면
선수ID
선수명
포지션
등번호
← 속성 (Attribute)
인스턴스 ①
2012001
김철수
GK
1
인스턴스 ②
2012002
이영희
FW
9
인스턴스 ③
2012003
박민수
MF
7
⬆️ 엔터티 = 표 전체
💡 한 줄 정리엔터티 = 표 전체, 인스턴스 = 표의 한 줄, 속성 = 표의 한 칸(열)

2) 엔터티가 되기 위한 6가지 조건 ⭐⭐

#
조건
뜻
위반 예시
1
업무에서 필요로 하는 정보여야 한다
우리 업무가 실제로 쓰는가?
축구 DB에 '주식 시세'
2
유일한 식별자로 식별 가능해야 한다
한 건을 콕 집어낼 수 있는가?
이름만 있는 선수 목록(동명이인 구분 불가)
3
인스턴스가 2개 이상이어야 한다
한 건짜리는 엔터티가 아님
'우리 회사' 엔터티 (1건뿐)
4
업무 프로세스에 이용되어야 한다
아무도 안 쓰면 만들 필요 없음
등록만 하고 조회도 안 하는 표
5
반드시 속성을 포함해야 한다
속성 없는 엔터티는 없음
이름만 있고 관리항목이 없는 표
6
다른 엔터티와 최소 1개 이상의 관계가 있어야 한다
홀로 떠 있으면 안 됨
아무 테이블과도 연결 안 된 표
⚠️ 6번의 예외 (기출 함정) 아래 세 가지는 관계가 없어도 엔터티로 인정합니다. 통계성 엔터티 / 코드성 엔터티 / 시스템에서 내부 필요에 의해 생성한 엔터티

3) PLAYER 는 6가지 조건을 만족하는가?

#
조건
PLAYER 실제 데이터
판정
1
업무에 필요한 정보
축구 구단 업무의 핵심 대상
✅
2
유일한 식별자
PLAYER_ID 480건 모두 서로 다름
✅
3
인스턴스 2개 이상
선수 480명
✅
4
업무 프로세스에 이용
선수 등록·이적·출전 관리에 사용
✅
5
속성 보유
선수명·포지션·등번호 등 13개
✅
6
최소 1개 이상의 관계
TEAM 과 1:M 관계
✅

4) 조건 ② 를 왜 이름으로 만족시킬 수 없는가 ⭐

"선수명(PLAYER_NAME)을 식별자로 쓰면 안 될까?" — 데이터로 판정해 봅시다.
항목
값
전체 선수 수
480명
서로 다른 선수명의 개수
476개
차이(중복 건수)
4건 ⚠️
실제 중복되는 이름
선수명
인원수
김정우
2명
이강진
2명
…
…
⭐ 결론: 이름은 유일하지 않으므로 식별자가 될 수 없습니다. 그래서 실제 모델에서는 인위적인 PLAYER_ID 를 만들어 식별자로 삼았습니다. → 이것을 인조 식별자(Artificial Key) 라고 부릅니다.

5) 엔터티의 분류 ⭐

엔터티는 두 가지 기준으로 나눕니다. 시험에는 이 두 기준이 섞여서 출제됩니다.
기준
종류
판별 요령
유무형
유형 / 개념 / 사건
만질 수 있으면 유형, 눈에 안 보이면 개념, "~했다"는 일 이면 사건
발생시점
기본 / 중심 / 행위
FK가 하나도 없으면 기본, FK가 있으면 중심, 여러 엔터티가 합쳐졌으면 행위

6) 실습 스키마 전수 분류 ⭐

판별 기준: 그 엔터티가 외래키(FK)를 몇 개 갖고 있는가?
엔터티
FK 개수
유무형 분류
발생시점 분류
판단 근거
STADIUM
0개
유형 엔터티
기본 엔터티
만질 수 있고, 아무에게도 의존하지 않음
TEAM
1개
개념 엔터티
중심 엔터티
팀은 만질 수 없는 '조직' 개념 / 경기장에 의존
PLAYER
1개
유형 엔터티
중심 엔터티
사람은 만질 수 있음 / 팀에 의존
SCHEDULE
1개 + 팀 참조 2개
사건 엔터티
행위 엔터티
경기가 '열린다'는 사건 / 홈팀·원정팀 2개 팀이 만나 발생

2. 속성 (Attribute)

1) 정의와 기본 개념

•
엔터티가 관리하는 더 이상 쪼갤 수 없는 최소의 데이터 단위
•
하나의 속성은 하나의 값(원자값) 만 가진다
•
도메인(Domain): 그 속성이 가질 수 있는 값의 범위
속성
도메인 (가질 수 있는 값의 범위)
POSITION
{ GK, DF, MF, FW } — 실제 데이터에 나타나는 값은 이 4가지뿐
HEIGHT
100 ~ 250 사이의 정수
SOLAR
{ 1(양력), 0(음력) }

2) 특성에 따른 분류 (기본 / 설계 / 파생) ⭐⭐

종류
정의
예시
특징
기본 속성 (Basic)
업무에서 원래 존재하는 속성
선수명, 키, 몸무게, 급여
가장 많은 비중
설계 속성 (Designed)
업무에는 없지만 설계하면서 만든 속성
선수ID, 팀ID, 상품코드
주로 코드성 속성
파생 속성 (Derived)
다른 속성으로부터 계산되어 나온 속성
연봉(=월급×12), 합계, 평균
⚠️ 가급적 적게 만들어야 함
EMP 테이블로 세 가지를 구분해 보면
컬럼
분류
이유
ENAME (사원명)
기본 속성
업무에 원래 존재
SAL (급여)
기본 속성
업무에 원래 존재
EMPNO (사원번호)
설계 속성
구분하려고 인위적으로 만든 코드
SAL × 12 (연봉)
파생 속성
계산으로 만들어짐 (테이블에 저장 안 함)
⚠️ 파생 속성이 위험한 이유 (시험 단골) 원본이 바뀌었는데 파생 값을 갱신하지 않으면 데이터가 서로 안 맞습니다(= 01강의 비일관성). 그래서 원칙은 "저장하지 말고 필요할 때 계산하라" 입니다.

3) 파생 속성 계산의 NULL 함정 ★★ 매년 나옵니다

상황: 실제 연봉 = (월급 + 커미션) × 12 로 계산하려고 한다.
-- ❌ 잘못된 계산: NULL이 하나라도 끼면 전체가 NULL이 된다 SELECT ENAME, SAL, COMM, (SAL + COMM) * 12 AS 연봉 FROM EMP; -- ✅ 올바른 계산: NVL(값, 대체값) 으로 NULL을 0으로 바꾼 뒤 계산 SELECT ENAME, SAL, COMM, (SAL + NVL(COMM, 0)) * 12 AS 연봉 FROM EMP;
SQL
복사
두 계산의 결과 비교
사원명
급여
커미션
❌ (SAL+COMM)*12
✅ (SAL+NVL(COMM,0))*12
SMITH
800
(NULL)
(NULL) ⚠️
9,600
ALLEN
1600
300
22,800
22,800
KING
5000
(NULL)
(NULL) ⚠️
60,000
⭐ 시험 포인트NULL은 '값이 없음'이지 '0'이 아닙니다.NULL이 포함된 사칙연산의 결과는 무조건 NULL 입니다. HR 계정에서는 commission_pct 가 비율이므로 salary * 12 * (1 + NVL(commission_pct, 0)) 형태가 됩니다.

4) 구성 방식에 따른 분류 (PK / FK / 일반)

종류
뜻
실습 스키마 예시
PK 속성 (기본키)
인스턴스를 식별하는 속성
PLAYER.PLAYER_ID
FK 속성 (외래키)
다른 엔터티와의 관계를 나타내는 속성
PLAYER.TEAM_ID
일반 속성
그 외 나머지
PLAYER.HEIGHT, PLAYER.NICKNAME

5) 분해 수준에 따른 분류 (단일 / 복합 / 다중값) ⭐⭐

종류
정의
실습 스키마 예시
조치
단일 속성
하나의 의미만 가짐
HEIGHT, WEIGHT
그대로 사용
복합 속성
여러 의미로 분해 가능
ADDRESS(주소)
업무 필요에 따라 분해해서 관리
다중값 속성
한 속성에 여러 값
선수의 전화번호 여러 개
❌ 반드시 별도 엔터티로 분리

6) 복합 속성을 미리 분해해 두면 무엇이 좋은가

TEAM 테이블은 전화번호를 DDD(지역번호) + TEL(국번) 으로 나눠 관리합니다.
팀명
DDD
TEL
합치면
성남일화천마
031
123-4567
031-123-4567
수원삼성블루윙즈
031
987-6543
031-987-6543
분해해서 저장 (실제 설계)
한 칸에 저장
"경기도(031) 팀만 조회"
WHERE DDD = '031' → 인덱스 사용 O ✅
WHERE TEL LIKE '031%' → 느림 ⚠️
지역번호만 변경
해당 컬럼만 수정
문자열을 잘라 붙여야 함
필요하면 합치기
DDD || '-' || TEL 로 언제든 가능
—

7) 다중값 속성은 왜 반드시 제거해야 하는가 ⭐⭐

❌ 나쁜 설계 — 한 칸에 연락처를 콤마로 이어 붙였다
선수ID
선수명
연락처
2012001
김철수
010-1111-1111, 02-222-2222
2012002
이영희
010-3333-3333
#
문제점
구체적으로
1
검색 불가
"02-222-2222 쓰는 선수 찾기" → LIKE 검색뿐 (느리고 부정확)
2
구조 변경 강제
번호가 4개로 늘면 컬럼 길이를 또 늘려야 함
3
수정 곤란
번호 하나만 고치려면 문자열을 잘라 붙여야 함
✅ 좋은 설계 — 별도 엔터티로 분리 (= 제1정규화)
[선수]
선수ID
선수명
2012001
김철수
2012002
이영희
[선수연락처]
선수ID
번호순번
번호종류
전화번호
2012001
1
휴대폰
010-1111-1111
2012001
2
자택
02-222-2222
2012002
1
휴대폰
010-3333-3333
한 행에 값 하나만 들어가므로 WHERE 전화번호 = '02-222-2222' 로 정확하고 빠르게 검색됩니다.
⭐ 시험 포인트"한 속성에 값이 여러 개 = 다중값 속성 = 제1정규형 위반 = 별도 엔터티로 분리" 이 연결고리를 통째로 외우세요. (04강 정규화와 직결)

8) 속성명 작성 규칙

•
해당 업무에서 사용하는 이름을 부여
•
서술식 이름은 사용 금지 (선수가입년도 ❌ → 가입년도 ⭕)
•
약어 사용은 가급적 지양
•
전체 모델에서 유일한 이름을 사용 (같은 뜻이면 같은 이름)

3. 관계 (Relationship)

1) 정의와 분류

•
엔터티와 엔터티 사이의 연관성
•
ERD에서는 선(線) 으로 표현
분류
뜻
예시
존재 관계
그냥 존재 자체로 맺어진 관계
부서 ─ 사원 (사원은 부서에 소속되어 존재)
행위 관계
어떤 행위(사건) 로 인해 생긴 관계
고객 ─ 주문 (주문이라는 행위로 연결)
⚠️ 두 관계 모두 ERD 표기법은 똑같습니다. 구분은 개념적인 것뿐입니다.

2) 관계를 표기하는 3요소 ⭐⭐

요소
질문
표기
관계명
"무슨 관계인가?"
선 위에 동사로 기술 (예: 소속된다 / 소속시킨다)
관계 차수
"몇 개와 연결되나?"
1:1, 1:M, M:N
관계 선택사양
"없어도 되나?"
필수(●) / 선택(○)
⭐ 관계는 항상 양쪽에서 읽습니다 (기출 단골)
•
팀 입장: "한 팀은 여러 선수를 소속시킨다." (1 → M)
•
선수 입장: "한 선수는 하나의 팀에 소속된다." (M → 1)

3) 관계 차수 (Cardinality) 3종 비교 ⭐⭐

차수
의미
실습 스키마 예시
물리 구현 방법
1 : 1
양쪽 모두 한 건씩
STADIUM ↔ TEAM (한 경기장의 홈팀은 하나)
한쪽에 FK + UNIQUE
1 : M
한쪽이 여러 건
TEAM → PLAYER (한 팀에 선수 여러 명)
M쪽에 FK
M : N
양쪽 모두 여러 건
팀 ↔ 팀 (경기를 통해)
❌ 그대로는 불가 → 해소 필요
1:M 관계를 데이터로 확인 — 팀 1건에 선수 여러 건이 매달려 있다
팀명
소속 선수 수
수원삼성블루윙즈
35명
성남일화천마
33명
…
…

4) 관계 선택사양 (필수 / 선택) ⭐⭐

이 개념이 2과목의 OUTER JOIN과 직결되므로 반드시 이해하고 넘어가야 합니다.
선택사양
뜻
FK 컬럼의 NULL 허용
조인 방식
필수 (Mandatory)
반드시 상대가 있어야 함
NOT NULL
INNER JOIN으로 충분
선택 (Optional)
상대가 없어도 됨
NULL 허용
OUTER JOIN 필요

5) 선택적 관계가 조회 결과를 바꾸는 장면 ★★

상황: EMP.MGR(관리자)는 NULL 허용 = 선택적 관계. 사장(KING)은 관리자가 없습니다.
-- ❌ INNER JOIN : 관리자가 없는 KING이 결과에서 사라진다 → 13건 SELECT E.ENAME AS 사원, M.ENAME AS 관리자 FROM EMP E, EMP M WHERE E.MGR = M.EMPNO; -- ✅ OUTER JOIN : 관리자가 없어도 사원은 모두 보여준다 → 14건 SELECT E.ENAME AS 사원, M.ENAME AS 관리자 FROM EMP E, EMP M WHERE E.MGR = M.EMPNO(+); -- (+): 데이터가 부족한 쪽에 붙인다 (Oracle 전용 표기)
SQL
복사
결과 비교
사원
관리자
INNER JOIN
OUTER JOIN
SMITH
FORD
✅ 포함
✅ 포함
ALLEN
BLAKE
✅ 포함
✅ 포함
KING
(NULL)
❌ 누락 ⚠️
✅ 포함
총 건수
13건
14건
⭐ 시험 포인트 — 모델링(1과목)과 조인(2과목)이 여기서 만납니다"관계가 선택적(Optional)이다"= "FK에 NULL이 있을 수 있다"= "INNER JOIN 하면 행이 누락된다"= "OUTER JOIN 을 써야 한다"

4. M:N 관계의 해소 ⭐⭐⭐

1) 왜 M:N은 그대로 둘 수 없는가?

•
관계형 데이터베이스는 M:N 관계를 직접 저장할 수 없습니다.
•
FK는 컬럼 하나에 값 하나만 담을 수 있는데, M:N은 양쪽 모두 값이 여러 개이기 때문입니다.
•
그래서 논리 모델에는 M:N이 존재할 수 있지만, 물리 모델에는 존재할 수 없습니다.
해소 전 — 표현할 방법이 없다
팀ID
팀명
상대팀ID
K01
성남일화천마
K02, K03, K04, … ⚠️
한 팀은 여러 팀과 경기하고, 그 상대 팀도 여러 팀과 경기합니다. TEAM 에 "상대팀ID" 컬럼을 만들면 한 칸에 여러 팀을 넣어야 함 = 다중값 속성 ❌
해소 후 — 가운데에 새 엔터티를 놓는다
💡 핵심 M:N 하나를 1:M 두 개로 쪼갭니다. 가운데 새로 생긴 엔터티를 교차 엔터티 / 연관 엔터티 (associative entity) 라고 부릅니다. 이 교차 엔터티는 대부분 행위 엔터티입니다.

2) 우리 실습 스키마의 SCHEDULE 이 바로 그 교차 엔터티다

경기일자
홈팀ID
원정팀ID
홈팀득점
원정팀득점
20120303
K01
K02
2
1
20120304
K03
K04
0
0
•
HOMETEAM_ID, AWAYTEAM_ID — TEAM 을 가리키는 FK가 두 개
•
HOME_SCORE, AWAY_SCORE — 관계 자체가 갖는 속성을 저장할 자리가 생겼다 (교차 엔터티의 장점!)

3) 교차 엔터티를 양쪽 모두와 조인하기 ★★

핵심 함정: 같은 TEAM 테이블을 역할이 다르므로 두 번 조인해야 합니다.
SELECT S.SCHE_DATE, H.TEAM_NAME AS 홈팀, S.HOME_SCORE, A.TEAM_NAME AS 원정팀, S.AWAY_SCORE, ST.STADIUM_NAME FROM SCHEDULE S, TEAM H, TEAM A, STADIUM ST -- TEAM 을 H(홈) / A(원정) 로 두 번 WHERE S.HOMETEAM_ID = H.TEAM_ID -- ① 교차 엔터티 → 홈팀 AND S.AWAYTEAM_ID = A.TEAM_ID -- ② 교차 엔터티 → 원정팀 AND S.STADIUM_ID = ST.STADIUM_ID; -- ③ 교차 엔터티 → 경기장
SQL
복사
경기일자
홈팀
홈득점
원정팀
원정득점
경기장
20120303
성남일화천마
2
수원삼성블루윙즈
1
성남종합운동장
⭐ 테이블 4개(S, H, A, ST) → 조인 조건 3개 (01강의 N-1 규칙) ⭐ 같은 테이블이라도 역할이 다르면 다른 별칭으로 여러 번 조인할 수 있습니다.

4) M:N 해소 요약

해소 전
해소 후
관계
팀 M : N 팀
팀 1:M 경기일정 M:1 팀
엔터티 수
1개
2개 (교차 엔터티 추가)
관계 자체의 속성(득점 등)
저장할 곳 없음 ❌
교차 엔터티에 저장 ⭕
물리 구현
불가능 ❌
가능 ⭕

5. 출제 포인트 한눈에 정리

#
꼭 외울 것
핵심
1
엔터티 조건 6가지
업무필요 / 유일식별 / 인스턴스 2개↑ / 프로세스이용 / 속성보유 / 관계보유
2
관계 없이도 엔터티인 예외
통계성 · 코드성 · 시스템 생성 엔터티
3
유무형 분류
유형 / 개념 / 사건
4
발생시점 분류
기본 / 중심 / 행위 (기본은 FK 없음)
5
속성 특성 분류
기본 / 설계 / 파생 (파생은 최소화)
6
파생 속성 계산
NULL이 끼면 결과는 NULL → NVL 필수
7
속성 분해 분류
단일 / 복합 / 다중값(반드시 분리)
8
관계 표기 3요소
관계명 / 차수 / 선택사양
9
관계 차수
1:1 / 1:M / M:N(물리 모델엔 없음)
10
선택사양 = 선택
FK NULL 허용 → OUTER JOIN 필요
11
M:N 해소
교차(연관) 엔터티 추가 → 1:M 두 개로 분해

6. 확인 문제

Q1. 엔터티가 갖추어야 할 조건으로 옳지 않은 것은? ① 업무에서 필요로 하는 정보여야 한다 ② 유일한 식별자로 식별이 가능해야 한다 ③ 인스턴스가 반드시 1개만 존재해야 한다 ④ 다른 엔터티와 최소 1개 이상의 관계가 있어야 한다
정답 보기
Q2. 다음 중 파생 속성에 해당하는 것은? ① 사원의 이름 ② 사원번호 ③ 월급여 × 12로 계산한 연봉 ④ 입사일자
정답 보기
Q3. 아래 데이터의 문제점과 해결 방법을 쓰시오.
선수ID
선수명
보유자격증
2012001
김철수
1급코치, 심판2급, 트레이너
2012002
이영희
1급코치
정답 보기
Q4. M:N 관계에 대한 설명으로 옳지 않은 것은? ① 논리적 데이터 모델에서는 표현할 수 있다 ② 물리적 데이터 모델에서도 그대로 구현할 수 있다 ③ 해소하면 1:M 관계 두 개로 분해된다 ④ 해소 시 생기는 엔터티를 교차(연관) 엔터티라 한다
정답 보기