Jin's Dev Story

[SQLD] 1과목 - 2. 데이터 모델과 SQL 본문

자격증 & 공부/SQLD

[SQLD] 1과목 - 2. 데이터 모델과 SQL

woojin._. 2024. 5. 16. 14:10

[ 1과목 - 2. 데이터 모델과 SQL ]


 * 정규화
   - 데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 Entity(이하 테이블)를 작은 단위로 분리하는 과정

 * 정규화 장점
   - 이상 현상 제거 및 방지
   - 데이터베이스 구조 확장 시 재 디자인 최소화
   - 데이터 입력/수정/삭제 성능 향상

 * 정규화 단점
   - Join 연산 증가
   - 데이터 조회 성능 저하 (중복된 데이터를 제거함으로써 조회 성능을 향상시킬 수 있음)

 * 이상 현상
   - 삽입 이상 (Insertion Anomaly)
      : 데이터 삽입 시 속성에 해당하는 값이 없어 Null을 입력해야 하는 현상
   - 삭제 이상 (Deletion Anomaly)
      : 데이터 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
   - 갱신 이상 (Update Anomaly)
      : 데이터 갱신 시 중복된 데이터의 일부만 갱신되어 일어나는 데이터 불일치 현상

 * 제1 정규화 (1NF)
   - 모든 속성은 반드시 원자값(1개 값)을 가짐
   - 원자값이 아닌 도메인을 분해함

   - 왼쪽 테이블과 같이 한 속성에 여러 값이 포함되어 있거나, 오른쪽 테이블과 같이 유사한 속성이 반복되는 경우 
     1차 정규화 대상이 됨

   -> 정규화 후

    - 회원 테이블과 직업 테이블로 분리

 * 제2 정규화 (2NF)
   - 모든 속성은 완전 함수 종속이어야 함
   - 부분 함수 종속성을 제거함
   - 테이블의 모든 일반 속성은 (기본키가 아닌 컬럼) 모든 주식별자 (복합 기본키)에 종속되어야 함
   => 기본키가 1개 컬럼으로 이루어졌으면 제2 정규화는 생략됨

  + 부분 함수 종속성이란?
    : 기본키가 2개 이상인 컬럼으로 이루어질 때, 일반 컬럼이 기본키 중 일부에만 종속된 경우

   - 위 테이블의 기본키는 주문번호 & 상품코드로 이루어져있고 일반 속성에서 주문수량은 기본키를 통해서만 구할 수
     있지만, 상품명은 기본키 중 상품코드만 알아도 구할 수 있음
     => 상품명은 부분 함수 종속성 띄는 것

   -> 정규화 

    => 주문 테이블과 상품 테이블로 분리

 * 제3 정규화 (3NF)
   - 기본키를 제외한 컬럼 간의 종속성을 제거함
   - 이행 함수 종속성을 제거함

    - 일반 속성인 소속사명은 다른 일반 속성인 소속사코드를 통해 알 수 있음
     -> 이를 이행 함수 종속성이라고 함

 + 이행 함수 종속성이란?
    : A, B, C가 존재할 때, A가 B에 함수 종속적이 아니면 이때, C는 A에 이행함수 종속이라고 함
    : 제2정규형(2NF)의 관계에 이행함수 종속성이 있는 경우, 그것을 배제하고 분해한 관계를 제3정규형(3NF)이라고 함
    : A -> B 이고 B -> C 일 경우에만 A -> C 이면 이행함수(적) 종속이라고 함
    => A를 통해 B를 알 수 있고(A->B) B를 통해 C를 알 수 있는데(B->C) A를 통해 C도 알 수 있는 경우(A->C) 
       이행함수 종속이라고 함

   -> 정규화 후

    => 연예인 테이블에서 소속사 분리

 * BNCF(Boyce-Codd Normal Form)
   - 모든 결정자는 후보키 집합에 속해야 함
   - 후보키가 기본키를 종속시키면 분해함

   - 학생번호, 과목이 기본키일 때 기본키로 지도교수를 알 수 있음
   - 하지만, 여기서 지도교수를 통해 과목을 알 수 있으므로 과목은 지도교수에 종속됨
   - 이는 후보키가 아닌 지도교수가 결정자가 되었다는 것을 의미

   -> 정규화 후

   - 수강 테이블에서 교수 정보를 분리

 * 제4 정규화 (4NF)
   - 여러 속성들이 하나의 속성을 종속시키는 경우 분해해야 함
   - 다치 종속을 제거함

 + 다치 종속성이란?
    : 어떤 레코드의 존재가 다른 레코드의 존재로 이어짐을 의미함
    : ->>으로 표시하는데, R {A, B, C} 일 때, (A, C) ->> {B}≡(A) -> {B} 성립함
    : A ->> B이면 A ->> C도 성립하고 A ->> B | C 임
    : R {A, B, C}에서 다치 종속 A ->> B | C 이면 R1 {A, B}와 R2 {A, C}로 무손실 분해가 가능함
    -> 이를 제4 정규형(4NF)의 관계에 있다고 말함

 * 제5 정규화
   - 조인에 의해서 종속성이 발생하는 경우 분해함
   - 조인 종속을 제거함
   - Project Join Normal Form(PJNF)

 + 조인 종속성이란?
    : 릴레이션 R이 그의 프로젝션 A, B, ...., Z의 조인과 동일하면 R은 JD*(A, B, ..., Z)를 만족함
    : 이때 A, B, ..., Z는 R의 애트리뷰트에 대한 부분 집합임
    : 테이블 R이 R의 속성의 부분집합을 가지는 여러 개의 테이블을 조인하여 만들 수 있을 때, R은 조인 종속성을 가진다고 함
    -> 이를 제5 정규형(5NF)이라고 함
 
