데이터 분석일지/SQLD 준비

SQLD 자격증 챌린지 5일차 강의: 데이터 모델 및 SQL 파트 개념의 시작

유니스방 2024. 5. 12. 14:09

SQLD 자격증을 취득하기 위하여 스파르타코딩클럽의 "SQLD 자격증 채린지" 수업을 수강한 내용을 복습 차원에서 정리한 내용이다. 

 

SQLD 자격증 챌린지 (oopy.io)

 

SQLD 자격증 챌린지

단기간 SQLD 격파가 가능한, 격파르타 차별점

certificate-sqld.oopy.io

 


 

5일차 수업 목표는 데이터 모델 및 SQL 파트에 대한 개념을 학습하는 것이다.

 

아래 목차와 같이 내용을 정리할 예정이다.

  1. 관계와 조인의 이해
  2. 계층형 데이터 모델
  3. 상호배타적 개념
  4. 모델이 표현하는 트랜잭션의 이해
  5. NULL 속성의 이해
  6. 본질식별자 vs 인조식별자

5일차 수업 내용은 1과목인 데이터 모델링의 이해의 마지막 내용이다. 

 


01. 관계와 조인의 이해

 

"관계 (Relationship)" 정의

관계형 데이터베이스(RDMS): 여러 테이블을 만들어서 데이터를 저장하는 것.

여기에 있는 여러 테이블 간의 연결이 관계이다.

 

부모의 식별자를 자식의 식별자에 포함하여 식별관계, 부모의 식별자를 자식의 일반 속성으로 상속하면 비식별관계이다.

 

주요 관계의 유형은 아래와 같다:

  1. 일대일 (One-to-One): 한 테이블의 레코드가 다른 테이블의 단 하나의 레코드와만 연결.
  2. 일대다 (One-to-Many): 한 테이블의 레코드가 다른 테이블의 여러 레코드와 연결.
  3. 다대다 (Many-to-Many): 한 테이블의 여러 코드가 다른 테이블의 여러 레코드와 연결. → 일반적으로 별도의 연결 테이블을 통해 구현된다. (A, B 테이블 + A와 B 테이블의 연결관계를 정리한 테이블)

 

"조인" 정의

두 개 이상의 테이블을 연결하여 데이터를 검색하는 데 사용되는 방법.

조인을 사용하면 여러 테이블에 흩어져 있는 정보를 결합하여 의미 있는 방식으로 데이터를 조회할 수 있다.

 

주요 조인 유형은 아래와 같다:

  1. 내부 조인 (Inner Join):  두 테이블의 교집합. 두 테이블 모두에서 일치하는 레코드만 결과에 포함.
  2. 외부 조인 (Outer Join):
    1. 왼쪽 외부 조인 (Left Outer Join/Left Join): 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환. 일치하는 레코드가 없는 경우, 오른쪽 테이블의 값은 NULL로 표시된다.
    2. 오른쪽 외부 조인 (Right Outer Join/Right Join): 이는 왼쪽 외부 조인의 반대로 작동한다.
    3. 전체 외부 조인 (Full Outer Join): 두 테이블의 합집합을 변환. 일치하지 않는 레코드는 NULL 값으로 표시된다.

*참고: 조인key란 두 테이블이 모두 포함하고 있는 속성이다.

 

만약 과목명이라는 엔티티와 강사명이라는 엔티티가 있다면, 각각의 조인 유형이 적용된 예시는 아래와 같다:

 

주문 내역

제품명 고객ID
비누 1
핸드로션 2
핸드폰케이스 1
비누 3
바디로션 4

 

고객

고객ID 이름
1 김가은
2 도민규
3 기은세

 

 

→ 내부 조인

제품명 고객ID 이름
비누 1 김가은
핸드폰케이스 1 김가은
핸드로션 2 도민규
비누 3 기은세

 

 

→ 왼쪽 외부 조인

제품명 고객ID 이름
비누 1 김가은
핸드폰케이스 1 김가은
핸드로션 2 도민규
비누 3 기은세
바디로션 4 NULL

 

 

→ 오른쪽 외부 조인

제품명 고객ID 이름
비누 1 김가은
핸드폰케이스 1 김가은
핸드로션 2 도민규
비누 3 기은세

 

→ 전체 외부 조인

