데이터 입출력 구현 - 논리 데이터 저장소 확인

뿌엑·2022년 4월 3일
0

정보처리기사

목록 보기
7/20

데이터 모델

  • 데이터 모델은 현실 세계의 정보를 인간과 컴퓨터가 이해할 수 있도록 추상화하여 표현한 모델이다.
  • 데이터 모델에 표시할 요소엔 논리적 데이터 구조, 연산, 제약조건이 있다.
  • 데이터 모델 절차는 개념적 데이터 모델, 논리적 데이터 모델, 물리적 데이터 모델 순이다.
  1. 개념적 데이터 모델
    • 현실 세계에 대한 인식을 추상적, 개념적으로 표현하여 개념적 구조를 도출하는 데이터 모델
    • 트랜잭션 모델링, View 통합 방법 및 Attribute 합성 고려
    • 개념적 데이터 모델은 DB 종류와 무관함
    • 주요 산출물로 개체관계 다이어그램(ERD)이 있음
  2. 논리적 데이터 모델
    • 객체와 관계로 정의된 개념적 데이터 구조를 데이터베이스가 채택한 논리적 데이터 모델을 사용하여 논리적 데이터 구조로 표현하는 과정
    • 논리로 구성되어 있어 어떤 물리적 저장구조에 의한 구현을 의미하진 않는다.
    • 논리적 데이터 모델의 종류
      • 관계 데이터 모델(Relational Data Model)
      • 계층 데이터 모델(Hierarchical Data Model)
      • 네트워크 데이터 모델(Network Data Model)
      • 객체지향 데이터 모델(Object-oriented Data Model)
      • 객체-관계 데이터 모델(Object-relational data Model)
  3. 물리적 데이터 모델
    • 논리 데이터 모델을 DBMS의 특성 및 성능을 고려하여 구체화시킨 모델
    • 응답시간, 저장 공간의 효율성, 트랜잭션 처리를 고려하여 설계

관계 데이터 모델

  • 관계 데이터 모델은 데이터를 행과 열로 구성된 2차원 테이블 형태로 구성한 모델이다.

관계형 데이터 모델의 구성요소

  • 릴레이션: 행(Row)과 열(Column)로 구성된 테이블
  • 튜플(Tuple): 릴레이션의 행에 해당하는 요소, 레코드(Record), 행(Row)이라고도 한다.
  • 속성(Attribute): 릴레이션의 열에 해당하는 요소, 필드(Field), 열(Column)이라고도 한다.
  • 카디널리티(Cardinality): 튜플의 수
  • 차수(Degree): 속성(=column)의 수
  • 스키마(Schema): 데이터베이스의 구조, 제약조건 등의 정보를 담고 있는 기본적인 구조
  • 인스턴스(Instance): 정의된 스키마에 따라 생성된 테이블에 실제 저장된 데이터의 집합

관계형 데이터 모델의 표현

  • 데이터 간 관계를 기본 키와 이를 참조하는 외래 키로 표현한다.
  • 테이블 간 관계를 1:1, 1:N, M:N 관계로 목적에 맞게 표현한다.

논리 데이터 모델링 속성

  • 개체(Entity): 관리할 대상이 되는 실체(사물, 사건)
  • 속성(Attributes): 개체가 지닌 요소 또는 성질
  • 관계(Relationship): 두 개체 간 관계를 정의

