4.1 데이터베이스의 기본

데이터베이스는 일정한 규칙, 혹은 규약을 통해 구조좌되어 저장되는 데이터의 모음
데이터베이스를 제어, 관리하는 통합 시스템을 DBMS라고 하며 DBMS마다 정의된 쿼리 언어를 통해 삽입, 삭제, 조회가 수행된다
또 데이터베이스는 실시간 접근과 동시 공유가 가능하다

4.1.1 엔티티

엔티티는 사람, 장소, 물건, 사건, 개념 등 여러 개의 속성을 지닌 명사를 의미한다

약한 엔티티와 강한 엔티티

  • 약한 엔티티: 종속적인 엔티티(건물의 방)
  • 강한 엔티티: 종속성이 없는 엔티티(건물)

릴레이션(테이블)

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

릴레이션은 관계형 데이터베이스에서에서 테이블이라 하며 NoSQL에서는 컬렉션이라고 한다

테이블과 컬렉션

  • 관계형 데이터베이스(MySQL) : 레코드-테이블-데이터베이스 구조
  • NoSQL (MongoDB) : 도큐먼트-컬렉션-데이터베이스 구조


잠깐!

엔티티와 테이블의 차이는?

첫번째

엔티티는 실존하지 않는다 일종의 개념이다
테이블은 DB나 SQL에 실제로 존재하며 물리적인 구조를 지니고 있다

두번째

엔티티는 테이블이 될 수도 있고 안될수도 있다.
엔티티가 물리 모델링 안에선 테이블이지만 논리 모델링에선 가능하지만 실제 물리모델링에 쓰지 못하는 추상적인 엔티티 같은 경우 테이블이 될 수 없다

세번째


4.1.3 속성(칼럼)

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

4.1.4 도메인

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

4.1.5 필드와 레코드


회원이라는 엔티티

  • member : 테이블
    이름, 아이디라는 속성
  • nama, ID : 필드
  • 테이블 행 : 레코드
    레코드를 튜플이라고도 한다

필드 타입
필드는 타입을 가진다

  • 숫자 타입 : TYNYINT, SMALLINT, MEDIUMINT, INT, BIGINT

  • 날짜 타입 : DATA, DATETIME, TIMESTAMP

DATE
날짜 o 시간 x
1000-01-01 ~ 9999-12-31
3바이트

DATETIME
날짜 o 시간 o
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
8바이트

TIMESTAMP
날짜 o 시간 o
1970-01-01 00:00:01 ~ 2038-01-19 03:14:07
4바이트

  • 문자 타입 : CHAR, VARCHAR, TEXT, BLOB, ENUM, SET

CHAR와 VARCHAR
CHAR : 고정 길이 문자열 / 0 ~ 255 사이 / 무조건 선언한 길이 값으로 고정해서 저장됩니다
VARCHAR : 가변 길이 문자열 / 0 ~ 65,535 사이 / 입력된 데이터 따라 가변 시켜 저장
그러므로 유동적이지 않은 길이의 데이터 - CHAR
유동적 길이 데이터 - VARCHAR

TEXT와 BLOB
큰 데이터 저장 시 사용
TEXT : 큰 문자열 저장에 사용
BLOB : 이미지, 동용상 등

ENUM과 SET
문자열을 열거한 타입
ENUM은 ENUM('x-small', 'small', 'medium', 'large', 'x-large') 형태로 사용.
이 중에서 하나만 선택하는 단일 선택만 가능
ENUM 리스트에 없는 잘못된 값을 삽입하면 빈 문자열이 대신 삽입
ENUM 사용 시 값이 x-small 등이 0,1 등으로 매핑되어 메모리 적게 사용 이점, 65,535 요소 넣을 수 있음

4.1.6 관계

1:1 관계

1:N관계

N:M관게

N:M은 테이블 두 개를 직접적으로 연결해서 구축하지 않고 1:N, 1:M이라는 관계를 갖는 테이블 두 개로 나눠서 설정

4.1.7 키

무언가를 식별하는 고유한 식별자
테이블 간의 관계를 더 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치
기본키, 외래키, 후보키, 슈퍼키, 대체키 있음

