[Database] 데이터베이스

엔터티 entity

서비스의 요구 사항에 맞춰 정해진 여러 속성을 지닌 객체(명사)

 

릴레이션relation

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

관계형 데이터베에스에서는 '테이블', NoSQL 데이터베에스에서는 '컬렉션'이라고 한다.

 

속성 attribute

릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보

서비스의 요구 사항을 기반으로 관리해야할 필요가 있는 속성들만 엔터티의 속성이 된다. 

 

도메인 

릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합

ex) 성별 속성 - {남, 여}

 

관계

(1) 1 : 1 관계

(2) 1 : N 관계 -  한 객체가 다른 많은 객체를 포함하는 관계

(3) N : M 관계 - 테이블 두 개를 직접 연결하지 않고 1 : N, 1 : M 관계를 갖는 테이블 두 개로 나눠서 설정


유일성 - 중복되는 값이 없는 것

최소성 - 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것

 

기본키 primary key (PK)

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

테이블의 데이터 중 고유하게 존재하는 속성 ex) ID

 

외래키 Foreign key (FK)

다른 테이블의 기본키를 그대로 참조하는 값으로 개체와 관계를 식별하는 데 사용한다. 

중복 가능

 

후보키 candidate key 

기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키

 

대체키 alternate key

후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들

 

슈퍼키 (super key)

각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키

 

자연키

중복된 값을 제외하며 자연스럽게 나타나는 중복되지 않는 키

언젠가는 변하는 속성을 가진다. 

 

인조키 

인위적으로 생산한 키, 보통 기본키는 인조키로 설정한다. 

auto increment 등으로 설정


 

ERD (Entity Relationship Diagram)

데이터베이스를 구축할 때 가장 기초적인 뻐대 역할을 하며, 릴레이션 간의 관계들을 정의한 것이다.

관계형 구조로 표현할 수있는 데이터를 구성하는 데에는 유용하지만 비정형 데이터를 충분히 표현할 수 없는 단점을 가지고 있다.

 

비정형 데이터 = 비구조화 데이터

미리 정의된 데이터 모델이 없거나 미리 정의된 방식으로 정리되지 않은 정보를 의미한다. 

 

정규화 과정

릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나,

저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정

 

제1 정규형 - 모든 도메인이 원자 값만으로 구성되어 한다.

제2 정규형 - 완전 함수적 종속 

더보기

함수적 종속이란?

테이블의 한 필드값(X)이 다른 필드값(Y)을 결정하는 관계

종속자가 기본 키에만 종속되고, 기본키가 여러 개일 경우 기본키를 구성하는 모든 속성이 기본키의 부분집합에 종속될 경우

제3 정규형 - 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 상태

더보기

이행적 함수 종속이란?

A -> B와 B -> C가 존재하면 논리적으로는 A -> C가 성립하는데 이 때, 집합 C가 집합 A에 이행적으로 함수 종속이 되었다고 한다.

보이스/코드 정규형 -  릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태


트랜잭션

데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위

ACID 특징을 가지고 있다.

 

(1) 원자성 (atomicity)

트랜잭션과 관련된 일이 모두 수행되었거나 수행되지 않았거나를 보장하는 특징

ex) 트랜잭션을 커밋했는데, 문제가 발생해서 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것

 

트랜잭션 단위로 여러 로직을 묶을 때는 외부 API를 호출하는 것이 있으면 안 된다. 만약에 있다면 롤백이 일어났을 때의 해결 방법이 있어야 하고 트랜잭션 전파를 신경 써서 관리해야 한다. 

 

 

커밋 commit

여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어

트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것을 의미한다. 

커밋이 수행되었다라는 말은 하나의 트랜잭션이 성공적으로 수행되었다는 것과 동일하다.

 

롤백 rollback

트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 되돌리는 것(취소)

 

트랜잭션 전파

트랜잭션을 수행할 때 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 한다. 

하지만 매번 넘겨서 수행하지 않고 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 말한다.

 

(2) 일관성 (consistency)

'허용된 방식'으로만 데이터를 변경해야 한다. 일관성 있는 데이터베이스 상태로만 변화해야한다. 

ex) 돈을 줄 때 잔액보다 많이 보내는 경우는 불가능하다.

 

(3) 격리성 (isolation)

여러 트랜잭션이 동시에 수행될 경우에 다른 트랜잭션의 연산에 서로 끼어들지 못해야 한다.


