728x90

데이터베이스의 기본

  • 엔터티
    • 여러 개의 속성을 지닌 명사
    • 약한 엔터티, 강한 엔터티
      • A가 혼자서는 존재하지 못하고 B의 존재 여부에 따라 종속적일 경우, A는 약한 엔터티, B는 강한 엔터티
  • 릴레이션
    • DB에서 정보를 구분하여 저장하는 기본 단위
    • 관계형 데이터베이스에서는 '테이블', NoSQL 데이터베이스에서는 '컬렉션' 이라고 함
  • 속성
    • 릴레이션에서 관리하는 구체적이고 고유한 이름을 갖는 정보
  • 도메인
    • 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합
  • 관계
    • 1:1 관계
      • 하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우
    • 1:N 관계
      • 하나의 레코드가 다른 테이블의 레코드 여러 개와 연결된 경우
    • N:M 관계
      • 여러 레코드가 다른 테이블의 레코드 여러 개와 연결된 경우
    • 테이블 간의 관계를 조금 더 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치
    • 기본키 (Primary Key)
      • 유일성과 최소성을 만족하는 키
      • 테이블의 데이터 중 고유하게 존재하는 속성
      • 자연키와 인조키 중에 선택하여 설정
    • 자연키
      • 중복된 값들을 제외하며 중복되지 않는 것을 '자연스레' 뽑다가 나오는 키
      • 언젠가는 변하는 속성을 가짐
    • 인조키
      • 인위적으로 생성한 키
      • 변하지 않는 속성을 가짐
    • 외래키 (Foreign Key)
      • 다른 테이블의 기본키를 그대로 참조하는 값
    • 후보키 (Candidate Key)
      • 기본키가 될 수 있는 후보들
      • 유일성과 최소성을 동시에 만족하는 키
    • 대체키 (Alternate Key)
      • 후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들
    • 슈퍼키 (Super Key)
      • 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키

ERD와 정규화 과정

  • ERD (Entity Relationship Diagram)
    • 릴레이션 간의 관계들을 정의한 것
    • 관계형 구조로 표현할 수 있는 데이터를 구성하는데 유용할 수 있지만 비정형 데이터를 표현하는 데는 어려움이있음
  • 정규화
    • 릴레이션을 여러개로 분리하는 과정
      • 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 해결하기 위해서
      • 저장 공간을 효율적으로 사용하기 위해서
    • 정규형 원칙
      • 같은 의미를 표현하는 릴레이션이지만 좀 더 좋은 구조로 만들어야 함
      • 자료의 중복성 감소
      • 독립적인 관계는 별개의 릴레이션으로 표현
      • 각각의 릴레이션은 독립적인 표현이 가능해야 함
    • 제1정규형
      • 릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값만으로 구성되어야 함
    • 제2정규형
      • 제1정규형이고 부분 함수의 종속성을 제거한 형태
      • 부분 함수의 종속석 제거
        • 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것
      • 릴레이션 분해 시 동등한 릴레이션으로 분해해야 하며, 무손실 분해로 분해되어야 함
    • 제3정규형
      • 제2정규형이고 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 상태
      • 이행적 함수 종속 (transitive FD)
        • A -> B, B -> C 가 존재하면 논리적으로 A->C 가 성립하는데, 이 때 집합 C가 집합 A에 이행적으로 함수 종속이 되었다고 함
    • 보이스/코드 정규형 (BCNF)
      • 제3정규형이고 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태
      • 결정자
        • 함수 종속관계에서 특정 종속자(dependent)를 결정짓는 요소
    • 정규화를 거쳐 테이블을 나눴을 때 성능이 안 좋아지는 경우도 있기에 서비스에 따라 정규화 또는 비정규화 과정을 진행해야 됨

트랜잭션과 무결성

  • 트랜잭션
    • 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위
    • 여러 개의 쿼리들을 하나로 묶는 단위
    • ACID 특징이 있음
    • 원자성 (Atomicity)
      • 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징
      • 커밋
        • 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어
        • 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것
      • 롤백
        • 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일
      • 트랜잭션 전파
        • 트랜잭션을 수행할 때 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 함
        • 이를 넘겨서 수행하지 않고 여러 트랜잭션 관련 매서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것
    • 일관성 (Consistency)
      • '허용된 방식'으로만 데이터를 변경해야 하는 것
      • 데이터베이스에 기록된 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져야 함
    • 격리성 (Isolation)
      • 트랜잭션 수행 시 서로 끼어들지 못하는 것
      • 복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것 처럼 작동되어야 함
      • 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 함
      • 여러 개의 격리 수준으로 나뉘어 격리성을 보장함
      • SERIALIZABLE
        • 트랜잭션을 순차적으로 진행 시키는 것
        • 여러 트랜잭션이 동시에 같은 행에 접근할 수 없음
        • 교착 상태가 일어날 확률이 높고 가장 성능이 떨어지는 격리 수준
      • REPEATABLE_READ
        • 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없게 하는 것
        • 새로운 행의 추가는 막지 않음
        • 팬텀 리드 발생 가능
        • 팬텀 리드
          • 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
      • READ_COMMITTED
        • 커밋 완료된 데이터에 대해서만 조회를 허용
        • 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있음
        • 팬텀 리드, 반복 가능하지 않은 조회 발생 가능
        • 반복 가능하지 않은 조회
          • 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우
      • READ_UNCOMMITTED
        • 가장 낮은 격리 수준
        • 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제 발생
        • 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드 발생 가능
        • 더티 리드
          • 한 트랜잭션이 수행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은' 해으이 데이터를 읽을 수 있을 때 발생
    • 지속성 (Durability)
      • 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것
      • 데이터베이스에 장에가 발생해도 원상태롤 복구하는 회복 기능이 있어야 함
      • 이를 위해서 체크섬, 저널링, 롤백등의 기능을 제공
      • 체크섬
        • 중복 검사의 한 형태
        • 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법
      • 저널링
        • 파일 시스템 또는 데이터베이스 시스템에 변경 사항을 반영하기 전에 로깅하는 것
  • 무결성
    • 데이터의 정확성, 일관성, 유효성을 유지하는 것
    • 개체 무결성
      • 기본키로 선택된 필드는 빈 값을 허용하지 않음
    • 참조 무결성
      • 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 함
    • 고유 무결성
      • 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가짐
    • NULL 무결성
      • 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL 이 될 수 없다는 제약 조건

