Tech Trail

[SQLD] 1과목 데이터 모델링의 이해 (전체) 요약 정리 본문

IT Learning/SQLD(SQL 개발자)

[SQLD] 1과목 데이터 모델링의 이해 (전체) 요약 정리

_밍지_ 2023. 11. 17. 14:47
728x90
반응형
SMALL

모델링이 갖춰야 할 조건

  • 현실세계 반영
  • 단순화하여 표현
  • 관리하고자 하는 데이터를 모델로 설계

데이터베이스 모델링 세 가지 특징

  • 추상화
  • 단순화
  • 명확화

데이터 모델링 세 가지 관점

  • 데이터 관점
  • 프로세스 관점
  • 데이터와 프로세스의 상관 관점

데이터 모델링의 세 가지 단계

  • 개념적 데이터 모델링
  • 논리적 데이터 모델링
  • 물리적 데이터 모델링

데이터 모델링 유의사항(데이터 모델링을 할 때 지양해야 할 점)

  • 중복 -> 같은 데이터가 여러 엔터티에 중복되어 저장되지 않도록!
  • 비유연성 -> 어플리케이션과 데이터 간 연계성이 높으면, 어플리케이션 변경될 때마다 데이터 모델도 변경해야 함 ㅠㅠ 데이터 모델과 프로세스를 분리하여 유연성을 높여야 함!
  • 비일관성 -> 데이터 간 일관성을 유지하기 위해 상호 연관 관계 명확히!

ANSI-SPARC에서 정의한 3단계 스키마 구조

  • 외부 스키마: View 단계로 여러 개의 사용자 관점으로 구성되는 것
  • 개념 스키마: 모든 사용자 관점을 통합한 조직 전체 관점의 통합적인 표현
  • 내부 스키마: 물리적인 저장 구조를 나타내는 것

3단계 스키마 구조가 보장하는 독립성

  • 논리적 독립성: 개념 스키마가 변경되어도 외부 스키마는 영향받지 않음
  • 물리적 독립성: 내부 스키마가 변경되어도 외부/개념 스키마는 영향받지 않음

시스템 분석을 위한 모델링의 기능

  • 시스템이 향후 변화하고자 하는 모습으로 가시화
  • 시스템을 구축하는 과정에서 결정한 것을 문서화
  • 시스템을 구축하는 구조화된 틀 제공
  • 시스템의 구조와 행동을 명세화

💡TIP

  • 엔터티: Table
  • 인스턴스: Row
  • 속성: Column

엔터티 특징

  • 업무에서 쓰이는 정보여야 함
  • 유니크함을 보장할 수 있는 식별자가 있어야 함
  • 2개 이상의 인스턴스를 가지고 있어야 함
  • 반드시 속성을 가지고 있어야 함
  • 다른 엔터티와 1개 이상의 관계를 가지고 있어야 함

엔터티를 발생시점에 따라 분류

  • 기본 엔터티: 업무에 원래 존재하는 정보. 독립적으로 생성되어 자신만의 주식별자를 가지며 다른 엔터티의 부모 역할을 함 ex) 상품, 회원, 사원, 부서
  • 중심 엔터티: 기본 엔터티로부터 파생되어 많은 데이터를 갖게 되며 행위 엔터티를 생성 ex) 주문, 매출, 계약
  • 행위 엔터티: 두 개 이상의 부모 엔터티로부터 파생되고 보통 설계 초기 단계보다는 상세 설계 단계에서 많이 도출됨. 데이터가 자주 변경되거나 증가할 수 있음 ex) 주문 내역, 이벤트 응모 이력

유/무형에 따른 엔터티 분류

  • 유형 엔터티
  • 개념 엔터티
  • 사건 엔터티

엔터티의 이름 정할 때 주의할 점

  • 업무에서 실제로 쓰이는 용어 사용
  • 한글은 약어를 사용하지 않고, 영문은 대문자 표기
  • 단수 명사로 표현하고 띄어쓰기 X
  • 다른 엔터티와 의미상 중복될 수 없음(주문, 결제 엔터티는 중복 가능)
  • 해당 엔터티가 갖고 있는 데이터가 무엇인지 명확하게 표현

속성

  • 한 개의 엔터티는 두 개 이상의 인스턴스를 갖는다
  • 한 개의 인스턴스는 두 개 이상의 속성을 갖는다
  • 한 개의 속성은 하나의 속성값을 갖는다
  • 엔터티에 대한 구체적이고 명확한 정보를 나타낸다

속성_특성에 따른 분류

  • 기본속성: 업무 프로세스를 통해 바로 정의가 가능한 속성 ex) 상품이름, 상품가격, 주민등록번호
  • 설계속성: 업무에 존재하지는 않지만 설계하다 보니 필요하다고 판단되어 도출해낸 속성
  • 파생속성: 다른 속성의 속성값을 계산하거나 특정한 규칙으로 변형하여 생성한 속성 ex) 이벤트응모건수

