본문 바로가기
  • 실행력이 모든걸 결정한다
IT 상식/CS

[CS] 데이터베이스 요약

by 김코더 김주역 2022. 11. 20.
반응형

1. 데이터베이스 기초

1) 데이터베이스와 DBMS

- 데이터베이스 : 운영 데이터의 저장소

- DBMS : 데이터베이스를 관리(무결성 및 보안 유지)하는 시스템 - 예) MySQL, Oracle, MSSQL, MariaDB

- SQL(Structured Query Language) : DBMS의 데이터에 접근하기 위한 언어

- 일반적으로 응용프로그램에서 DBMS를 통해 데이터베이스의 데이터에 접근한다.

 

 

2) Entity

- 하나 이상의 속성을 가진 개체

- 약한 엔티티 : 혼자서는 존재하지 못하고 다른 엔티티에 포함되는 엔티티

- 강한 엔티티 : 다른 엔티티를 포함하는 엔티티

 

 

3) Relation

- 데이터베이스에서 정보를 구분하여 저장하는 기본 단위

- 관계형 데이터베이스에서는 테이블이라고 부르고, NoSQL 데이터베이스에서는 컬렉션이라고 부른다. 관계형 데이터베이스는 레코드(행)이 모여 테이블이 되고 테이블이 모여 데이터베이스가 되는 반면에, NoSQL 데이터베이스는 도큐먼트가 모여 컬렉션이 되고 컬렉션이 모아 데이터베이스가 된다.

 

 

4) Attribute와 Domain

- Attribute : Relation에서 관리되는 고유한 이름을 갖는 정보

- Domain : 각 Attribute가 가질 수 있는 값의 집합

- 예를 들어, Attribute 이름이 성별이라면 Domain은 {남, 여}가 될 수 있다.

 

 

5) Field와 Record

- Field : 테이블에 정의된 Attribute

- Record : 테이블의 행을 뜻하며, 튜플이라고도 부른다.

 

MySQL 기준 필드 타입

  • 숫자 타입 : INT, SMALLINT, BIGINT 등
  • 날짜 타입 : DATE(YYYY-MM-DD), DATETIME(YYYY-MM-DD HH:MM:SS), TIMESTAMP(YYYY-MM-DD HH:MM:SS UTC)
  • 문자 타입 : CHAR(고정 길이), VARCHAR(가변 길이), TEXT(큰 문자열용), BLOB(이미지/영상 저장용), ENUM, SET

 

 

6) 관계

이미지 출처 : https://freehoon.tistory.com/60

- 1:1, 1:N, N:M 관계가 있다.

- 일반적으로 N:M 관계는 연결 테이블을 사이에 둬서 1:N, 1:M 관계로 분리한다.

 

 

7) Key

- 튜플을 식별하기 위한 속성 또는 속성들

- Key의 종류는 유일성과 최소성의 여부에 따라 달라진다.

※ 유일성 : 중복되는 값이 없음

※ 최소성 : 최소 필드 개수로 구성됨

 

(1) 기본키

- 유일성과 최소성을 만족하는 키

- 비즈니스적 의미를 담고 있는 자연키보다는 인위적으로 만든 식별자인 인조키를 주로 기본키로 사용한다.

 

(2) 외래키

- 다른 테이블의 기본키를 참조하는 속성

- 중복과 NULL을 허용한다.

 

(3) 후보키

- 기본키가 될 수 있는 후보들

 

(4) 대체키

- 후보키들 중 하나를 기본키로 지정하고 남은 후보키들

 

(5) 슈퍼키

- 유일성은 만족하지만 최소성은 만족하지 않는 키

 

 

8) 스키마

- 데이터베이스의 구조와 제약 조건에 대한 명세

- 개념적 설계 : 정보 모델링

- 논리적 설계 : 데이터를 DBMS가 지원하는 형식의 데이터로 변환

- 물리적 설계 : 데이터를 물리적 저장장치에 저장할 수 있는 데이터로 변환

 

 

2. ERD(Entity Relationship Diagram)

- 릴레이션 간의 관계들을 정의한 다이어그램

- 서비스를 구축할 때 가장 먼저 신경써야 할 부분이다.