데이터베이스의 종류

  • 관계형 데이터베이스 (RDBMS)
    • 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스
    • SQL이라는 언어를 써서 조작
    • MySql
      • C, C++로 만들어졌으며, MyISAM 인덱스 압축 기술, B-트기 기반의 인덱스, 스레드 기반의 메모리 할당 시스템, 매우 빠른 조인, 최대 64개의 인덱스 제공
      • 롤백, 커밋, 이중 암호 지원 보안 등의 기능을 제공
      • 모듈식 아키텍처로 쉽게 스토리지 엔진 교체 가능
      • 데이터 웨어하우징, 트랜잭션 처리, 고가용성 처리에 강점
      • 쿼리 캐시를 지원해서 입력된 쿼리 문에 대한 전체 결과 집합을 저장하기 때문에 사용자가 작성한 쿼리가 캐시에 있는 쿼리와 동일하면 구문 분석, 최적화 및 실행을 건너뛰고 캐시의 출력만 표시
    • PostgreSQL
      • 디스크 조각이 차지하는 영역을 회수할 수 있는 장치인 VACUUM이 특징
      • 최대 테이블 크기: 32TB
      • SQL뿐만 아니라 JSON을 이용해서 데이터에 접근 가능
      • 지정 시간에 복구하는 기능, 로깅, 접근 제어, 중첩된 트랜잭션, 백업 등의 기능 제공
  • NoSQL 데이터베이스
    • NoSQL(Not Only SQL)이라는 슬로건에서 생겨난 데이터베이스
    • MongoDB
      • JSON을 통해 접근 가능
      • Binary JSON 형태(BSON)로 데이터가 저장되며 와이어드타이거 엔진이 기본 스토리지로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스
      • 확장성이 뛰어나며 빅데이터를 저장할 때 성능이 좋음
      • 샤딩, 레플리카셋을 지원
      • 스키마를 정해 놓지 않고 데이터를 삽입할 수 있기 때문에 다양한 도메인의 데이터베이스를 기반으로 분석하거나 로깅 등을 구현할 때 강점을 보임
      • 도큐먼트를 생성할 때마다 다른 컬렉션에서 중복된 값을 지니기 힘든 유니크한 값이s ObjectID가 생성됨
    • redis
      • 인메모리 데이터베이스
      • 키-값 데이터 모델 기반의 데이터베이스

인덱스

  • 인덱스
    • 데이터를 빠르게 찾을 수 있는 하나의 장치
    • 일반적으로 B-트리라는 자료 구조로 이루어져 있음
    • 효율저인 단계를 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조와 트리 깊이의 대수확장성 때문에 효율적임
    • 대수확장성
      • 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것

조인의 종류

  • 조인 (join)
    • 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것
    • 내부 조인 (inner join)
      • 두 테이블 간에 교집합
    • 왼쪽 조인 (left join)
      • 왼쪽 테이블을 기준으로 오른쪽 테이블에서 일치하는 부분의 레코드와 완전한 레코드 집합을 생성
      • 오른쪽 테이블에 일치하는 항목이 없으면 해당 값은 null 값으로 출력됨
    • 오른쪽 조인 (right join)
      • 오른쪽 테이블을 기준으로 왼쪽 테이블에서 일치하는 부분의 레코드와 완전한 레코드 집합을 생성
      • 왼쪽 테이블에 일치하는 항목이 없으면 해당 값은 null 값으로 출력됨
    • 합집합 조인 (full outer join)
      • 양쪽 테이블에서 일치하는 레코드와 함께 모든 레코드 집합을 생성
      • 일치하는 항목이 없으면 누락된 쪽에 null 값이 포함되어 출력됨

조인의 원리

  • 중첩 루프 조인 (NLJ, Nested Loop Join)
    • 중첩 fo 문과 같은 원리로 조건에 맞는 조인을 하는 방법
    • 랜덤 접근에 대한 비용이 증가하므로 대용량 테이블에서는 사용하지 않음
  • 블록 중첩 루프 조인 (BNL, Block Nested Loof Join)
    • NLJ 에서 발전한 방법으로 조인할 테이블을 작은 블록으로 나눠서 하나씩 조인하는 방법
  • 정렬 병합 조인
    • 각 테이블을 조인할 필드 기준으로 정렬하고 조인작업을 수행하는 방법
  • 해시 조인
    • 해시 테이블을 기반으로 조인하는 방법
    • 동등 조인에서만 사용 가능
    • MySQL의 해시조인 단계는 빌드 단계, 프로브 단계로 나뉨
    • 빌드 단계
      • 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계
      • 바이트가 더 작은 테이블을 기반으로 해시 테이블 빌드
      • 조인에 사용되는 필드가 해시 테이블의 키로 사용됨
    • 프로브 단계
      • 레코드 읽기를 시작하며, 일치하는 레코드를 찾아서 결괏값으로 반환

+ Recent posts