1. 슈퍼키

테이블에서 각 행을 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합이다. 슈퍼키는 유일성만 만족하면 슈퍼키가 될 수 있다.

  • 유일성이란 하나의 키로 특정 행을 바로 찾아낼수 있는 고유한 데이터 속성을 말한다. 예를 들면 전국에서 나를 구별할 수 있는 유일하고 고유한 속성은 주민번호이듯이 말이다. 주민번호는 전국민이 모두 겹치지 않아 유일하고 고유한 구별 방법으로 쓰인다.

  • 이름과 나이를 묶어서 하나의 속성으로 만드는 것도 가능하다. 이름과 나이를 합쳐서 7조안에서 중복만 되지 않으면 가능하기 때문이다. 이름과 나이를 합쳐서 4명을 구분할 수 있으면 슈퍼키가 될 수 있다.

  • 학번과 주민번호를 묶어서 슈퍼키로 만들수도 있고, 학번과 주민번호과 이름을 합쳐서 슈퍼키로도 만들수 있고, 학번과 주민번호과 이름과 나이를 합쳐서 슈퍼키를 만들수도 있다. 어떤 속성끼리 묶던 중복값이 안나오고 서로 구별만 할 수 있으면 된다.

2. 후보키

  • 테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합이다. 후보키는 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족해야한다.

  • 학번 슈퍼키와 주민번호 슈퍼키는 속성들이 각 1개씩 이루어져 있다. 하지만 이름+나이 슈퍼키는 이름과 나이를 묶어서 2개의 속성으로 되어 있다. 이름+나이 슈퍼키는 2개 이므로 각 1개의 속성인 주민번호와 학번 슈퍼키가 최소성을 만족한다고 할 수 있다.

  • 따라서 이름+나이 슈퍼키는 갯수가 다른 것보다 많기 때문에 최소성을 만족하지 못해서 후보키가 될 수 없다

3. 기본키

  • 후보키들 중에서 하나를 선택한 키로 최소성과 유일성을 만족하는 속성이다.
  • 테이블에서 기본키는 오직 1개만 지정할 수 있다.
  • 기본키는 테이블 안에서 유일하게 각 행들을 구별할 수 있도록 쓰인다.
  • 기본키는 NULL 값을 절대 가질수 없고, 중복된 값을 가질 수 없다.
  • 각 행들을 구별하려면 값이 없어선 안되고, 중복되어서도 안되기 때문이다.

4. 대체키

  • 후보키가 두개 이상일 경우 그 중에서 어느 하나를 기본키로 지정하고 남은 후보키들을 대체키라한다.
  • 대체키는 기본키로 선정되지 않은 후보키이다.

  • 7조라는 팀에 팀원은 4명이다. 후보키로 학번과 주민번호가 뽑혔고, 둘 중에서 기본키는 학번이 되었다. 학번이 기본키가 되고 남은 후보키인 주민번호는 대체키가 될 수 있다. 학번 기본키가 없어지게 되면 주민번호는 없어진 기본키를 대체할 수 있게된다.

5. 외래키

  • 테이블이 다른 테이블의 데이터를 참조하여 테이블간의 관계를 연결하는 것이다. 데이터를 좀더 조회하기 쉽다.
  • 다른 테이블의 데이터를 참조할 때 없는 값을 참조할 수 없도록 제약을 주는 것이다.
  • 참조 될 테이블(A)이 먼저 만들어지고 참조하는 테이블(B)에 값이 입력되어야 한다.
  • 이때, 참조될(A) 열의 값은 참조될(A) 테이블에서 기본키(Primary Key)로 설정되어 있어야한다.
  • 외래키는 참조되는 테이블의 기본키와 동일한 키 속성을 가진다.
  • 참조되는 부모테이블이 먼저 생성된 뒤 데이터를 넣고, 참조하는 자식 테이블이 다음에 생겨야된다.
  • 부모 테이블 먼저 삭제될 수 없다. 왜냐하면 부모테이블을 참조하는데 부모테이블이 삭제되면 자식테이블은 참조하는 것이 없어지기 때문에 외래키 오류가 생긴다.
  • 외래키 관계에서 부모테이블을 삭제하려면 자식테이블 먼저 삭제한 후 부모테이블을 삭제해야한다.
  • 부모 테이블은 학생 테이블이고, 자식 테이블은 수강 테이블이다.
  • 학생테이블은 학번이 기본키이자 참조되는 참조키이다.
  • 수강테이블은 학번이 참조하는 키이자 외래키이다.