- 관계형 구조로 표현할 수 있는 데이터를 구성하는 데 유용하지만, 비구조화(비정형) 데이터는 충분히 표현할 수 없다.

 

 

 

3. 정규화

- 정규화는 최적화와 이상 현상(anomaly) 해결을 위해 릴레이션을 여러 개로 분리하는 과정이다.

※ 이상 현상 : 데이터의 삽입, 삭제, 수정 시 발생하는 중복, 무결성 저하, 논리적 오류 현상

※ 반정규화 : 성능의 향상을 위해 정규화 원칙을 위배하는 것 (테이블 분할, 테이블 통합, 중복 테이블 추가, 중복 속성 추가)

- 정규화를 통해 자료의 중복성은 감소해야 하고, 독립적인 관계는 별개의 릴레이션으로 표현해야 한다.

- 정규화의 정도를 NF로 나타낼 수 있다.

 

1) 1NF

- 모든 속성값들이 원자적인 하나의 값만을 가지는 상태

 

 

2) 2NF

- 부분적 종속 관계를 모두 완전한 종속 관계로 만드는 것

※ 후보키 집합 K와 K에 속하지 않는 속성 A가 있을 때, A를 결정하기 위해 K의 일부가 아닌 K 전체를 참조해야만 한다.

- 기본적으로 1NF의 조건을 포함

 

 

3) 3NF

- 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 것

※ 이행적 함수 종속 : A->B, B->C일 때, A->C가 성립하는 것

- 기본적으로 2NF의 조건을 포함

 

 

4) BCNF

- 모든 결정자가 후보키인 상태

※ 어떤 릴레이션에서 X와 Y를 각각 속성의 부분집합이라고 할 때, X의 값을 알면 Y의 값을 바로 식별할 수 있고, X의 값에 Y의 값이 달라질 때, Y는 X에 함수적 종속이라고 한다. 이 경우 X를 결정자, Y를 종속자라고 하고 기호로 표현하면 X→Y이다.

- 기본적으로 3NF의 조건을 포함

 

 

 

4. 트랜잭션

1) 트랜잭션이란?

- 하나의 논리적 기능을 수행하기 위한 작업의 단위

- 하나 이상의 쿼리들로 이루어져 있음

- 데이터의 무결성, 일관성을 보장함

 

 

2) 원자성

- 트랜잭션에 있는 작업은 모두 수행되거나 모두 수행되지 않아야 한다는 특징

- Commit : 트랜잭션 작업에 대한 결과를 영구적으로 반영하는 명령

- Rollback : 트랜잭션 작업에서 수행한 모든 내용을 취소하는 명령

 

 

3) 트랜잭션 전파(Propagation)

- 서로의 트랜잭션이 어떻게 영향을 미치게 하는가, 즉 트랜잭션 간의 의존 관계를 정의하는 것

- 기본적으로 이미 시작된 트랜잭션이 있다면 이에 참여하는 방식을 이용한다.

 

 

4) 격리(Isolation) 수준

- 동시에 여러 트랜잭션이 진행될 때 트랜잭션 작업 결과를 다른 트랜잭션에게 어떻게 노출할지를 결정하는 속성

 

(1) READ_UNCOMMITTED

- 가장 낮은 격리 수준으로, 하나의 트랜잭션이 커밋되기 전에 그 변화가 다른 트랜잭션에 노출된다.

※ 이처럼 하나의 트랜잭션이 커밋되기 전에 그 변화가 다른 트랜잭션에 노출되는 문제를 Dirty Read라고 한다.

- 데이터의 일관성은 떨어지더라도 속도는 매우 빠르다.

 

(2) READ_COMMITTED

- 대부분의 DB가 따르는 기본 격리 수준이다.

- 하나의 트랜잭션이 아직 커밋되지 않았다면 다른 트랜잭션에 그 변화가 노출되지 않는다.

- 하나의 트랜잭션이 읽은 row가 도중에 커밋한 다른 트랜잭션에 의해 수정될 수 있다.

※ 이처럼 같은 행을 두 번 이상 조회했을 때 값이 달라지는 문제를 Non-repeatable Read라고 한다.

