Back to Notes

Notes

DB 05. ER 모델과 설계

데이터베이스 설계 단계, ER 모델의 구성 요소, 카디날리티와 참여 제약조건, 회사 예제 ER 스키마, ER 스키마를 관계형 릴레이션으로 사상하는 규칙을 정리한다.

Published
Updated
Area
Databases
Type
concept
Series
Database System
Category
Notes
database-designER-modelconceptual-designlogical-designcardinalityweak-entityrelationship-mapping

개요

데이터베이스 설계는 실세계 업무 요구사항을 분석해, 데이터베이스에서 관리할 대상과 그 관계를 구조화하는 과정이다. 이 장의 핵심은 다음 흐름으로 정리할 수 있다.

요구사항 분석
→ 개념적 설계, ER model
→ DBMS 선정
→ 논리적 설계, relational schema
→ 스키마 정제, normalization
→ 물리적 설계, index / storage / tuning

ER model은 개념적 설계 단계에서 실세계를 entity, attribute, relationship으로 표현하는 모델이다. 이후 논리적 설계 단계에서 ER schema를 relational model의 relation들로 사상한다.


1. 데이터베이스 설계의 큰 흐름

데이터베이스 설계는 단순히 table을 만드는 작업이 아니다. 조직에서 어떤 데이터를 관리해야 하는지, 데이터 사이에 어떤 관계가 있는지, 어떤 제약조건이 필요한지를 체계적으로 정리하는 과정이다.

단계핵심 질문결과물
요구사항 분석어떤 데이터를 저장하고 어떤 연산을 지원해야 하는가?요구사항 명세
개념적 설계실세계의 entity, relationship, constraint는 무엇인가?ER schema
DBMS 선정어떤 DBMS를 사용할 것인가?DBMS 선택
논리적 설계ER schema를 어떤 relation들로 바꿀 것인가?relational schema
스키마 정제중복과 이상 현상을 줄였는가?normalized schema
물리적 설계어떻게 저장하고 빠르게 접근할 것인가?index, storage, tuning 전략

좋은 database design은 다음 조건을 만족해야 한다.

  • 시간의 흐름에 따른 데이터의 중요한 측면을 표현한다.
  • 데이터 중복을 최소화한다.
  • 효율적인 접근을 제공한다.
  • 데이터 무결성을 유지한다.
  • 사용자와 개발자가 이해하기 쉬운 구조를 가진다.

주의할 점: 요구사항 분석 직후 바로 table을 만들면, 실세계의 관계와 제약조건이 빠질 수 있다. 먼저 ER model로 개념적 구조를 명확히 잡고, 그다음 relational schema로 변환하는 것이 안정적이다.


2. ER model의 기본 관점

ER model은 Entity-Relationship Model이다. 실세계를 다음 세 요소로 표현한다.

구성 요소의미ER diagram 표기
entity독립적으로 존재하고 식별 가능한 실세계 객체rectangle
attributeentity나 relationship을 설명하는 속성oval
relationshipentity들 사이의 연관diamond

예를 들어 회사 업무를 ER model로 표현하면 다음처럼 생각할 수 있다.

EMPLOYEE
 ├─ Empno
 ├─ Empname
 ├─ Title
 └─ Salary

DEPARTMENT
 ├─ Deptno
 ├─ Deptname
 └─ Floor

EMPLOYEE ─ BELONGS ─ DEPARTMENT

여기서 EMPLOYEE, DEPARTMENT는 entity type이고, Empno, Empname, Deptno 등은 attribute이며, BELONGS는 relationship type이다.


3. Entity와 entity type

entity는 사람, 장소, 사물, 사건처럼 독립적으로 존재하면서 고유하게 식별 가능한 객체다. entity type은 동일한 attribute들을 가진 entity들의 틀이다.

Entity type: EMPLOYEE(Empno, Empname, Title, Salary)
Entity examples:
- (1001, Kim, Staff, 3000)
- (1002, Lee, Manager, 4200)