4.2 ERD의 정규화 과정

ERD(Entity Relationship Diagram)는 데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, 릴레이션 간의 관계들을 정의한 것

4.2.1 ERD의 중요성

ERD는 시스템의 요구 사항을 기반으로 작성되며 이 ERD를 기바능로 데이터베이스를 구축한다. 데이터베이스를 구축한 이후에도 디버깅 또는 비즈니스 프로세스 재설계가 필요한 경우에 설계도 역할을 담당한다
*하지만 비정형 데이터를 표현할 수 없다는 단점이 있다.

4.2.3 정규화 과정

정규화(Normalization)의 기본 목표는 테이블 간에 중복된 데이타를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.

  • 정규화 과정은 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정

  • 데이터베이스 이상 현상이란 회원이 한 개의 등급을 가져야 하는데 세 개의 등급을 갖거나 삭제할 때 필요한 데이터가 같이 삭제되고, 데이터를 삽립해야 하는데 하나의 필드 값이 Null이 되면 안되어서 삽입하기 어려운 현상을 말함

  • 정규화 과정은 정규형 원칙을 기반으로 정규형을 만들어가는 과정이며, 정규화된 정도는 정규형으로 표현한다.
    기본 정규형 - 제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형
    고급 정규형 - 제4정규형, 제5정규형

정규형의 원칙

정규형의 원칙이란 같은 의미를 표현하는 릴레이션이지만 좀 더 좋은 구조로 만들어야 하고, 자료의 중복성은 감소해야 하고, 독립적인 관계는 별개의 릴레이션으로 표현하야 하며, 각각의 릴레이션은 독립적인 표현이 가능해야 하는 것을 말한다

제1정규형

릴레이션(테이블)의 모든 도메인(칼럼)이 더 이상 분해될 수 없는 원자 값(atomic value)을 갖도록 테이블을 분해하는 것

제2정규형

릴레이션(테이블)이 제1정규형이며 부분 함수의 종속성을 제거한 형태를 말함
부분 함수의 종속성 제거란 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것을 말함

*주의할 점
릴레이션을 분해할 때 동등한 릴레이션으로 분해해야 하고, 정보 손실이 발생하지 않는 무손실 분해로 분해되어야 한다

제3정규형

제2정규형이면서 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 상태를 말합니다
(제 2정규형이면서 이행적 함수 종속성을 제거한 정규형)

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

  • 이렇게 분리된 테이블에서는 각 테이블에서 필요한 정보만을 저장하고 있어 데이터의 중복이 최소화되며, 데이터의 일관성과 무결성이 보장됩니다. 예를 들어, 같은 고객이 여러 번 주문을 할 경우에도 해당 고객의 정보는 한번만 저장되며, 고객 정보의 변경이 발생할 경우에도 한 곳만 수정하면 됩니다. 이렇게 데이터의 중복을 최소화하여 데이터베이스의 성능, 일관성, 유연성을 향상 시킬 수 있습니다.

보이스/코드 정규형

보이스/코드 정규형(BCNF)은 제 3정규형이고 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태를 말한다.

용어

- 결정자
함수 종속 관계에서 특정 종속자를 결정짓는 요소. X->Y'일 때 X는 결정자, Y는 종속자

  • 위 경우 제 3정규형을 만족한다 하지만 이상현상이 생긴다

- 삽입 이상 : 새로운 교수가 특정 과목을 담당한다는 새로운 정보를 추가할 수 없다. 적어도 한명 이상의 수강 학생이 필요하다
- 삭제 이상 : 학번 100이 C234 과목을 취소하면, P2가 C234 과목을 담당한다는 정보도 삭제된다.
- 갱신 이상 : P1의 과목이 변경되면 P1인 행을 모두 찾아 변경시켜주어야 한다.