- 실제로 가장 많이 사용되는 격리 수준이다.

 

(3) REPEATABLE_READ

- 하나의 트랜잭션이 읽은 row가 도중에 다른 트랜잭션에 의해 수정되는 것을 막아준다.

- 새로운 row가 추가되는 것 까지는 막지 못한다.

※ 이처럼 반복 조회 시 결과 집합이 달라지는 것을 Phantom Read라고 한다.

 

(4) SERIALIZABLE

- 가장 강력한 격리 수준으로, 트랜잭션을 순차적으로 진행시킨다. 즉, 여러 트랜잭션이 동시에 같은 테이블에 접근하지 못하게 막는다.

- 가장 안전하지만 성능이 떨어진다.

 

 

5) 지속성

- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것

- 데이터베이스에 장애가 발생해도 체크썸, 로깅, 롤백 등을 이용한 복구 기능이 있어야 함

 

 

6) 무결성

- 데이터의 정확성, 일관성, 유효성을 합친 개념

  • 개체 무결성 : 기본키는 null을 허용하지 않음
  • 도메인 무결성 : 주어진 속성 값이 정의된 도메인(범위)에 속한 값이어야 함
  • 참조 무결성 : 외래키는 참조할 수 없는 값을 가질 수 없음
  • 고유 무결성 : 속성값이 고유하도록 설정했다면 그 속성값은 고유한 값을 가져야 함
  • NULL 무결성 : 속성값이 NULL이 될 수 없도록 설정했다면 그 속성값은 NULL이 되어서는 안됨

- 무결성을 강화하기 위한 방법

  • 애플리케이션 : 복잡한 조건의 구현이 가능하지만, 관리가 힘듦
  • 트리거 : 복잡한 조건의 구현도 가능하고 통합 관리에도 좋지만, 변경이 어려움
  • 제약 조건 : 통합 관리에 좋지만, 복잡한 조건의 구현이 어려움

 

 

5. 관계형 데이터베이스 VS NoSQL 데이터베이스

1) 관계형 데이터베이스

- 행과 열을 가지는 표 형식의 데이터를 저장

- 자료의 구조와 관계를 정의하는 스키마를 사용함

- SQL를 통해 접근

  • MySQL : C, C++ 기반 / B-트리 기반 / 모듈식 아키텍쳐 / 빠른 조인 / 쿼리 캐시 지원
  • MSSQL
  • PostgreSQL : JSON을 통한 데이터 접근 / VACUUM을 통한 디스크 공간 관리 / 작업 예약 지원
  • Oracle

 

2) NoSQL 데이터베이스

- key-value 쌍을 가지는 도큐먼트 형식의 데이터를 저장

- SQL과 스키마를 사용하지 않음

- 일관성은 보장하지 못하며 구조에 대한 유연성과 확장성이 뛰어남

  • MongoDB : JSON 또는 BSON(Binary JSON)을 통한 데이터 접근 / 도큐먼트 기반 데이터
  • redis : 기본적으로 문자열 타입의 데이터를 사용 / set과 hash 지원 / 실시간 서비스와 캐싱 계층에 많이 사용

 

3) 결론

- 관계형 데이터베이스는 일관성이 보장되며, NoSQL 데이터베이스는 구조 유연성이 뛰어나다.

- 데이터의 구조가 명확하고 데이터들이 자주 변한다면 관계형 데이터베이스를 사용하고, 그렇지 않다면 NoSQL을 사용한다.

 

 

 

6. Index

1) Index 사용 이유

- 검색 속도 향상

 

 

2) B-Tree

- 인덱스는 B-Tree로 이루어져 있다.

- B-Tree는 루트/브랜치/리프 노드로 이루어져 있으며, 각 노드 안에 여러 데이터가 정렬되어 있는 구조다.

- 루트 노드부터 리프 노드까지 내려오며 정렬된 값을 기반으로 탐색한다.

- 균형 잡힌 깊이의 트리 구조 덕분에 효율적이다.

 

 

3) 인덱스의 종류

- 클러스터형 인덱스 : 테이블 당 하나만 생성할 수 있으며, 데이터 자체가 저장됨