관계 모델과 연결하면 다음처럼 볼 수 있다.

ER modelRelational model
entity typerelation의 intension, schema
entity setrelation의 extension, instance

ER diagram에서 entity type은 rectangle로 표현한다.


4. Attribute의 종류

attribute는 entity나 relationship을 설명하는 속성이다. ER model에서는 attribute의 성격에 따라 여러 종류로 구분한다.

종류의미예시관계형 변환 시 주의점
simple attribute더 이상 나눌 수 없는 속성Name, Salary그대로 column
composite attribute여러 하위 속성으로 구성Address(City, Ku, Dong)구성 속성만 column으로 사용
single-valued attributeentity 하나당 값 하나Empno그대로 column
multi-valued attributeentity 하나당 여러 값Hobby, Location별도 relation으로 분리
stored attribute직접 저장되는 속성Birthdate, Salary그대로 저장
derived attribute다른 값에서 계산되는 속성Age보통 저장하지 않음
key attributeentity를 고유 식별Empno, Deptnoprimary key

예를 들어 EMPLOYEE의 attribute를 다음처럼 분석할 수 있다.

EMPLOYEE
 ├─ Empno       → key attribute
 ├─ Empname     → simple, single-valued, stored attribute
 ├─ Salary      → simple, single-valued, stored attribute
 ├─ Address     → composite attribute
 │   ├─ City
 │   ├─ Ku
 │   └─ Dong
 ├─ Hobby       → multi-valued attribute
 └─ Age         → derived attribute

AgeBirthdate나 주민등록번호에서 계산할 수 있으므로 derived attribute다. 이런 값은 시간이 지나면 자동으로 변해야 하므로 relation의 attribute로 직접 저장하지 않는 것이 일반적으로 좋다.


5. Strong entity와 weak entity

Strong entity type

strong entity type은 독립적으로 존재하고, 자기 자신의 key attribute만으로 entity를 고유하게 식별할 수 있는 entity type이다. regular entity type이라고도 한다.

EMPLOYEE(Empno, Empname, Title, Salary)

여기서 Empno가 사원을 고유하게 식별한다면 EMPLOYEE는 strong entity type이다.

Weak entity type

weak entity type은 자기 자신의 attribute만으로는 key를 만들 수 없는 entity type이다. 반드시 owner entity type 또는 identifying entity type이 필요하다.

대표 예시는 DEPENDENT다.

EMPLOYEE
 └─ Empno

DEPENDENT
 ├─ Depname
 └─ Sex

Depname만으로는 회사 전체의 부양가족을 고유하게 식별할 수 없다.

사원 1001의 부양가족: 민수
사원 1002의 부양가족: 민수

따라서 DEPENDENT는 다음 조합으로 식별된다.

DEPENDENT의 식별자 = Empno + Depname

여기서 Depnamepartial key다. 한 사원 내부에서는 부양가족을 구분할 수 있지만, 회사 전체에서는 고유하지 않기 때문이다.

개념설명
weak entity type자체 attribute만으로 식별 불가
owner entity typeweak entity의 식별을 도와주는 entity type
identifying relationshipweak entity와 owner entity를 연결하는 관계
partial keyweak entity 내부에서 부분적으로 구분 가능한 attribute

검증 포인트: weak entity는 owner entity 없이는 존재할 수 없으므로 identifying relationship에 total participation한다.


6. Relationship과 relationship attribute

relationship은 entity들 사이의 연관이다. 요구사항 명세에서 동사로 나타나는 표현이 relationship 후보가 되는 경우가 많다.

사원은 부서에 속한다.
→ EMPLOYEE ─ BELONGS ─ DEPARTMENT

사원은 프로젝트에서 일한다.
→ EMPLOYEE ─ WORKS_FOR ─ PROJECT

공급자는 부품을 프로젝트에 공급한다.
→ SUPPLIER ─ SUPPLIES ─ PART ─ PROJECT

relationship도 attribute를 가질 수 있다. 중요한 판단 기준은 다음이다.