속성_구성방식에 따른 분류

  • PK(Primary Key) 속성: 엔터티의 인스턴스들을 식별할 수 있는 속성 ex) 상품 엔터티의 상품코드, 학생 엔터티의 학번, 직원 엔터티의 사번
  • FK(Foreign Key) 속성: 다른 엔터티의 속성에서 가져온 속성 / 다른 엔터티와 관계를 맺게 해주는 매개체 역할을 하는 속성 ex) 직원 엔터티의 부서코드, 학생 엔터티의 학과코드, 회원 엔터티의 회원등급코드
  • 일반속성: PK, FK를 제외한 나머지 속성 ex) 상품 엔터티의 상품명, 가격, 학생 엔터티의 이름, 생년월일

도메인: 속성이 가질 수 있는 속성값의 범위

용어사전: 엔터티의 속성명을 정의할 때 명확한 의미를 부여하고 다른 엔터티와의 혼란을 방지하기 위해 이용

관계

  • 존재 관계: 엄아와 아기처럼 존재 자체로 연관성이 있는 관계 ex) 직원과 부서, 학생과 학과
  • 행위 관계: 특정한 행위를 함으로써 연관성이 생기는 관계 ex) 회원과 주문, 학생과 출석부

표기법

  • 관계명: 관계의 이름
  • 관계차수: 관계에 참여하는 수. 1:1, 1:M, M:N 형식으로 구분
  • 관계선택사양: 필수인지 선택인지의 여부

주식별자

  • 유일성: 각 인스턴스에 유니크함을 부여하여 식별이 가능하도록 한다
  • 최소성: 유일성을 보장하는 최소 개수의 속성이어야 한다
  • 불변성: 속성값이 되도록 변하지 않아야 한다
  • 존재성: 속성값이 NULL일 수 없다.

분류

대표성 여부

  • 주식별자: 유일성, 최소성, 불변성, 존재성을 가진 대표 식별자. 다른 엔터티와 참조 관계로 연결
  • 보조식별자: 인스턴스를 식별할 수는 있지만 대표 식별자가 아님. 다른 엔터티와 참조 관계로 연결 X

스스로 생성되었는지 여부

  • 내부식별자: 엔터티 내부에서 스스로 생성된 식별자
  • 외부식별자: 다른 엔터티에서 온 식별자, 다른 엔터티와의 연결고리 역할

단일 속성의 여부

  • 단일식별자: 하나의 속성으로 구성된 식별자
  • 복합식별자: 두 개 이상의 속성으로 구성된 식별자

대체 여부

  • 원조식별자: 업무 프로세스에 존재하는 식별자. 가공되지 않은 원래의 식별자(본질식별자)
  • 대리식별자: 주식별자의 속성이 두 개 이상인 경우 그 속성들을 하나로 묶어서 사용하는 식별자(인조식별자)

식별자 관계 VS 비식별자 관계

  • 식별자 관계: 부모 엔터티의 식별자가 자식 엔터티의 주식별자가 되는 관계. 주식별자는 반드시 존재해야 하므로 부모 엔터티가 있어야 생성 가능하며 단일식별자인지 복합식별자인지에 따라 1:1이거나 1:M이거나가 결정된다.
  • 비식별자 관계: 부모 엔터티의 식별자가 자식 엔터티의 주식별자가 아닌 일반 속성이 되는 관계이다. 일반 속성의 속성값은 NULL이 될 수 있으므로 부모 엔터티가 없는 자식 엔터티 생성이 가능하고 마찬가지의 이유로 자식 엔터티가 존재하는 상태에서 부모 엔터티가 삭제될 수 있다.
식별자 관계
비식별자 관계
강한 관계
약한 관계
부모 엔터티의 식별자가 자식 엔터티의 주식별자
부모 엔터티의 식별자가 자식 엔터티의 일반속성
부모 엔터티가 있어야 생성 가능
부모 엔터티 없는 자식 엔터티 생성 가능
실선으로 표현
점선으로 표현

ERD 작성 순서

  • 엔터티를 그린다
  • 엔터티를 적절하게 배치한다
  • 엔터티 간의 관계를 나타낸다
  • 관계명을 정의한다
  • 관계의 참여도를 나타낸다
  • 관계의 필수 여부를 나타낸다

ERT 표기법 - IE/Crow's Foot(까마귀 발) 표기법

  • 까마귀 발 기호는 2개 이상을 의미
  • 엔터티는 사각형으로 표기
  • 해시 마크( | )는 1개를 의미
  • 점선은 비식별자 관계를 의미

성능 데이터 모델링: 데이터베이스의 성능을 향상시키기 위해 설계 단계부터 성능과 관련된 사항들이 모델링에 반영될 수 있도록 하는 것. 성능 데이터 모델링의 방법으로는 정규화, 반정규화, 테이블통합, 테이블 분할 등이 있음

성능 데이터 모델링의 순서

  • 데이터 모델에 맞게 정규화를 수행한다
  • 데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토
  • 용량과 트랜잭션 유형에 맞게 반정규화를 수행
  • 성능 향상을 위한 이력모델의 조정, PK/FK 조정, 슈퍼/서브타입 조정 등을 수행
  • 데이터 모델의 성능 점검