- 논클러스터형(보조) 인덱스 : 하나의 테이블에 여러 개를 생성할 수 있으며, 데이터의 주소가 저장됨

 

 

4) 인덱스 최적화

- 인덱스는 읽기/수정 비용과 B-Tree의 균형 조절 비용이 발생하기 때문에 무작정 인덱스를 도입하는 것이 좋은게 아니다. 따라서, 서비스 특징에 따라 인덱스의 사용 여부를 결정해야 한다.

- 인덱스는 데이터의 범위가 넓고 중복이 적으며, 조회가 잦고 수정이 드문 컬럼에 사용하는 것이 좋다.

- 복합 인덱스의 권장 생성 순서 : 같음 비교 필드 > 정렬 필드 > 다중 값 필드 > 유니크한 필드

※ 복합 인덱스 : 2개 이상의 컬럼으로 구성된 인덱스

 

 

 

7. Join

1) Join이란?

- 2개 이상의 테이블을 묶는 연산

- 대부분 해시 테이블을 기반으로 효율적으로 조인한다.

 

 

2) Join의 종류

  • 내부 조인 : 두 테이블의 join 조건에 맞는 행만 표시
  • 왼쪽 조인 : 왼쪽 테이블은 join 조건에 맞지 않더라도 모든 행을 표시
  • 오른쪽 조인 : 오른쪽 테이블은 join 조건에 맞지 않더라도 모든 행을 표시
  • 외부 조인 : join 조건에 맞지 않더라도 두 테이블 모두 모든 행을 표시

※ join 조건이 맞지 않아 존재하지 않는 데이터는 null로 표시됨

 

 

 

8. 프로시저와 트리거

- 프로시저 : 호출을 통해 실행되는 작업

- 트리거 : 이벤트를 통해 실행되는 작업

- 사용자 정의 함수 : 프로시저와 유사하지만 결과값을 반환한다는 차이가 있음

 

 

 

9. SQL

- DDL(데이터 정의어) : 데이터베이스 구조에 대한 정의

- DML(데이터 조작어) : 데이터를 처리

- DCL(데이터 제어어) : 데이터를 관리(보안, 무결성, 회복 등)

- 단문 SQL 테스트 : DESCRIBE 명령어를 통해 테이블 정보를 확인하거나 SELECT 문을 이용

- 절차형 SQL 테스트 : 디버깅 이용

- 권한 정보 확인 : SHOW 명령어

- SQL 최적화 기법

  • SELECT * 사용 금지
  • 중복 값을 제거하는 연산은 자제
  • 서브쿼리에서 ORDER BY 금지
  • IN 대신 EXISTS 사용 : EXISTS는 일치하는 항목이 발견되는 즉시 검색을 종료함
  • 타입 변환 최소화
  • JOIN 시 크기가 가장 큰 테이블을 FROM 절에 배치

 

 

 

10. 기타 DB 용어

- 시스템 카탈로그 : 시스템에 관련된 메타 데이터를 저장하는 데이터베이스

- 데이터 사전 : 데이터베이스에 대한 메타 데이터를 저장하는 곳

- 클러스터 : 검색 효율을 위해 동일한 성격의 데이터를 동일한 데이터 블록에 저장하는 방법

- View : 일부 데이터만을 보여주기 위한 가상의 테이블로, 물리적으로 구현되어 있지 않음

- JDBC : Java 언어 기반의 DBMS 접속 기술

- ORM : 객체와 관계형 데이터베이스를 매핑하는 기술

- 하둡(Hadoop) : 여러 컴퓨터를 묶어 대용량 데이터를 처리하는 기술

- 데이터 마이닝 : 데이터 집합에서 유용한 정보를 추출하는 기법

 

반응형

'IT 상식 > CS' 카테고리의 다른 글

[CS] 소프트웨어 공학 요약  (0) 2022.12.01
[CS] 자료구조 요약  (0) 2022.11.26
[CS] 운영체제 요약  (0) 2022.11.10
[CS] 네트워크 요약  (0) 2022.11.06
[CS] 디자인 패턴과 프로그래밍 체계 요약  (0) 2022.11.01

댓글