어떤 값이 entity 하나의 속성이 아니라
entity들의 조합에 따라 결정된다면
그 값은 relationship attribute일 가능성이 높다.

예를 들어 WORKS_FOR 관계에서 Duration, Responsibility는 relationship attribute다.

EMPLOYEE ─ WORKS_FOR ─ PROJECT
              ├─ Duration
              └─ Responsibility

한 사원이 여러 프로젝트에서 서로 다른 역할과 기간으로 일할 수 있으므로, 이 값들은 EMPLOYEE의 속성도 아니고 PROJECT의 속성도 아니다. EMPLOYEE-PROJECT 조합의 속성이다.


7. Cardinality ratio와 participation constraint

Cardinality ratio

cardinality ratio는 entity 하나가 relationship에 몇 번까지 참여할 수 있는지를 나타낸다.

유형의미예시
1:1한쪽 하나가 반대쪽 하나와만 연결사원과 전용 PC
1:N한쪽 하나가 반대쪽 여러 개와 연결부서와 사원
M:N양쪽 모두 여러 개와 연결사원과 프로젝트

예를 들어 DEPARTMENTEMPLOYEE는 일반적으로 1:N 관계다.

한 부서에는 여러 사원이 속할 수 있다.
한 사원은 한 부서에만 속한다.

DEPARTMENT 1 : N EMPLOYEE

EMPLOYEEPROJECTM:N 관계다.

한 사원은 여러 프로젝트에서 일할 수 있다.
한 프로젝트에는 여러 사원이 일할 수 있다.

EMPLOYEE M : N PROJECT

(min, max) notation

카디날리티를 더 정확히 표현할 때 (min, max)를 사용한다.

표기의미
(0, 1)참여하지 않아도 되고, 참여한다면 최대 1번
(1, 1)반드시 1번 참여
(0, *)참여하지 않아도 되고, 여러 번 참여 가능
(1, *)최소 1번 참여, 여러 번 참여 가능

Participation constraint

participation constraint는 entity가 relationship에 반드시 참여해야 하는지를 나타낸다.

제약조건의미ER diagram 표기
total participation모든 entity가 반드시 관계에 참여double line
partial participation일부 entity만 관계에 참여해도 됨single line

예를 들어 모든 부서가 반드시 관리자를 가져야 한다면 DEPARTMENTMANAGES 관계에 total participation한다. 반면 모든 사원이 관리자가 되는 것은 아니므로 EMPLOYEE는 partial participation한다.

EMPLOYEE ─ MANAGES == DEPARTMENT

주의할 점: 1:1, 1:N, M:N은 최대 연결 수에 관한 제약이고, total/partial participation은 관계 참여의 필수 여부에 관한 제약이다. 두 개념을 섞으면 안 된다.


8. Role, multiple relationship, recursive relationship

Role

role은 relationship 안에서 entity가 맡는 의미를 구분하는 이름이다. 특히 하나의 entity type이 같은 relationship에 두 번 참여할 때 필수적이다.

EMPLOYEE ─ SUPERVISES ─ EMPLOYEE

이 구조만 보면 어느 쪽이 감독자인지 알 수 없다. 따라서 role을 붙인다.

Supervisor 역할의 EMPLOYEE
Supervisee 역할의 EMPLOYEE

Multiple relationship

두 entity type 사이에 서로 다른 relationship type이 여러 개 존재할 수 있다.

EMPLOYEE ─ WORKS_FOR ─ PROJECT
EMPLOYEE ─ MANAGES   ─ PROJECT

둘 다 EMPLOYEEPROJECT 사이의 relationship이지만 의미가 다르다.

Relationship의미CardinalityRelationship attribute
WORKS_FOR사원이 프로젝트에서 일함M:NDuration, Responsibility
MANAGES사원이 프로젝트를 관리함1:1StartDate

Recursive relationship

recursive relationship은 하나의 entity type이 자기 자신과 relationship을 맺는 경우다.

PART ─ CONTAINS ─ PART