제품명 고객ID 이름
비누 1 김가은
핸드폰케이스 1 김가은
핸드로션 2 도민규
비누 3 기은세
바디로션 4 NULL

 

 


02. 계층형 데이터 모델
☆SQLD 대비를 위해서는 계층형 데이터 모델의 개념만 알고 있으면 된다.

 

계층형 데이터 모델의 개념

계층형 데이터 모델이란, 데이터를 트리 구조로 표현하는 방식이다. 

동일한 데이터에서 상하 구조가 있는 것이다.

 

각 계층은 다른 계층과 부모-자식 관계를 갖는다. 즉, 계층형 데이터 모델에서는 한 레코드가 자기 자신에 대한 관계를 가질 수 있다. → "순환 관계" 또는 "자기 참조 관계"

 

계층형 데이터 모델의 차별점은 자기 자신을 조인했다는 것, 셀프 조인(Self-Join)했다는 것이다.

 


03. 상호배타적 관계
☆SQLD 대비를 위해서는 상호배타적 관계가 무엇인지만 알고 있으면 된다.

 

상호배타적 관계 (Exclusive Relationship)

두 요소 또는 그룹 간의 관계 중에서 서로 중복되지 않고 상호 배타적인 경우를 의미.

한 요소 또는 그룹이 다른 요소 또는 그룹과 동시에 속할 수 없는 관계.

(만약 A가 아이스크림을 고른다면, B가 아이스크림이 아닌 케이크를 고를 때 A와 B는 상호배타적 관계에 있다고 표현할 수 있다.)

 


04. 모델이 표현하는 트랜잭션(Transaction)의 이해

 

트랜잭션의 이해

트랜잭션: 데이터베이스의 논리적 연산단위, 기본 처리 단위이다.

 

가상의 은행에서 두 계좌 간의 금액 이체를 통해 트랙잭션을 설명해보자면:

  1. 시작 (Begin): 트랜잭션은 어떤 일련의 작업을 나타내기 시작할 때 시작된다. 
    • A계좌에서 B계좌로 100달러를 이체하려는 트랜잭션이 시작된다.
  2. 작업 수행: 트랜잭션은 하나 이상의 작업으로 이루어진다.
    • A계좌에서 100달러를 빼고, B계좌에 100달러를 더하는 두 가지 작업이 있다.
  3. 확인 (Commit): 모든 작업이 성공적으로 수행되었다면, 트랜잭션을 완료하기 위해 확인 단계로 넘어간다.
    • A계좌에서의 인출과 B계좌로의 입금이 성공하면 트랜잭션을 커밋하여 최종 결과를 반영한다.
  4. 롤백 (Rollback): 하지만 추가에 어떤 문제가 발생한다면, 트랜잭션을 롤백하여 (트랜잭션이 시작하는 시점으로) 모든 작업을 취소할 수 있다.
    • A 계좌에 잔고 부족 등의 이유로 트랜잭션이 실패한다면, 롤백을 통해 모든 작업을 취소하고 처음 상태로 돌아갈 수 있다.
  5. 끝 (End): 트랜잭션이 커밋되거나 롤백되면 해당 트랜잭션은 종료된다. 모든 작업이 반영되었거나, 아니면 아무런 알림도 주지 않은 상태로 끝나게 된다.

 

트랜잭션의 특징 → SQLD 문제가 자주 출제되는 영역

  1. 원자성 (Atomicity): 트랜잭션은 원자적인 작업의 단위로 간주된다. 이는 트랜잭션 내에서 수행되는 모든 작업이 성공하거나 실패할 경우 전체가 실패하는 것을 의미한다. 중간에 어떠한 작업이라도 실패하면 이전 상태로 롤백되어야 한다.
  2. 일관성 (Consistency): 트랜잭션이 완료된 후에도 데이터베이스가 일관된 상태여야 한다. 트랜잭션이 시작하기 전과 후에 일관성이 유지되어야 한다.
  3. 고립성 (Isolation): 여러 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션이 서로 영향을 미치지 않도록 해야 한다.
  4. 지속성 (Durability): 트랜잭션이 성공적으로 완료된 경우, 해당 트랜잭션에서 수행한 변경 사항은 영구적으로 데이터베이스에 반영되어야 한다.

05. NULL 속성의 이해

 

NULL의 개념

NULL은 데이터베이스에서 특정 필드 또는 칼럼에 값이 없음을 나타내는 값이다.