이러한 이상현상이 생기는 이유는, 결정자가 후보키로 취급되고 있지 않기 때문이다
후보키는 슈퍼키 중에서 최소성을 갖는 키이므로 이 릴레이션에서는 (학번, 과목명)이나 (학번, 담당교수)가 후보키가 된다. 담당 교수만으로는 후보키가 될 수 없다
하지만 후보키가 아님에도 과목명을 결정할 수 있기 때문에 담당 교수는 결정자에 속한다.

이 이상현상을 해결하기 위해서 모든 결정자는 항상 후보키가 되도록 릴레이션을 분해해주면 강한 제3정규형, 즉 BCNF를 만족하게 된다.

정규형 과정이 무조건 옳은것은 아니다. 테이블을 나누게 되면 어떠한 쿼리는 조인을 해야 하는 경우도 발생해 오히려 느려질 수 있기 때문에 서비스에 따라 정규화 또는 비정규화 과정을 진행해야 함

4.3 트랜잭션과 무결성

4.3.1 트랙잭션

트랜잭션은 데이터베이스에서 한 단위의 작업이 수행되는 것을 의미하며, 데이터베이스의 상태를 일관된 상태로 유지하는 데 사용되는 개념입니다. 트랜잭션은 데이터베이스에서 데이터의 무결성, 일관성, 독립성, 지속성을 보장하기 위해 사용됩니다.

BEGIN TRANSACTION; -- 트랜잭션 시작

UPDATE 계좌 SET 잔액 = 잔액 - 1000 WHERE 계좌번호 = 'A0001'; -- 출금 작업
UPDATE 계좌 SET 잔액 = 잔액 + 1000 WHERE 계좌번호 = 'B0001'; -- 입금 작업

COMMIT; -- 트랜잭션 종료, 작업을 확정함

위 예시에서 BEGIN TRANSACTION은 트랜잭션을 시작하는 명령입니다. 그리고 COMMIT은 트랜잭션을 종료하고 작업을 확정하는 명령입니다. 만약 트랜잭션 도중에 오류가 발생하거나 중단되는 경우, ROLLBACK 명령을 사용하여 트랜잭션을 취소하고 이전 상태로 되돌릴 수 있습니다. 이렇게 트랜잭션을 사용하여 데이터의 일관성과 무결성을 보장할 수 있습니다.

원자성

"all or nothing"

원자성은 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징
예를 들어 트랜잭션을 커밋했는데 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것을 말한다

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

커밋과 롤백
커밋은 여러 쿼리가 성공적으러 처리되었다고 확정하는 명령어. 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적을 저장되는 것을 말한다

롤백이란 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일을 말한다.

커밋과 롤백에 의해 데이터 무결성이 보장된다.

트랜잭션 전파
트랜잭션을 수행할 때 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 한다. 하지만 이를 매번 넘겨주기가 어렵다. 이를 넘겨서 수행하지 않고 으려 트랜잭션 관련 메서드의 호출으 ㄹ하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 한다.

일관성
일관성은 '허용된 방식'으로만 데이터를 변경해야 하는 것을 의미. 데이터베이스에 기록된 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져야한다.
예를 들어 A에게 1000만원, B에게 0원 있을 대 B는 A에게 500만원을 입금할 수 없다

격리성
격리성(isolation)은 트랜잭션 수행 시 서로 끼어들지 못하는 것을 말한다.
격리성은 여러 개의 격리 수준으로 나뉘어 격리성을 보장한다

격리 수준은 SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED가 있으며 위로 갈수록 동시성이 강해지지만 격리성은 약해진다.

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

1. 팬텀리드
팬텀 리드는 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 말함

예)
첫 번째 트랜잭션이 "모든 고객의 계좌 잔액이 100만원 이상인 고객 조회"라는 쿼리를 실행하고, 두 번째 트랜잭션이 동일한 쿼리를 실행하여 결과를 확인하는 경우를 생각해보겠습니다. 그 사이에 다른 트랜잭션이 고객 C의 계좌에 150만원을 입금한다면, 두 번째 트랜잭션에서는 처음과는 다른 결과가 나타나게 됩니다. 이렇게 동일한 쿼리를 실행하더라도, 다른 트랜잭션에 의해 데이터가 변경되어 원치 않은 결과가 나타날 수 있는 것이 유령 리드입니다.