* 관계의 종류
   1) 일대일 관계(One-to-One)
      - 하나의 엔티티 A가 하나의 엔티티 B와만 관계를 가질 때를 말함
        ex) 각 사용자는 하나의 프로필을 가지고, 각 프로필은 특정 사용장게만 속함
   2) 일대다 관계(One-to-Many)
      - 하나의 엔티티 A가 여러 개의 엔티티 B와 관계를 가질 수 있지만, B는 A와 하나의 관계만 가질 때를 말함
        ex) 한 명의 고객이 여러 개의 주문을 할 수 있지만, 각 주문은 특정 고객에게만 속함

   3) 다대다 관계(Many-to-Many)
      - 하나의 엔티티 A가 여러 개의 엔티티 B와 관계를 맺을 수 있으며, B 또한 여러 개의 A와 관계를 맺을 수 있을 때
        ex) 여러 명의 학생이 여러 개의 수업에 등록할 수 있고, 각 수업에는 여러 명의 학생이 등록될 수 있음

 * 관계의 표현 방법
   1) 외래키(Foreign Key)
      - 한 테이블의 필드(열)가 다른 테이블의 기본키를 참조하는 경우, 이를 외래키라고 함
      - 외래키를 통해 테이블 간의 관계를 정립하고 데이터의 무결성을 유지함
   2) 조인 -> 아래 내용 참고
   3) ERD(Entity-Relationship Diagram)
      - 엔티티 간의 관게를 시각적으로 나타내는 다이어그램
      - 데이터 모델링의 초기 단계에서 엔티티와 그  관계를 명확하게 파악하는 데 도움을 줌

 * 조인 (Join)
   - 관계는 사전적으로 정의하면 ‘상호 연관성이 있는 상태’
   - 관계를 맺는 것은 부모의 식별자를 자식에게 상속시키는 행위
   - 이때, 부모의 식별자를 자식의 식별자에 포함하면 ‘식별관계’, 부모의 식별자를 자식의 일반 속성으로 상속하면 
     ‘비식별관계’라고 함
   - 즉, 관계를 맺는다는 건 식별자를 상속하고, 상속된 속성을 매핑키로 활용하여 데이터를 결함해 볼 수 있다는 의미

  ex) ‘고객’ 엔티티와 ‘주문’ 엔티티가 관계를 맺고 있는 모습


      - 고객 엔티티의 입장 : 한 명의 고객은 여러 번 주문 가능
      - 주문 엔티티의 입장 : 각각의 주문은 반드시 한 명의 고객에 의해 발생됨
      => 관계를 맺음으로 생기는 현상은 고객 엔티티의 식별자인 ‘고객번호’를 주문 엔티티에 상속시킨 것
         * 관계란? 식별자를 상속시키고 해당 식별자를 매핑키로 활용해 데이터를 결합하는 것


      - 주문데이터의 ‘고객’ 데이터에서 고객번호를 상속시킨 것을 볼 수 있음
      - 주문번호가 ‘A10001’인 주문의 이름은?