부품이 다른 부품들로 구성될 수 있다면, 같은 PART entity type이 상위 부품과 하위 부품의 역할로 동시에 참여한다.

상위 PART ─ CONTAINS ─ 하위 PART

9. Ternary relationship

ternary relationship은 세 개의 entity type이 하나의 relationship에 동시에 참여하는 경우다. 단순히 binary relationship 세 개로 나눌 수 없는 경우가 많다.

대표 예시는 SUPPLIES다.

SUPPLIER
   |
SUPPLIES ─ PROJECT
   |
PART

요구사항은 다음과 같다.

공급자가 어떤 부품을 어떤 프로젝트에 얼마나 공급하는가를 나타낸다.

이 사실은 세 entity가 모두 정해져야 완성된다.

Quantity = f(Supplier, Project, Part)

QuantitySUPPLIER의 attribute도 아니고, PROJECT의 attribute도 아니며, PART의 attribute도 아니다. SUPPLIER-PROJECT-PART 조합의 attribute이므로 SUPPLIES relationship의 attribute다.

왜 binary relationship으로 나누면 위험한가?

원래 데이터가 다음과 같다고 하자.

S1이 ProjectA에 PartX를 100개 공급
S1이 ProjectB에 PartY를 200개 공급

이를 binary relationship으로 나누면 다음 정보만 남는다.

S1 - ProjectA
S1 - ProjectB
S1 - PartX
S1 - PartY
ProjectA - PartX
ProjectB - PartY

이 정보들을 다시 조합하면 원래 존재하지 않던 다음 관계가 생길 수 있다.

S1이 ProjectA에 PartY를 공급했다
S1이 ProjectB에 PartX를 공급했다

따라서 세 요소가 동시에 하나의 업무 사실을 구성한다면 ternary relationship을 유지해야 한다.


10. 회사 예제 ER schema 정리

회사 설계 예제에서 식별되는 주요 entity type은 다음과 같다.

Entity type주요 attribute특징
EMPLOYEEEmpno, Empname, Title, Salary, Address(City, Ku, Dong)strong entity
PROJECTProjno, Projname, Budget, LocationLocation은 multi-valued attribute
DEPARTMENTDeptno, Deptname, Floorstrong entity
SUPPLIERSuppno, Suppname, Creditstrong entity
DEPENDENTDepname, Sexweak entity
PARTPartno, Partname, Pricerecursive relationship 참여

주요 relationship은 다음과 같다.

Relationship참여 entity의미유형Relationship attribute
BELONGSEMPLOYEE - DEPARTMENT사원이 부서에 속함N:1없음
WORKS_FOREMPLOYEE - PROJECT사원이 프로젝트에서 일함M:NDuration, Responsibility
MANAGESEMPLOYEE - PROJECT사원이 프로젝트를 관리함1:1StartDate
POLICYEMPLOYEE - DEPENDENT사원이 부양가족을 가짐identifying relationship없음
CONTAINSPART - PART부품이 하위 부품을 포함함recursive relationship없음
SUPPLIESSUPPLIER - PROJECT - PART공급자가 프로젝트에 부품을 공급함ternary relationshipQuantity

검증 포인트는 다음이다.

  • DEPENDENT는 weak entity type이다.
  • PROJECT.Location은 multi-valued attribute다.
  • WORKS_FORMANAGES는 같은 entity 사이의 서로 다른 relationship이다.
  • SUPPLIES는 ternary relationship이며, Quantity는 relationship attribute다.

11. ER schema를 relation으로 사상하는 7단계

논리적 설계 단계에서는 ER schema를 relational model의 relation들로 사상한다. ER model에서는 entity type과 relationship type을 구분하지만, relational database에서는 relation만 존재한다.

단계사상 대상사상 규칙
1regular entity typerelation 하나 생성
2weak entity typerelation 생성, owner key를 foreign key로 포함
3binary 1:1 relationship한쪽 relation에 다른 쪽 key를 foreign key로 포함
4binary 1:N relationshipN쪽 relation에 1쪽 key를 foreign key로 포함
5binary M:N relationshiprelationship relation 새로 생성
6ternary 이상의 relationshiprelationship relation 새로 생성
7multi-valued attribute별도 relation 생성