2.반복 가능하지 않은 조회
반복 가능하지 않은 조회는 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데 그 값이 다른 경우를 가리킴.

예)
트랜잭션이 동일한 데이터를 두 번 이상 읽어올 때, 그 사이에 다른 트랜잭션이 해당 데이터를 수정하여 다른 결과가 나타나는 경우 발생합니다. 예를 들어, 첫 번째 트랜잭션이 고객 A의 계좌 잔액을 조회한 후, 두 번째 트랜잭션이 고객 A의 계좌에서 입금 작업을 수행하면, 첫 번째 트랜잭션에서 다시 계좌 잔액을 조회할 때 다른 결과가 나타날 수 있습니다.

* 팬텀리드와 반복 가능하지 않은 조회의 차이
반복 가능하지 않은 조회는 행 값이 달라질 수도 있는데 팬텀 리드는 다른 행이 선택될 수도 있다는 것을 의미

3. 더티 리드
반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은' 행의 데이터를 읽을 수 있을 때 발생.

예)
첫 번째 트랜잭션이 고객 A의 계좌에서 출금 작업을 수행하였지만 아직 트랜잭션이 완료되지 않았을 때, 두 번째 트랜잭션이 고객 A의 계좌 잔액을 조회하면 출금이 반영되기 전의 데이터를 읽어올 수 있습니다.

격리수준
SERIALIZABLE
말 그대로 트랜잭션을 순차적을 진행시키는 것. 매우 엄격한 수준. 가장 성능 떨어짐

REPEATABLE_READ
하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는다. 따라서 이후에 추가된 행이 발견될 수 있음(팬텀리드)

READ_COMMITTED
가장 많이 사용되는 격리 수준 RDBMS들의 기본값. 커밋 완료된 데이터에 대해서만 조회를 허용
하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있음. 트랜잭션 A가 수정한 행을 트랜잭션 B가 수정할 수 있다. 트랜잭션 A가 다시 행을 읽을 때 다른 내용이 발견될 수 있음(반복 가능하지 않은 조회)

READ_UNCOMMITTED
가장 낮은 격리 수준. 한 트랜잭션 커밋 전에 다른 트랜잭션에 노출되지만 가장 빠름.몇몇 행이 제대로 조회되지 않아도 상관없는 '어림잡아' 집계할 시 사용

지속성

지속성은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미. 시스템 장애 시에도 복구 기능이 있어야 함을 의미. EX) 체크섬(중복 검사), 저널링(변경 사항 로깅)

4.3.2

무결성이란 데이터의 정확성, 일관성, 유효성을 유지하는 것


4.4 데이터베이스의 종류

4.4.1 관계형 데이터베이스

관계형 데이터베이스는 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스
SQL로 조작

MYSQL

C, C++로 만들어짐, b-트리 기반 인덱스, 스레드 기반 메모리 할당 시스템, 매울 빠른 조인

POSTGRESQL

디스크 조각이 차지하는 영역을 회수할 수 있는 장치인 VACUUM이 특징, SQL과 JSON으로 데이터 접근

4.4.2 NOSQL 데이터베이스

MONGO DB

JSON을 통해 데이터 접근, Binary JSON 형태로 데이터 저장. 키-값 데이터 모델에서 확장된 도큐먼트 기반 DB. 확장성 좋도 빅데이터 저장 시 성능 좋고 고가용성, 샤딩, 레플리카셋을 지원

REDIS

인메모리 데이터베이스. 키-값 데이터 모델 기반 DB
기본 데이터 타입은 무낮열. 셋, 해시 지원
PUB/SUB 기능을 통해 채팅, 실시간 랭킹 서비스에 사용


4.5 인덱스

4.5.2 B-트리

인덱스는 보통 B-트리 구조

인덱스 설명 유튜브

예)

