
SQLD 자격증 공부를 시작하면서 1과목인 데이터 모델링의 이해부터 정리해 보려고 한다.
SQL 문법을 공부하기 전에 데이터를 어떻게 구조화하고, 데이터 간의 관계를 어떻게 표현하는지 이해하는 것이 중요하다.
이번 글에서는 공부하면서 헷갈리기 쉬운 개념을 중심으로 정리해 본다.
1. 데이터 모델링의 이해
1-1. 데이터 모델링이란?
현실 세계의 업무와 데이터를 분석하여 데이터베이스에 저장하고 관리할 수 있는 구조로 표현하는 과정이다.
예를 들어 쇼핑몰을 만든다고 생각해 보자.
- 고객은 어떤 정보를 가지고 있는가?
- 상품은 어떤 정보를 가지고 있는가?
- 고객은 어떻게 주문하는가?
- 하나의 주문에는 어떤 상품이 포함되는가?
이러한 업무 규칙을 분석하고 데이터 간의 관계를 정의하는 것이 데이터 모델링이다.
1-2. 데이터 모델링의 특징
| 특징 | 의미 |
| 추상화 | 현실 세계를 일정한 형식으로 간략하게 표현 |
| 단순화 | 복잡한 현실을 쉽게 이해할 수 있도록 단순하게 표현 |
| 명확화 | 모호하지 않게 의미를 명확하게 표현 |
1-3. 데이터 모델링의 3단계
| 단계 | 핵심 내용 |
| 개념적 모델링 | 업무의 핵심 데이터와 관계를 파악, 엔티티(Entity)와 그들 간의 관계(Relationship)을 나타내는 ERD 생성 |
| 논리적 모델링 | 각 엔터티의 속성, 식별자를 구체화, 정규화 수행 |
| 물리적 모델링 | 실제 DBMS에 맞게 테이블과 컬럼 등을 설계 |
예를 들어 쇼핑몰을 설계한다면 다음과 같다.
- 개념적 모델링: 고객과 주문이 존재한다.
- 논리적 모델링: 고객은 고객번호, 이름을 가지고 주문은 주문번호, 주문일자를 가진다.
- 물리적 모델링: 실제 DBMS에 맞게 테이블명, 컬럼 자료형, 인덱스 등을 결정한다.
즉, 개념은 큰 그림 → 논리는 상세 구조 → 물리는 실제 구현
1-4. 데이터 모델링 시 유의점
| 항목 | 의미 |
| 중복성 | 동일한 데이터가 여러 곳에 중복 저장되는 문제 |
| 비유연성 | 업무가 조금만 바뀌어도 데이터 모델을 크게 수정해야 하는 문제 |
| 비일관성 | 동일한 데이터가 서로 다른 값으로 관리되는 문제 |
중복이 많으면 데이터를 수정할 때 여러 곳을 변경해야 한다.
일부만 수정하면 서로 다른 값이 남아 데이터의 일관성이 깨질 수 있다.
따라서 데이터 모델링에서는 중복을 줄이고, 유연성과 일관성을 높이는 것이 중요하다.
1-5. 데이터 모델의 3가지 관점
| 관점 | 의미 | 표현 |
| 데이터 관점 | 업무에서 관리하는 데이터가 무엇인가? | What |
| 프로세스 관점 | 업무가 어떻게 수행되는가? | How |
| 상관관계 관점 | 데이터와 업무 처리 사이에 어떤 관계가 있는가? | Interaction |
예를 들어 주문 데이터 자체를 분석하는 것은 데이터 관점, 주문을 생성하고 취소하는 절차를 분석하는 것은 프로세스 관점이다.
1-6. 3단계 스키마 구조
| 스키마 | 설명 | 산출물 개수 | 사용자 |
| 외부 스키마 | 개별 사용자나 응용 프로그램의 관점 | 여러 개 | 사용자, 개발자 |
| 개념 스키마 | 데이터베이스 전체의 논리적 구조 | 1개 | Data Architect |
| 내부 스키마 | 데이터가 실제로 저장되는 물리적 구조 | 1개 | DB Administrator |
- 외부 스키마(External) : 각 사용자/앱이 보는 화면
- 개별 스키마(Conceptual) : 조직 전체가 공유하는 전사 ERD
- 내부 스키마(Internal) : 디스크 위 실제 저장 구조
1-7. 데이터 독립성
- 논리적 데이터 독립성: 개념 스키마가 변경되어도 외부 스키마에 미치는 영향을 최소화한다.
- 물리적 데이터 독립성: 내부 스키마가 변경되어도 개념 스키마에 미치는 영향을 최소화한다.
1-8. 좋은 데이터 모델의 특징
| 특징 | 설명 |
| 완전성 | 업무에 필요한 데이터를 모두 담았는가 |
| 중복 배제 | 같은 데이터가 여러 곳에 흩어져 있지 않은가 |
| 업무 규칙 | 회사 규칙이 모델에 녹아 있는가 |
| 데이터 재사용 | 다른 업무에서도 활용할 수 있는가 |
| 의사소통 | 보는 사람마다 같은 의미로 읽히는가 |
| 통합성 | 같은 데이터는 한 곳에 정의되어 있는가 |
2. 엔터티(Entity)
2-1. 엔터티란?
업무에 필요하고 지속적으로 관리해야 하는 데이터의 집합이다.
관계형 데이터베이스에서는 일반적으로 테이블로 구현되는 대상이라고 이해하면 쉽다.
예를 들어 고객, 상품, 주문 등이 엔터티가 될 수 있다.
즉, 엔터티는 인스턴트의 집합이다.
2-2. 엔터티의 주요 특징
- 업 : 업무에서 필요하고 관리해야 하는 정보여야 한다.
- 식 : 유일하게 식별할 수 있는 식별자가 있어야 한다.
- 인 : 일반적으로 두 개 이상의 인스턴스를 가져야 한다.
- 속 : 일반적으로 두 개 이상의 속성을 가져야 한다.
- 관 : 다른 엔터티와 관계를 가져야 한다. 단, 통계성 엔터티나 코드성 엔터티 등은 예외가 있을 수 있다.
여기서 "인스턴스"는 엔터티에 속하는 개별 데이터 한 건(row)을 의미한다.
예를 들어 고객 엔터티에 고객번호가 C001, C002인 데이터가 있다면 각 고객 데이터가 인스턴스다.
2-3. 엔터티의 분류
① 유형에 따른 분류
| 유형 | 설명 | 예시 |
| 유형 엔터티 | 물리적인 형태가 있는 대상 | 사원, 상품 |
| 개념 엔터티 | 물리적인 형태가 없는 개념 | 조직, 상품분류 |
| 사건 엔터티 | 업무 수행 중 발생하는 사건 | 주문, 청구 |
② 발생 시점에 따른 분류
| 유형 | 설명 | 예시 |
| 기본 엔터티 | 다른 엔터티에 의해 생성되지 않고 독립적으로 존재할 수 있음 | 고객, 부서 |
| 중심 엔터티 | 기본 엔터티를 바탕으로 발생하며 업무의 중심이 됨 | 주문, 계약 |
| 행위 엔터티 | 두 개 이상의 엔터티 간 관계에서 발생하는 데이터 | 주문상세, 사원변경이력 |
3. 속성(Attribute)
3-1. 속성이란?
엔터티가 가지는 세부적인 특성으로, 더 이상 의미상 분리하기 어려운 최소 단위의 데이터다.
예를 들어 고객 엔터티가 있다면 고객번호, 이름, 주소, 전화번호 등이 속성이 된다.
즉, 컬럼이다.
3-2. 속성의 분류
① 특성에 따른 분류
| 유형 | 설명 | 예시 |
| 기본 속성 | 업무에서 원래 존재하는 데이터를 바탕으로 정의 | 이름, 주소 |
| 설계 속성 | 모델링 과정에서 새롭게 정의한 속성 | 일련번호, 관리코드 |
| 파생 속성 | 다른 속성의 값을 계산하여 도출 | 합계, 평균 |
주의할 점은 기본 속성이라고 해서 반드시 외부에서 직접 입력받는 값만 의미하는 것은 아니라는 것이다.
업무에서 원래 존재하는 데이터를 바탕으로 정의된 속성인지가 중요하다.
파생 속성은 원본이 바뀌면 함께 갱신해야 해서 정합성 위험이 커지므로 최소화가 원칙이다.
② 구성 방식에 따른 분류
- 분해 가능 여부
- 단순 속성: 더 이상 의미상 분해하기 어려운 속성
- 복합 속성: 여러 구성 요소로 분해할 수 있는 속성
- 속성값 개수
- 단일값 속성: 하나의 인스턴스가 하나의 값을 가지는 속성
- 다중값 속성: 하나의 인스턴스가 여러 값을 가질 수 있는 속성
예를 들어 주소는 시·군·구와 상세 주소 등으로 나눌 수 있으므로 복합 속성이 될 수 있다.
고객의 취미는 여러 개를 가질 수 있으므로 다중값 속성이 될 수 있다.
3-3. 도메인(Domain)
속성이 가질 수 있는 값의 범위다.
예를 들어 나이 속성의 도메인을 0부터 150까지의 정수로 제한할 수 있다.
즉, 속성이 무엇을 의미하는지뿐만 아니라 어떤 값을 가질 수 있는지도 정의하는 것이다.
- T : 데이터 타입
- S : 크기
- C : 제약
4. 관계(Relationship)
4-1. 관계란?
엔터티와 엔터티 사이의 논리적인 연결이다.
예를 들어 고객은 주문을 하고, 주문은 상품을 포함한다.
4-2. 관계의 분류
- 식별 관계: 자식의 PK에 부모의 식별자가 포함됨 = 강한 종속
- 비식별 관계: 부모의 식별자가 자식의 일반 속성(FK)으로만 들어감 = 약한 종속
예를 들어 부서와 사원의 소속 관계는 존재 관계로, 고객과 주문의 주문 행위는 행위 관계로 이해할 수 있다.
4-3. 관계의 차수(Cardinality)
엔터티 간에 연결될 수 있는 인스턴스의 수를 나타낸다.
| 관계 | 의미 | 예시 |
| 1:1 | 하나의 인스턴스가 상대 엔터티의 하나와 관계 | 사원과 사물함 |
| 1:N | 하나의 인스턴스가 여러 인스턴스와 관계 | 부서와 사원 |
| M:N | 양쪽 모두 여러 인스턴스와 관계 | 학생과 과목 |
단, M:N 관계는 연결 엔터티를 이용해 두 개의 1:N 관계로 변환한다.
예를 들어 학생과 과목 사이에 수강 엔터티를 두면 학생 1 :N 수강, 과목 1:N 수강 구조로 표현할 수 있다.
4-4. 관계의 선택성
관계에 반드시 참여해야 하는지, 참여하지 않아도 되는지를 나타낸다.
- 필수 참여(Mandatory): 반드시 관계에 참여해야 한다.
- 선택 참여(Optional): 관계에 참여하지 않을 수도 있다.
예를 들어 모든 주문은 반드시 한 명의 고객에게 속한다고 정의할 수 있다. 반면 고객은 주문을 한 번도 하지 않았을 수 있다.
따라서 고객과 주문의 관계는 업무 규칙에 따라 고객 쪽은 선택 참여, 주문 쪽은 필수 참여가 될 수 있다.
5. 식별자(Identifier)
5-1. 식별자란?
엔터티에 속한 인스턴스를 유일하게 구분할 수 있도록 하는 속성 또는 속성의 조합이다. 테이블에서 Primary Key가 된다.
예를 들어 고객번호가 고객마다 유일하다면 고객번호를 식별자로 사용할 수 있다.
5-2. 주식별자의 특징
유일하게 구분하고, 최소한으로 구성하고, 변경되지 않으며, 반드시 존재해야 한다.
| 특징 | 의미 |
| 유일성 | 모든 인스턴스를 서로 구분할 수 있어야 한다. |
| 최소성 | 식별에 필요한 최소한의 속성으로 구성되어야 한다. |
| 불변성 | 한 번 정해진 식별자 값은 가능한 한 변경되지 않아야 한다. |
| 존재성 | 식별자 값이 반드시 존재해야 한다. 즉, NULL이 될 수 없다. |
5-3. 식별자의 분류
① 대표성에 따른 분류
- 주식별자: 엔터티의 인스턴스를 대표하여 식별하는 기준
- 보조식별자: 인스턴스를 식별할 수 있지만 주식별자로 선정되지는 않은 식별자
② 스스로 생성되는지에 따른 분류
- 내부식별자: 엔터티 내부에서 정의하고 사용하는 식별자
- 외부식별자: 다른 엔터티와의 관계를 통해 가져오는 식별자 = FK(외래키)
③ 속성 구성에 따른 분류
- 단일식별자: 하나의 속성으로 구성
- 복합식별자: 두 개 이상의 속성으로 구성
④ 대체 여부에 따른 분류
- 본질식별자: 업무적으로 의미가 있는 데이터를 바탕으로 식별자를 구성
- 인조식별자: 업무적으로 의미가 없는 별도의 값을 만들어 식별자로 사용
예를 들어 주문상세를 생각해 보자.
주문번호와 상품번호의 조합으로 주문상세를 구분할 수 있다면 복합식별자가 될 수 있다.
별도의 주문상세번호를 생성해 식별자로 사용한다면 인조식별자가 될 수 있다.
5-4. 식별자 관계와 비식별자 관계
- 식별자 관계 : 부모 엔터티의 주식별자가 자식 엔터티의 주식별자 구성에 포함되는 관계다.
- 비식별자 관계 : 부모 엔터티의 주식별자가 자식 엔터티에 일반 속성으로 전달되는 관계다.
| 구분 | 식별자 관계 | 비식별자 관계 |
| 부모의 주식별자 | 자식의 주식별자에 포함 | 자식의 일반 속성으로 사용 |
| 자식의 독립적인 식별 | 부모의 식별자에 의존하는 형태 | 자체 주식별자로 식별 가능 |
| 결론 | 부모의 키가 자식의 키가 됨 | 부모의 키가 자식의 일반 속성이 됨 |
마무리
이번 글에서는 SQLD 1과목인 데이터 모델링의 이해에서 다루는 주요 개념을 정리했다.
- 데이터 모델링: 현실의 업무와 데이터를 데이터베이스 구조로 표현하는 과정
- 엔터티와 속성: 관리해야 할 대상과 그 대상이 가지는 특성
- 관계: 엔터티 사이의 논리적인 연결
- 식별자: 각 인스턴스를 유일하게 구분하는 기준
이제 문제를 풀면서 실제 시험에서는 어떻게 출제되는지도 확인해 보려고 한다.
다음 글에서는 데이터의 중복을 줄이고 데이터의 일관성을 유지하기 위한 정규화(Normalization) 에 대해 정리해 보겠다.
'Language > SQL' 카테고리의 다른 글
| [SQL] CASE Statement (MySQL) (0) | 2024.02.06 |
|---|---|
| [SQL] JOIN 정리 (MySQL) (0) | 2024.01.14 |
| [SQL] Aggregate & Mathematical Function 정리 (MySQL) (2) | 2024.01.03 |
| [SQL] 문자열 비교함수 알아보기 (MySQL) (0) | 2023.12.21 |
| [SQL] date 타입에 대해 알아보기 (MySQL) (0) | 2023.12.14 |