데이터베이스 키의 종류

  • 키는 데이터베이스에서 조건에 만족하는 튜플을 찾거나, 순서대로 정렬할 때 튜플을 서로 구분하는 기준이 되는 애트리뷰트이다.

  • 슈퍼키(Super Key)

    • 릴레이션에서 각 행을 유일하게 식별할 수 있는 하나 혹은 그 이상으로 구성된 속성들의 집합이다.
    • 릴레이션의 모든 튜플에 대해 유일성을 만족하면 된다. 어떤 속성을 결합하든 중복되는 데이터 없이 모든 튜플을 구별할 수만 있으면 된다.
      • 유일성: 하나의 키값으로 하나의 튜플만을 식별하는 게 가능해야 한다.
  • 후보키(Candidate Key)

    • 후보키는 릴레이션을 구성하는 속성 가운데 튜플을 유일하게 식별하기 위해 사용하는 속성들의 부분집합이다. 즉, 기본키로 사용할 수 있는 속성을 가리킨다.
    • 릴레이션 내에선 중복된 튜플이 허용되지 않기에 모든 릴레이션은 하나 이상의 후보키를 가진다.
    • 후보키는 릴레이션에 있는 모든 튜플에 대해 유일성과 최소성을 만족시켜야 한다.
      • 최소성: 모든 튜플을 유일하게 식별하기 위해 필요한 속성만으로 구성돼야 한다.
  • 기본키(Primary Key)

    • 기본키는 후보키 중 선택한 주키(Main Key)이다.
    • 한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성이다.
    • Null을 가질 수 없다.
    • 기본키로 정의된 속성은 같은 값이 중복되어 저장될 수 없다.
  • 대체키(Alternate Key)

    • 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키를 가리킨다.
    • 보조키라고도 한다.
  • 외래키(Foreign Key)

    • 서로 관계가 있는 릴레이션 R1, R2에서 R2가 참조하는 릴레이션 R1의 기본키와 같은 R2 릴레이션의 속성을 외래키라 한다.

정규화

  • 정규화는 관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상 현상을 방지하고, 데이터의 일관성과 정확성을 유지하기 위해 무손실 분해하는 과정이다. 정규화를 하면서 데이터를 논리적으로 구성할 수 있다.

  • 이상 현상(Anomaly)

    • 이상 현상은 데이터의 중복성으로 인해 릴레이션을 조작할 때 발생하는 비합리적 현상이다.
    • 삽입, 삭제, 갱신 이상이 있다.
      • 삽입 이상: 정보 저장시 해당 정보의 불필요한 세부정보를 입력해야 하는 경우
      • 삭제 이상: 정보 삭제시 원치 않는 다른 정보가 같이 삭제되는 경우
      • 갱신 이상: 중복 데이터 중 특정 부분을 갱신할 때 데이터 간 모순이 발생하는 경우
    • 정규화를 통해 이상 현상을 사전에 방지할 수 있다.

데이터베이스 정규화 단계

  • 1정규형(1NF): 원자값으로 구성
  • 2정규형(2NF): 부분 함수 종속 제거(완전 함수적 종속 관계)
  • 3정규형(3NF): 이행함수 종속 제거
  • 보이스-코드 정규형(BCNF): 결정자 후보 키가 아닌 함수 종속 제거
  • 4정규형(4NF): 다치(다중 값) 종속 제거
  • 5정규형(5NF): 조인 종속 제거

1차 정규화(1NF)

  • 테이블 내 속성값(컬럼값)은 원자값(Atomic Value)을 가져야 한다.(이를테면 이메일 두 개가 연결된 채 저장되어 있으면 안된다.)
    • 원자값은 하나의 값을 의미한다.
NAMEAGEEMAIL_ADDRESS
오재섭25app@apple.com, ddd@google.com
권이수24fff@naver.com

오재섭의 메일주소에 2개의 값이 들어가 있기에 1차 정규형을 만족하지 않는다.

NAMEAGEEMAIL_ADDRESS
오재섭25app@apple.com
오재섭25ddd@google.com
권이수24fff@naver.com

위처럼 테이블을 분해하여 컬럼이 원자값을 가지면 1차 정규형이 된다.

2차 정규화(2NF)

  • 1차 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것
  • 기본키가 두 개 있을 때 특정 속성이 한 키에 종속되어 있다면 그를 두 테이블로 분해하는 것이다.
    • 완전 함수 종속이란 기본키의 부분집합이 결정자가 되지 않는 것을 뜻한다.
      기본키 중 특정 컬럼에만 종속된 컬럼이 없어야 한다는 것이다.
NAMEAGEFAVORITE_FOOD
오재섭25떡볶이
오재섭25삼계탕
풍혜림25고기국수
정현24수제비
권이수24파스타

위 테이블의 기본키는 (이름, 좋아하는 음식)으로 복합키이다. 두 개의 컬럼이 합쳐져야 한 로우를 구분할 수 있다.
나이의 경우엔 해당 기본키 중 이름에만 종속되어 있다. 이름 컬럼의 값에서 나이의 값이 도출되는 것이다. 여기서 나이가 중복되어 여러 번 들어가는 것은 불필요하다.