정렬된 데이터가 저장된 트리에서 루트 노드에서부터 브랜치 노드를 거쳐 리프노드에 도달해 57이 가리키는 데이터 포인터를 통ㅎ래 결괏값을 반환하게 된다

인덱스가 효율적인 이유와 대수확장성

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

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


트리 깊이는 열개짜리, 100만개의 레코드를 검색할 수 있다는 의미. 인덱스의 효율성

4.5.4 인덱스 최적화 기법

1. 인덱스는 비용이다

인덱스는 두번 탐색한다. 인덱스 리스트 그다음 컬렉션 순. 읽기 비용이 든다.
컬렉션 수정 시 인덱스도 수정
B-트리의 높이를 균형있게 조절하는 비용, 데이터를 효율적을 ㅗ조회할 수 있도록 분산시키는 비용

2.항상 테스팅하라

3.복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다

여러 필드 기반 조회할 때 복합 인덱스 생성. 인덱스 생성 시 순서가 있고 순서에 따라 인덱스 성능이 달라짐. 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야한다

4.6 조인의 종류

조인: 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것
MYSQL - JOIN / MongoDB - lookup
Mongo DB에서 최대한 조인 연산 안쓰는 것이 좋다(성능 떨어짐)

조인의 종류

  • 내부조인: 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행이 있는 부분만 표기
  • 왼쪽조인: 왼쪽 테이블의 모든 행이 결과 테이블에 표기
  • 오른쪽조인: 오른쪽 테이블의 모든 행이 결과 테이블에 표기
  • 합집합 조인: 두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기

왼쪽 테이블 : A
오른쪽 테이블 : B

4.6.1 내부 조인

교집합

4.6.2 왼쪽 조인

테이블 B의 일치하는 부분의 레코드와 함께 테이블 A를 기준으로 완전한 레코드 집합을 생성. 만약 테이블 B에 일치하는 항목이 없으면 해당 값은 null 값이 됨

4.6.3 오른쪽 조인

테이블 A에서 일치하는 부분의 레코드와 함께 테이블 B를 기준을 완전한 레코드 집합을 생성. 만약 테이블 A에 일치하는 항목이 없으면 해당 값은 null 값이 된다

4.6.4 합집합 조인

합집합 조인은 양쪽 테이블에서 일치하는 레코드와 함께 테이블 A와 테이블 B의 모든 레코드 집합을 생성한다. 이때 일치하는 항복이 없으면 누락된 쪽에 null 값이 포함 출력

4.7 조인의 원리

4.7.1 중첩 루프 조인

중첩 로프 조인은 중첩 for 문과 같은 원리. 조건에 맞는 조인을 하는 방법. 랜덤 접근에 대한 비용이 많이 증가하기 때문에 대용량 의 테이블에서는 사용하지 않는다

4.7.2 정렬 병합 조인

정렬 병합 조인이란 각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인. 조인할 대 쓸 적절한 인덱스가 없고 대용량의 테이블을 조인하고 조인 조건으로 <, > 등 범위 비교 연산자가 있을 때 씀

4.7.3 해시 조인

해시 테이블을 기반으로 조인하는 방법. 두 개 테이블 조인 한다고 했을 때 하나의 테이블이 메모리에 온전히 들어간다면 보통 중첩 루프 조인보다 더 효율적(메모리에 올릴 수 없을 정도로 크다면 디스크를 사용하는 비용이 발생된다) 또한 동등(=) 조인에서만 사용할 수 있다.

빌드 단계

빌드 단계는 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계

예를 들어 persons와 countries라는 테이블 조인한다고 했을 때 둘 중 바이트가 더 작은 테이블을 기반으로 해서 테이블을 빌드

또한 조인에 사용되는 필드가 해시 테이블의 키로 사용된다.

프로브 단계

프로브 단계 동안 레코드 읽기를 시작, 각 레코드에서 'persons.country_id'에 일치하는 레코드를 찾아서 결괏값으로 반환

이를 통해 각 테이블은 한 번씩만 읽게 되어 중첩해서 두개의 테이블을 읽는 중첩 루프 조인보다 보통은 성능이 더 좋다.


자료출처

인덱스

profile
88888888

0개의 댓글