1. 주문 데이터에서 주문번호가 ‘A10001’인 데이터를 찾는다.
2. 주문번호가 ‘A10001’인 데이터 행에서 고객번호가 ‘1001’인 것을 확인한다.
3. 고객 데이터에서 고객번호가 ‘1001’인 데이터를 찾는다.
4. 고객번호가 ‘1001’인 데이터의 행에서 이름이 ‘김철수’인 것을 알 수 있다.
=> 이것이 바로 관계를 활용한 조인
=> 2, 3번의 과정이 ‘조인’이고, 고객번호가 바로 조인키(Join Key)


 * SQL(Structured Query Language)
   - 데이터베이스에서 데이터를 조회, 추가, 수정, 삭제하는 데 사용되는 표준 언어
   - SELECT, INSERT, UPDATE, DELETE 등이 있음

 * 조인의 종류
    1) 내부 조인(Inner Join)
      - 두 테이블의 교집합에 해당하는 데이터를 조회함
    2) 외부 조인(Outer Join)
      - 한쪽 테이블의 모든 데이터와 다른 테이블의 일치하는 데이터를 조회함
      - 외부 조인에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있음
    3) 크로스 조인(Cross Join) 또는 카테시안 조인
      - 두 테이블의 모든 가능한 조합을 반환
    4) 자연 조인(Natural Join)
      - 두 테이블 간에 동일한 이름을 가진 모든 열에 대해 내부 조인을 수행함

 * 조인 조건 및 ON 절
   - 조인을 수행할 때, ON 절을 사용하여 조인 조건을 명시함
     ex) 두 테이블 A와 B를 조인할 때, A.id = B.id와 같은 방식으로 조인 조건을 지정할 수 있음
  
 * 트랜잭션
   - 데이터베이스에서 하나의 논리적인 작업 단위
   - 이는 여러 개의 개별 작업들이 모여서 하나의 큰 작업을 이루는 경우가 많음
     ex) 은행 계좌에서 돈을 이체하는 과정은 여러 개의 단계(잔액 확인, 금액 차감, 수취인 계좌에 금액 추가)를 포함함
         이 모든 단계가 성공적으로 수행되어야만 최종적으로 ‘이체’라는 트랜잭션이 완료되는 것

 * 트랜잭션의 중요성
   1) 원자성(Atomicity)
      - 트랜잭션 내의 모든 작업이 완전히 수행되거나, 아무것도 수행되지 않아야 함
   2) 일관성(Consistency)
      - 트랜잭션이 성공적으로 완료되면, 데이터베이스는 일관된 상태를 유지해야 함
   3) 독립성(Isolation)
      - 동시에 실행되는 여러 트랜잭션이 서로에게 영향을 주지 않아야 함
   4) 지속성(Durability)
      - 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 반영되어야 함

 * 트랜잭션 관리
   - BEGIN TRANSACTION과 COMMIT 명령어를 사용하여 트랜잭션을 시작하고 완료할 수 있음
   - 오류가 발생한 경우 ROLLBACK 명령어로 모든 변경사항을 취소할 수 있음

 * NULL
   - 데이터베이스에서 NULL은 ‘알 수 없음(unknown)’ 또는 ‘정보 없음(no data)’을 나타냄
   - 필드에 값이 ‘없음’을 의미하지만, 그 이유는 다양할 수 있음
   - 값이 존재하지 않을 수도 있고, 아직 정해지지 않거나, 알 수 없을 수도 있을 것

 * NULL의 중요성
   - NULL 값은 데이터의 무결성을 유지하는데 중요한 역할을 함
     ex) 사용자의 전화번호가 아직 알려지지 않았다면, 그 필드는 NULL로 남겨둠으로써 ‘정보가 없음’을 명확히 할 수 있음

 * NULL을 다루는 방법
   1) NULL 확인
      - SQL에서는 IS NULL 또는 IS NOT NULL 조건을 사용하여 NULL 값을 확인할 수 있음