NAMEFAVORITE_FOOD
오재섭떡볶이
오재섭삼계탕
풍혜림고기국수
정현수제비
권이수파스타

NAMEAGE
오재섭25
오재섭25
풍혜림25
정현24
권이수24

위와 같이 테이블을 분해하여 2차 정규형을 만족시킬 수 있다.

3차 정규화(3NF)

  • 기본키를 제외한 속성 간 이행적 함수 종속을 제거한다.
STUDENT_IDSTUDENT_NAMESTREETCITYSTATEZIP

기본키 STUDENT_ID가 있다.
ZIP이 결정되면 STREET, CITY, STATE가 결정된다.
여러 명의 학생이 같은 ZIP을 가질 때, 그에 따라 동일한 STREET, CITY, STATE가 결정되기에 컬럼 사이 중복된 데이터가 생길 수 있다.

STUDENT_IDSTUDENT_NAMEZIP

ZIPSTREETCITYSTATE

이는 2차 정규화처럼 테이블을 분해하여 해결할 수 있다.
이행적 함수 종속을 제거한다는 것은 기본키 이외 다른 컬럼이 또다른 컬럼을 결정하지 못하도록 데이터 구조를 변경한다는 것이다.

보이스-코드 정규화(BCNF)

  • 3차 정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형이다.
STUDENTSUBJECTPROFESSORGRADES
1데이터베이스임버들A
2C 프로그래밍서마음A
3C 프로그래밍서마음A

슈퍼키 중 최소성을 만족하는 후보키는 (STUDENT, SUBJECT)이다. 교수가 한 과목만 강의할 수 있다고 가정할 때 위 테이블에선 교수가 결정자이다. 교수에 따라 과목이 정해진다.
그러나 교수는 후보키가 아니다. 이 경우 BCNF를 만족하지 않는다고 한다.
일반 컬럼이 후보키를 결정할 때 3차 정규형을 만족하면서 BCNF를 만족하지 않을 수 있다.
위처럼 테이블이 구성되었다면 데이터가 중복되며, 갱신 이상이 발생한다. 이를테면 서마음이 강의하는 과목명이 바뀐다면 두 개의 로우를 갱신해야 한다. 이를 해결하기 위해 테이블을 분리해야 한다.

교수 테이블

PROFESSORSUBJECT
임버들데이터베이스
서마음C 프로그래밍
서마음C 프로그래밍

수강 테이블

STUDENTSUBJECTGRADES
1데이터베이스A
2C 프로그래밍A
3C 프로그래밍A

4차 정규화(4NF)

  • 다치(Multi value) 종속 관계를 제거한다.
DEVELOPERCERTIFICATELANGUAGE
임버들정보처리기사C
임버들정보처리기사C++
임버들빅데이터분석기사C
임버들빅데이터분석기사C++
성이경정보보안기사JAVA

다치 종속 관계는 원자값을 만드는 1차 정규화 과정에서 발생한다.
위 예시에선 개발자마다 자격증이 여러 개 존재하고, 특정 개발자마다 언어가 여러 개 존재한다. 그러나 자격증과 언어는 의미적으로 아무 관계가 없다.
테이블의 속성 A, B, C가 있을 때 (A, B) 값에 종속되는 C란 속성이 A에만 종속이고 B엔 독립적인 경우를 다치 종속 관계라 한다.
개발자에 새로운 언어를 추가할 때 자격증에 대한 중복 데이터가 생성된다. 임버들에 새로운 언어를 추가하기 위해선 튜플을 2개 삽입해야 하는 삽입 이상이 일어나는 것이다.

DEVELOPERCERTIFICATE
임버들정보처리기사
임버들빅데이터분석기사
성이경정보보안기사

DEVELOPERLANGUAGE
임버들C
임버들C++
성이경JAVA

개발자별로 여러 자격증값과 여러 언어값이 있기에 (개발자, 자격증), (개발자, 언어) 테이블로 분리하면 다치 종속 관계를 제거하여 4차 정규형을 만족한다.

5차 정규화(5NF)

  • 조인 종속(Join Dependency)을 제거한다.
    • 조인 종속: 하나의 릴레이션을 여러 릴레이션으로 분해했다가 다시 조인했을 때 불필요한 데이터가 생겨나는 것이다.