정규화

  • 데이터의 무결성을 보장하기 위해 수행
  • 데이터에 대한 중복성을 제거한다
  • 정규화를 할수록 엔터티가 증가하므로 JOIN으로 인한 조회 성능 저하가 발생할 수 있다.
  • 데이터 입력, 수정, 삭제 성능이 향상된다

정규화

  • 제1정규형: 모든 속성은 반드시 하나의 값만 가져야 한다. 유사한 속성이 반복되는 경우도 1차 정규화의 대상이 된다.
  • 제2정규형: 엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다. ex) 주식별자가 주문번호와 음료코드인데, 일반속성인 음료명이 주식별자 중 음료코드 속성에만 종속
  • 제3정규형: 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다. ex) 일반속성인 소속사명이 다른 일반속성인 소속사코드에 종속

반정규화

  • 데이터에 대한 중복을 허용하거나 데이터를 그룹핑한다
  • 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며 데이터 정합성 이슈가 발생할 수 있다
  • 반정규화는 모든 정규화를 마친 후 성능상 이슈가 있을 때만 고려한다

반정규화_(1)테이블 반정규화

테이블 병합: 두 개 이상의 엔터티를 합체하는 것. 테이블의 관계가 강결합이어서 같이 조회되는 경우가 대부분일 경우 비정규화를 고려

  • 1:1 관계 테이블 병합: 비교적 판단하기 수월하며 부작용도 적다
  • 1:M 관계 테이블 병합: 많은 중복 데이터를 발생시키므로 주의가 필요
  • 슈퍼 서브 타입 테이블 병합

테이블 분할

  • 테이블 수직 분할(속성 분할): 테이블의 일부 속성을 별도의 테이블로 분리하는 것. 한 개의 블록에 더 많은 인스턴스를 저장할 수 있게 됨. 수직 분할하면 1:1 관계의 테이블이 두 개 생김. 속성의 사용 빈도나 속성값의 NULL 여부를 기준으로 분할할 수 있음
  • 테이블 수평 분할(인스턴스 분할, 파티셔닝): 테이블의 특정 인스턴스를 별도의 테이블로 분할. 데이터베이스의 파티셔닝 기법을 주로 이용. 테이블 수평 분할을 할 경우 관계가 없는 다수의 테이블이 생성됨. 테이블 수평 분할의 기준은 주로 기간이지만 다른 속성이 될 수도 있음

테이블 추가

  • 중복 테이블 추가: 특정 범위의 많은 데이터를 자주 처리해야 하는 경우, 정규화로 인한 성능 감소가 발생한 경우, 미리 계산된 값을 저장해둠으로써 어플리케이션 성능을 향상시키려는 경우
  • 통계 테이블 추가
  • 이력 테이블 추가
  • 부분 테이블 추가

반정규화_(2)칼럼 반정규화

중복 컬럼 추가: 업무 프로세스상 JOIN이 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려

파생 컬럼 추가: 프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식 ex) 상품의 재고, 프로모션 적용 할인가

이력 테이블 컬럼 추가: 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기분이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식 ex)최신 데이터 여부

반정규화_(3)중복관계 추가: 업무 프로세스상 JOIN이 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려. 데이터 무결성을 깨뜨릴 위험성 없이 데이터 처리 성능을 향상시킬 수 있는 기법

트랜잭션: 데이터를 조작하기 위한 논리적인 작업 단위로, 데이터 모델로 표현할 수 있으며 데이터는 트랜잭션 범위로 묶일 수 있음. 하나의 커밋 단위로 묶여야 한다!

NULL 연산

  • NULL이 포함된 사칙연산의 결과는 항상 NULL
  • 데이터를 집계할 때 NULL은 집계 대상에서 제외
  • WHERE COL IS NULL 조건은 COL 값이 NULL인 행을 반환하지만, COL=NULL의 결과는 항상 False이므로 WHERE COL = NULL 조건은 아무 행도 반환하지 않음
  • WHERE COL IS NOT NULL 조건은 COL이 NULL이 아닌 행만 출력하는 조건

Q. 다음 SQL 결과로 가장 적절한 것은 무엇인가?

SELECT SUM(COL1), SUM(COL2) FROM SAMPLE WHERE COL2 > 5;
COL1
COL2
10
5
20
NULL
NULL
15

<답>

COL1
COL2
NULL
15

<해설> NULL과의 비교 연산 결과는 늘 NULL이기 때문에 COL2 > 5 조건을 만족하는 행은 세 번째 행만 해당

Q. 다음 SQL의 결과로 가장 적절한 것은 무엇인가?

SELECT SUM(COL1), SUM(COL2)
   FROM SAMPLE
WHERE COL2 IS NOT NULL;

[SAMPLE 테이블]

COL1
COL2
10
5
20
NULL
NULL
15

<답>

COL1
COL2
10
20

<해설> NULL이 포함된 집계 함수는 NULL을 제외하고서 계산된다.

728x90
반응형
LIST