SELECT * FROM users WHERE address IS NULL;


   2) NULL 확인
      - 다른 값과 직접 비교할 수 없음
        ex) NULL = NULL 은 FALSE가 아니라 ‘알 수 없음’을 반환함
   3) NULL의 처리
      - 데이터베이스 설계 시, 어떤 필드가 NULL 값을 가질 수 있는지, 그리고 어떤 의미를 가지는지 명확하게 해야 함
      - 애플리케이션 로직에서도 NULL 값을 적절히 처리할 준비가 되어 있어야 함
   4) NULL 사용 주의
      - NULL 값을 가진 필드에 대한 연산은 대부분 NULL 결과를 반환함
        ex) NULL + 10은 NULL을 반환함

 * 본질식별자(Natural Identifier)
   - 엔티티의 자연스러운 속성을 기반으로 한 식별자
   - 엔티티에 자연적으로 내재된 데이터를 반영함
     ex) 사람의 경우 -> 국적과 주민등록번호의 조합
         자동차의 경우 -> 차량 번호판

   - 특징
     1) 유일성 : 엔티티를 유일하게 식별할 수 있음
     2) 의미적 가치 : 비즈니스에 의미를 가지는 실제 데이터를 반영함
     3) 변경 가능성 : 실제 세계의 변화에 따라 변경될 수 있음

 * 인조식별자(Artificial or Surrogate Identifier)
   - 엔티티를 식별하기 위해 인위적으로 생성된 식별자
   - 엔티티의 자연스러운 속성과는 관련이 없음
     ex) 데이터베이스에서 자동으로 생성되는 일련번호나 고유 ID – UUID

    - 특징
     1) 유일성 : 각 엔티티에 대해 고유한 값을 가짐
     2) 불변성 : 한 번 생성된 인조식별자는 변경되지 않음
     3) 비의미적 : 인조식별자는 비즈니스 의미를 내포하지 않음

 * 본질식별자 vs 인조식별자
   - 변경 가능성 : 만약 식별자가 변경될 가능성이 있다면, 인조식별자 사용이 바람직함
                 : 본질식별자는 변경될 가능성이 있기 때문에 데이터 무결성에 문제를 일으킬 수 있기 때문
   - 복잡성 : 복잡한 본질식별자(ex : 여러 속성의 조합)는 관리가 어려울 수 있으므로, 이 경우 인조식별자를 사용하는 것이 좋음
   - 비즈니스 의미 : 비즈니스 프로세스나 규칙에서 중요한 의미를 가지는 식별자가 필요한 경우, 본질식별자를 사용할 수 있음
 

'자격증 & 공부 > SQLD' 카테고리의 다른 글

[SQLD] SQLD 합격 후기  (0) 2024.06.18
[SQLD] 2과목 – 3. 관리 구문  (0) 2024.05.16
[SQLD] 2과목 - 2. SQL 활용  (0) 2024.05.16
[SQLD] 2과목 - 1. SQL 기본  (0) 2024.05.16
[SQLD] 1과목 - 1. 데이터 모델링의 이해  (0) 2024.05.16