격리 수준에 따라 발생하는 현상

팬텀 리드 - 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우 (다른 행이 선택될 수 있다.)

반복 가능하지 않은 조회 - 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우 (행 값이 달라질 수 있다.)

더티 리드 - 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은' 행의 데이터를 읽을 수 있을 때 발생

 

격리 수준

격리성이 낮으면 동시성이 강해지지만, 격리성이 높으면 동시성은 약해진다.

 

SERIALIZABLE - 팬텀 리드 발생

트랜잭션을 순차적으로 진행시키는 것

- 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.

- 해당 행에 격리시키고 이후 트랜잭션이 이 행에 대해 일어날 경우 기다려야 한다.

- 따라서 교착 상태가 일어날 확률이 많고 가장 성능이 떨어지는 격리 수준

 

REPEATABLE_READ - 팬텀리드, 반복 가능하지 않은 조회 발생

하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는다. 

- 이후에 행이 추가되면 발견할 수도 있다.

 

READ_COMMITTED - 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드 발생

가장 많이 사용되는 격리 수준

다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없다. (커밋 완료된 데이터만 조회가 가능하다.)

- 다만, 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있다.

- 따라서 트랜잭션이 같은 행을 다시 읽을 때 다른 내용일 발견될 수 있다. 

 

READ_UNCOMMITTED

가장 낮은 격리 수준

하나의 트랜잭션이 커밋되기 저에 다른 트랜잭션에 노출되는 문제가 생긴다. 


(4) 지속성 (durability)

성공적으로 트랜잭션이 수행되었다면 영원히 반영되어야 한다. 

- 데이터베이스에 시스템 장애가 발생하더라도 원상복구 기능이 있어야 한다. 

- 이 때문에 체크섬, 저널링, 롤백 등의 기능을 제공한다. 

더보기

체크섬

오류 정정을 통해 송신된 자료의 무결성을 보호하는 방법

 

저널링

변경 사항을 반영(commit)하기 전에 변경 사항에 대한 로그를 남기는 것


인덱스

데이터를 빠르게 찾을 수 있는 하나의 장치이다.

RDBMS에서 검색 연산 속도를 높이기 위한 방법

주로 B-트리 자료구조로 이루어져 있다. 

 

B 트리

이진트리에서 발전되어 모든 리프노드들이 같은 레벨을 가질 수 있도록 자동으로 밸런스를 맞추는 트리

- 정렬된 순서를 보장하고 멀티레벨 인덱싱을 통한 빠른 검색이 가능하다. 

 

인덱스가 효율적인 이유

효율적인 단계를 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조와 트리 깊이의 대수확장성 때문이다. 

더보기

대수확장성

트리의 깊이가 리프 노드 수 에 비해 매우 느리게 성장하는 것

 

인덱스를 만드는 방법

MySQL 

(1) 클러스터형 인덱스

- 테이블당 하나만 설정 가능

- 인덱스로 지정한 열에 맞춰서 자동으로 정렬

- 사전처럼 책의 내용 자체가 순서대로 정렬되어 있어, 인덱스 자체가 책의 내용과 같음

 

(2) 세컨더리 인덱스

- 보조 인덱스로 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야 하는 인덱스

 

MongoDB (참고)

도큐먼트를 만들면 자동으로 ObjectID가 형성되며, 해당 키가 기본키로 설정된다. 

부가적으로 세컨더리키도 설정해서 기본키와 세컨더리키를 같이 쓴 복합 인덱스를 설정할 수 있다.

 


조인의 종류

조인(join)은 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것을 의미한다. 

 

두 개의 테이블이 있고 둘 사이에 교집합이 있다는 가정으로 설명하자면

(1) 내부 조인(inner join) 

두 테이블 간의 교집합

 

(2) 왼쪽 조인 (left outer join)

오른쪽 테이블의 일치하는 부분의 레코드와 함께 왼쪽 테이블을 기준으로 완전한 레코드 집합을 생성한다. 

오른쪽 테이블에 일치하는 항목이 없다면 해당 값은 null 값이 된다. 

 

(3) 오른쪽 조인 (right outer join)

왼쪽 조인의 반대 

 

(4) 합집합 조인 (full outer join)

두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기

양쪽 테이블에 일치하는 레코드와 함께 모든 레코드 집합을 생성한다.

일치하는 항목이 없다면 누락된 쪽에 null 값이 포함되어 출력된다.