12. 사상 규칙별 세부 정리

단계 1: Regular entity type

각 regular entity type에 대해 relation을 하나 만든다. simple attribute는 그대로 포함하고, composite attribute는 구성 simple attribute만 포함한다.

EMPLOYEE(Empno, Empname, Title, City, Ku, Dong, Salary)
PROJECT(Projno, Projname, Budget)
DEPARTMENT(Deptno, Deptname, Floor)
SUPPLIER(Suppno, Suppname, Credit)
PART(Partno, Partname, Price)

PROJECT.Location은 multi-valued attribute이므로 이 단계에서 PROJECT relation에 넣지 않는다.

단계 2: Weak entity type

weak entity type은 owner entity의 key를 foreign key로 가져오고, partial key와 결합해 primary key를 만든다.

DEPENDENT(Empno, Depname, Sex)
PK = (Empno, Depname)
FK = Empno → EMPLOYEE(Empno)

단계 3: Binary 1:1 relationship

1:1 relationship은 한쪽 relation에 다른 쪽 relation의 key를 foreign key로 포함한다. 가능하면 total participation하는 쪽을 선택한다. relationship attribute도 선택된 relation에 넣는다.

회사 예제에서는 MANAGESPROJECT에 반영한다.

PROJECT(Projno, Projname, Budget, StartDate, Manager)
Manager → EMPLOYEE(Empno)

StartDateMANAGES relationship의 attribute다.

단계 4: Binary 1:N relationship

1:N relationship은 N쪽 relation에 1쪽의 key를 foreign key로 넣는다.

EMPLOYEE(Empno, Empname, Title, City, Ku, Dong, Salary, Dno)
Dno → DEPARTMENT(Deptno)

PART의 recursive relationship인 CONTAINS도 자기 참조 foreign key 방식으로 표현할 수 있다.

PART(Partno, Partname, Price, Subpartno)
Subpartno → PART(Partno)

단계 5: Binary M:N relationship

M:N relationship은 새로운 relation을 만든다. 참여 entity들의 key를 foreign key로 포함하고, 그 조합을 primary key로 사용한다. relationship attribute도 이 relation에 포함한다.

WORKS_FOR(Empno, Projno, Duration, Responsibility)
PK = (Empno, Projno)
FK = Empno → EMPLOYEE(Empno)
FK = Projno → PROJECT(Projno)

단계 6: Ternary 이상의 relationship

ternary relationship도 새로운 relation을 만든다. 참여 entity들의 key를 모두 foreign key로 포함하고, relationship attribute도 포함한다.

SUPPLY(Suppno, Projno, Partno, Quantity)
PK = (Suppno, Projno, Partno)
FK = Suppno → SUPPLIER(Suppno)
FK = Projno → PROJECT(Projno)
FK = Partno → PART(Partno)

QuantitySUPPLIES relationship의 attribute다.

단계 7: Multi-valued attribute

multi-valued attribute는 별도 relation으로 분리한다.

PROJ_LOC(Projno, Location)
PK = (Projno, Location)
FK = Projno → PROJECT(Projno)

13. 회사 예제 최종 relational schema

회사 ER schema는 최종적으로 다음 9개의 relation으로 사상된다.

EMPLOYEE(Empno, Empname, Title, City, Ku, Dong, Salary, Dno)

PROJECT(Projno, Projname, Budget, StartDate, Manager)

DEPARTMENT(Deptno, Deptname, Floor)

SUPPLIER(Suppno, Suppname, Credit)

PART(Partno, Partname, Price, Subpartno)

DEPENDENT(Empno, Depname, Sex)

WORKS_FOR(Empno, Projno, Duration, Responsibility)

SUPPLY(Suppno, Projno, Partno, Quantity)

PROJ_LOC(Projno, Location)

