728x90
데이터베이스의 기본
- 엔터티
- 여러 개의 속성을 지닌 명사
- 약한 엔터티, 강한 엔터티
- A가 혼자서는 존재하지 못하고 B의 존재 여부에 따라 종속적일 경우, A는 약한 엔터티, B는 강한 엔터티
- 릴레이션
- DB에서 정보를 구분하여 저장하는 기본 단위
- 관계형 데이터베이스에서는 '테이블', NoSQL 데이터베이스에서는 '컬렉션' 이라고 함
- 속성
- 릴레이션에서 관리하는 구체적이고 고유한 이름을 갖는 정보
- 도메인
- 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합
- 관계
- 1:1 관계
- 하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우
- 1:N 관계
- 하나의 레코드가 다른 테이블의 레코드 여러 개와 연결된 경우
- N:M 관계
- 여러 레코드가 다른 테이블의 레코드 여러 개와 연결된 경우
- 1:1 관계
- 키
- 테이블 간의 관계를 조금 더 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치
- 기본키 (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의 해시조인 단계는 빌드 단계, 프로브 단계로 나뉨
- 빌드 단계
- 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계
- 바이트가 더 작은 테이블을 기반으로 해시 테이블 빌드
- 조인에 사용되는 필드가 해시 테이블의 키로 사용됨
- 프로브 단계
- 레코드 읽기를 시작하며, 일치하는 레코드를 찾아서 결괏값으로 반환
'독후감 > 면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
면접을 위한 CS 전공지식 노트 (5) - 자료 구조 (0) | 2025.05.28 |
---|---|
면접을 위한 CS 전공지식 노트 (3) - 운영체제 (1) | 2025.05.09 |
면접을 위한 CS 전공지식 노트 (2) - 네트워크 (0) | 2025.05.09 |
면접을 위한 CS 전공지식 노트 (1) - 디자인 패턴과 프로그래밍 패러다임 (0) | 2025.05.08 |