DEVELOPERCERTIFICATELANGUAGE
임버들정보처리기사C
임버들빅데이터분석기사C++
성이경정보보안기사JAVA

이 역시 다치 종속 관계라 할 수 있다.

DEVELOPERCERTIFICATE
임버들정보처리기사
임버들빅데이터분석기사
성이경정보보안기사

DEVELOPERLANGUAGE
임버들C
임버들C++
성이경JAVA

위처럼 4NF를 만들 때, 해당 테이블에 조인 연산을 수행하면 이전 데이터와 다른 릴레이션이 생성된다.

DEVELOPERCERTIFICATELANGUAGE
임버들정보처리기사C
임버들정보처리기사C++
임버들빅데이터분석기사C
임버들빅데이터분석기사C++
성이경정보보안기사JAVA

조인 종속을 제거하기 위해 (개발자, 자격증), (개발자, 언어) 뿐 아니라 (자격증, 언어) 관계에 대한 테이블을 만드는 것으로 조인시 원래의 데이터를 복구할 수 있다.

DEVELOPERCERTIFICATE
임버들정보처리기사
임버들빅데이터분석기사
성이경정보보안기사

CERTIFICATELANGUAGE
정보처리기사C
빅데이터분석기사C++
정보보안기사JAVA

DEVELOPERLANGUAGE
임버들C
임버들C++
성이경JAVA

반정규화

  • 반정규화는 시스템의 성능 향상, 개발 및 운영의 편의성을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로 의도적으로 정규화 원칙을 위배하는 행위이다.

  • 반정규화를 통해 시스템의 성능이 향상되고 관리 효율성이 증가할 수 있지만 데이터의 일관성 및 정합성이 저하될 수 있다.

  • 과도한 반정규화는 성능을 저하시킬 우려가 있다.

  • 반정규화 방법으로 테이블 병합, 테이블 분할, 중복 데이터 추가, 중복 속성 추가 등이 있다.

  • 테이블

    • 테이블 병합

      • 1:1 관계, 1:M 관계를 통합하여 조인 횟수를 줄여 성능 향상을 도모한다.
      • 슈퍼타입/서브타입 테이블을 통합하여 성능을 향상시킨다.
    • 테이블 분할
      테이블을 수직 또는 수평으로 분할하는 것으로 파티셔닝이라고도 한다.

      • 수평분할
        • 테이블 분할에 레코드를 기준으로 삼는다.
      • 수직분할
        • 한 테이블의 컬럼 개수가 많아질 때 사용한다.
        • 갱신이나 조회가 잦거나, 크기가 크거나, 보안 요구치가 높은 속성을 분할한다.
    • 중복 테이블 추가
      대량의 데이터에 대한 집계함수(GROUP BY, SUM 등)를 사용하여 실시간 통계정보를 계산할 때 효과적 수행을 통해 별도 통계 테이블을 두거나 중복 테이블을 추가할 수 있다.

      • 집계 테이블 추가
        집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거를 설정하여 사용하는 것이다.
        트리거의 오버헤드에 유의할 필요가 있다.
      • 진행 테이블 추가
        이력 관리 등을 목적으로 추가하는 테이블로 데이터량을 적절히 유지하고 활용도를 높일 수 있는 기본키를 설정한다.
      • 특정 부분만을 포함하는 테이블 추가
        데이터가 많은 테이블의 특정 부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성한다.
  • 컬럼

    • 컬럼 중복화
      논리 데이터 모델링 과정에서 정규화를 통해 중복 컬럼을 최대한 제거한다. 그에는 여러 이유가 존재하나 가장 중요한 것은 데이터의 정합성을 유지하는 것이다.
      물리 데이터 모델링 과정에서 이러한 정규화를 어기며 다시 중복 컬럼을 생성할 수 있다.
  • 관계

    • 중복관계 추가
      테이블과 컬럼의 반정규화는 데이터 무결성을 깨뜨리지 않고도 데이터 처리성능을 향상시킬 수 있다.
      데이터 모델이 관계로 연결되어 있고, 관계가 서로 먼 친척 간 조인이 빈번하여 성능저하가 우려될 때 관계의 반정규화로 성능향상을 꾀할 수 있다.

0개의 댓글