각 relation의 출처는 다음과 같다.

RelationER model에서 온 대상사상 단계
EMPLOYEEregular entity + BELONGS 반영1, 4
PROJECTregular entity + MANAGES 반영1, 3
DEPARTMENTregular entity1
SUPPLIERregular entity1
PARTregular entity + CONTAINS 반영1, 4
DEPENDENTweak entity2
WORKS_FORbinary M:N relationship5
SUPPLYternary relationship6
PROJ_LOCmulti-valued attribute7

14. 자칫 실수하기 쉬운 부분

1:N과 M:N의 변환 방식 혼동

1:N은 새로운 relation을 만들지 않고, 보통 N쪽에 foreign key를 추가한다.

DEPARTMENT 1 : N EMPLOYEE
→ EMPLOYEE에 Dno 추가

반면 M:N은 반드시 relationship relation을 새로 만든다.

EMPLOYEE M : N PROJECT
→ WORKS_FOR(Empno, Projno, Duration, Responsibility)

Relationship attribute를 entity attribute로 잘못 넣는 경우

Duration, Responsibility, StartDate, Quantity는 relationship의 attribute다.

Attribute붙는 위치이유
DurationWORKS_FOR사원-프로젝트 조합에 따라 결정
ResponsibilityWORKS_FOR사원-프로젝트 조합에 따라 결정
StartDateMANAGES사원-프로젝트 관리 관계에 따라 결정
QuantitySUPPLIES공급자-프로젝트-부품 조합에 따라 결정

Ternary relationship을 binary relationship으로 분해하는 경우

SUPPLIESSUPPLIER, PROJECT, PART 세 entity가 모두 있어야 의미가 완성된다. 이를 binary relationship들로 나누면 존재하지 않는 공급 사실이 조합될 수 있다.

Multi-valued attribute를 한 column에 넣는 경우

PROJECT.Location처럼 여러 값을 가질 수 있는 attribute를 하나의 column에 넣으면 relation의 원자성 원칙에 어긋난다.

나쁜 형태:
PROJECT(Projno, Projname, Budget, Location)

좋은 형태:
PROJECT(Projno, Projname, Budget)
PROJ_LOC(Projno, Location)

Weak entity의 primary key를 partial key만으로 잡는 경우

DEPENDENTDepname만 primary key로 잡으면 이름 중복을 처리할 수 없다.

잘못된 key:
PK = Depname

올바른 key:
PK = (Empno, Depname)

15. 요약

ER model은 database conceptual design을 위한 모델이다. 실세계를 entity, attribute, relationship으로 표현하고, cardinality ratio와 participation constraint로 업무 규칙을 명확히 한다.

핵심 구분은 다음과 같다.

구분핵심 판단 기준
entity vs attribute독립적으로 관리할 대상인가, 다른 대상의 속성인가?
strong entity vs weak entity자기 key만으로 식별 가능한가?
simple vs composite attribute더 작은 속성으로 나눌 수 있는가?
single-valued vs multi-valued attributeentity 하나당 값이 하나인가 여러 개인가?
relationship attribute값이 entity 조합에 따라 결정되는가?
1:N vs M:N한쪽에 foreign key로 충분한가, 별도 relation이 필요한가?
binary vs ternary relationship두 entity만으로 사실이 완성되는가, 세 entity가 동시에 필요한가?

ER schema를 relational schema로 사상할 때는 다음 규칙을 우선 기억하면 된다.

regular entity → relation
weak entity → relation + owner key
1:1 relationship → 한쪽에 foreign key
1:N relationship → N쪽에 foreign key
M:N relationship → 새 relation
ternary relationship → 새 relation
multi-valued attribute → 새 relation

이 장의 핵심은 ER diagram을 그리는 것에서 끝나지 않는다. ER schema를 relational model로 사상할 때 어떤 요소가 table이 되고, 어떤 요소가 foreign key가 되며, 어떤 요소가 relationship relation으로 분리되는지까지 연결해서 이해해야 한다.