알 수 없음, 아직 정의되지 않음 (미정), 데이터 없음의 의미로, 공백이나 숫자 0과는 전혀 다른 의미이다.

 

NULL의 특징

  1. 미정 상태
  2. 데이터의 부재
  3. 값의 비교 불가능

집계함수는 NULL값을 제외하고 처리한다.

  1. SUM 함수 (합계를 구하는 함수): 일반적으로 Null 값을 0으로 처리한다. 즉, Null 값을 제외하고 나머지 값들의 합을 계산한다.
  2. AVG 함수 (평균을 구하는 함수): Null 값을 제외하고 나머지 값들의 평균을 계산한다.
  3. COUNT 함수 (개수를 구하는 함수): 일반적으로 Null 값을 제외하고 유효한 값들의 개수를 세어준다. 
    • 단, COUNT(*) 함수는 NULL을 포함해서 모든 행의 수를 리턴한다. (*은 모든 값을 의미하는 기호이다. ALL이라는 의미이다.)
  4. MIN/MAX 함수 (데이터의 최소값과 최대값을 구하는 함수): Null 값을 무시하고, 나머지 값 중에서 최소값과 최대값을 찾는다.

NULL이 포함된 연산을 하려면, NVL/ISNULL 함수를 사용하여 NULL값을 0으로 처리한 후에 포함하여 함께 계산해준다.

 


06. 본질식별자 vs 인조식별자

 

식별자란?: 엔티티 내에서 어커런스(데이터)를 구분하는 구분자 (속성 또는 속성 그룹)

 

본질식별자 (Natural Key) vs 인조식별자 (Surrogate Key) 개념

본질식별자: 자연스럽게 (데이터 자체에 들어간) 만들어진 식별자. 업무에 의해 만들어진 식별자

  • 장점:
    • 데이터베이스에 의미 있는 정보를 포함하므로 인간이 읽고 이해하기 쉽다.
    • 자연스럽게 발생하는 속성을 사용하므로 데이터 일치성이 높을 수 있다.
  • 단점:
    • 갱신 연산 부하: 데이터 속성의 변화나 형식 변경이 발생하면 식별자에도 영향을 미칠 수 있다. 일관성 유지가 어렵다.
    • 길이와 복잡성: 복합 본질식별자의 경우 복잡성이 증가할 수 있고, 인덱스 크기도 중가한다. 저장 공간을 불필요하게 차지하게 되고 검색 성능이 감소할 수 있다.

인조식별자: 업무적으로 만들어지지는 않지만, 외부에서 인위적으로, 의도적으로 만들어진, 데이터와 무관한 특별한 식별자.

주로 시스템이나 데이터베이스 설계 목적으로 생성되며, 엔티티를 고유하게 식별하기 위한 보조적인 역할을 수행한다.

 

  • 장점:
    • 데이터 일관성이 유지되며, 데이터 변화에 대한 영향이 적다.
    • 복합 본질식별자의 복잡성을 피할 수 있다.
  • 단점:
    • 비즈니스 의미 부족: 식별자 자체가 데이터베이스와 관련이 없어, 사용자가 직접 읽고 이해하기 어려울 수 있다.
    • 추가적인 인덱스 관리: 중복되지 않도록 일련번호 등을 생성하기 위해 추가적으로 관리가 필요할 수 있다. 자동으로 생성되는 PK 인덱스 외에도 데이터 접근성을 높이기 위해 인덱스를 추가하게 되면, 저장공간을 더 차지하게 되고 DML 성능에 영향을 줄 수 있다.
    • 인덱스 낭비: 불필요하게 많은 인덱스를 생성하는 경우, 저장 공간을 낭비하고 갱신 연산에 부하를 준다.

*참고: 인덱스(INDEX)란, 데이터베이스가 데이터를 빠르게 찾기 위해 순서를 유지하고 있는 데이터이다. 보통 PK로 설정된 칼럼은 자동적으로 INDEX가 걸려 있다.

  • 장점: 데이터를 빠르게 찾을 수 있다.
  • 단점: 정렬된 순서를 유지해야되기 때문에, 데이터가 추가되거나 삭제될 때, 인덱스를 유지하는 추가 작업이 필요하고 데이터 추가 용량이 필요하다. 또한, 인덱스를 잘 못 걸면 서치 속도가 굉장히 느려질 수 있다.