blair's 개발 portfolio

[면접을 위한 CS 전공지식 노트] 데이터베이스

  • 데이터베이스는 일정한 규칙 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음
  • 데이터베이스를 제어,관리하는 통합 시스템을 DBMS라고 하며, 데이터베이스 안에 있는 데이터들은 특정 DBMS마다 정의된 쿼리 언어를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있다
  • 실시간 접근과 동시 공유 가능
  • 엔터티는 사람, 장소, 물건, 사건, 개념 등 여러개의 속성을 지닌 명사를 의미

  • 약한 엔터디와 강한 엔터티로 나뉜다
  • b가 존재여부에 따라 종속적이라면 a는 약한 엔터티고 b는 강한 엔터티가 된다

릴레이션

  • 릴레이션은 데이터베이스에서 정보를 구분하여 저장하는 기본 단위
  • 엔터티에 관한 데이터를 데이터베이스는 릴레이션 하나에 담아서 관리
  • 릴레이션은 관계형 데이터베이스에서는 '테이블'이라고 한다

 

  • 데이터베이스의 종류는 크게 관계형 데이터베이스와 noSQL 데이터베이스로 나눌 수 있다
  • MySQL의 구조는 레코드-테이블-데이터베이스로 이루어져있다
  • 레코드가 쌓여서 테이블이 되고 테이블이 쌓여서 데이터베이스가 되는 것

속성

  • 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보
  • 서비스의 요구 사항을 기반으로 관리해야 할 필요가 있는 속성들만 엔터티의 속성이 된다

 

도메인

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

  • 회원이라는 릴레이션에 이름, 아이디, 주소 전화번호, 성별이라는 속성이 있고 성별은  {남,여}라는 도메인을 가지는 것을 알 수 있다

 

필드와 레코드

  • 데이터베이스와 필드와 레코드로 구성된 테이블을 만들 수 있다
  • 테이블에 쌓이는 행 단위의 데이터를 레코드라고 한다 또한 레코드를 튜플이라고도 한다
  • 그리고 각 속성에 맞는 타입을 넣어 테이블을 만든다

 

필드 타입

  • 필드는 타입을 갖는다
  • 이러한 타입들은 DBMS마다 다르고 mysql 기준

 

  • 숫자타입으로는 TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 등이 있다
  • 날짜타입으로는 DATE,DATETIME,TIMESTAMP
  • 문자타입으로는 CHAR,VARCHAR,TEXT,BLOB,ENUM,SET

관계

  • 여러개의 테이블이 있고 테이블은 서로의 관계가 정의되어 있다
  • 이러한 관계를 관계화살표로 나타낸다

1:1 관계

  • ex) 유저당 유저 이메일은 1:1
  • 두개의 테이블로 나눠 테이블의 구조를 더 이해하기 쉽게 만들어준다

1:N

  • ex) 한 유저당 여러개의 상품을 장바구니에 넣을 수 있는 관계 1:n
  • 한 개체가 다른 많은 개체를 포함하는 관계

N:M

  • ex) 학생과 강의의 관계

 

  • 테이블 간의 관계를 조금더 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치로 기본키, 외래키, 후보키, 슈퍼키, 대체키가 있다

  • 슈퍼키는 유일성이 있고 후보키는 유일성과 최소성까지 갖춘 키
  • 후보키 중에서 기본키로 선택되지 못한 키는 대체키가 된다
  • 유일성은 중복되는 값은 없으며, 최소성은 필드를 조합하지 않고 최소 필드만 써서 형성할 수 있는 것

 

  • 기본키는 줄여 PK, 프라이머리키라고도 부러며 유일성과 최소성을 만족하는 키
  • 테이블의 데이터 중 고유하게 존재하는 속성 기본키에 해당하는 데이터는 id처럼 중복되어서는 안됌
  • 기본키는 자연키 또는 인조키 중에 골라 설정

 

  • 자연키 : 언젠가는 변하는 속성
  • 인조키 : 인위적으로 생성한 키, 변하지 않는다 보통 기본키는 인조키로 설정

 

  • 외래키 : FK라고도하며 다른 테이블의 기본키를 그대로 참조하는 값으로 개체와의 관계를 식별하는 데 사용
  • 중복되어도 괜찮다

 

  • 후보키 : 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키
  • 대체키 : 후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들을 말함
  • 슈퍼키 : 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키

 

2. ERD와 정규화 과정

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

 

ERD의 중요성

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

 

정규화 과정

  • 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상현상이 일어나서 이를 해결하거나 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정
  • 이상현상이란 회원이 한개의 등급을 가져야하는데 세개의 등급을 갖거나 삭제할 때 필요한 데이터가 같이 삭제되고 데이터를 삽입해야 하는데 하나의 필드 값이 NULL이 되면 안되어서 삽입하기 어려운 현상을 말한다
  • 정규화 과정은 정규형 원칙을 기반으로 정규형을 만들어나가는 과정 정규화된 정도는 정규형(NF)으로 표현

 

정규형 원칙

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

 

제 1정규형

  • 릴레이션의 모든 도메인이 더이상 분해될 수 없는 원자값으로 구성되어야 한다 
  • 한개의 기본키에 대해 두개 이상의 값을 가지는 반복 집합이 있어서는 안됩니다 있다면 제거

 

제 2정규형 

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

 

제 3정규형

  • 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 상태를 말한다

 

보이스코드 정규형

  • 제 3정규형이고 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태를 말한다

 

3. 트랜젝션

  • 트랜젝션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 데이터베이스에 접근하는 방법은 쿼리이므로 여러개의 쿼리를 하나로 묶는 단위를 말한다
  • 특징은 : 원자성, 일관성, 독립성, 지속성  => ACID 특징이라고 말한다

 

원자성 :

  • 트랜젝션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징
  • 커밋을 했는데 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것
  • 트랜잭션 단위로 여러 로직을 묶을때 외부 API 를 호출하는 것이 있으면 안된다
  • 만약 있다면 롤백이 일어났을 때 어떻게 해야할 것인지에 대한 해결방법이 있어야 하고 트랜잭션 전파를 신경써서 관리

 

커밋과 롤백

  • 커밋은 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어
  • 롤백은 에러나 여러 이슈 떄문에 트랜젝션 전으로 돌려야 하는 상황에서 사용, 트랜젝션으로 처리한 하나의 묶음 과정을 일어나기 전ㅇ으로 돌리는 일

 

트랜젝션 전파 

  • 트랜젝션은 커넥션 단위로 수행하지만 매번 하기 힘들기때문에 여러 트랜젝션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜젝션 전파

 

일관성 :

  • 허용된 방식으로만 데이터를 변경해야하는 것을 의미

 

격리성 :

  • 트랜젝션 수행 시 서로 끼어들지 못하는 것
  • 복수의 병렬 트랜젝션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어애 하고 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다
  • 격리성은 여러개의 격리 수준으로 나뉘어 격리성을 보장
  • 격리 수준에 따라 발생하는 현상 : 팬텀리드, 반복 가능하지 않은 조회, 더티 리드
  • 팬텀리드 : 트랜젝션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
  • 반복 가능하지 않은 조회 : 한 트랜젝션 내의 같은 행에 두 번 이상 조회가 발생했는데 그 값이 다른 경우를 가리킨다
  • 더티리드 : 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은' 행의 데이터를 읽을 수 있을 때 발생
  • 격리 수준 : SERIALIZABLE, REPEATABLE_READ, READ_COMMIT,READ_UNCOMMITED

 

지속성 :

성공적으로 수행된 트랜젝션은 영원히 반영되어야 하는 것을 의미

이는 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻함

체크섬, 저널링, 롤백등의 기능을 제공

 

체크섬 : 중복검사의 한 형태로 오류정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법
저널링 : 파일 시스템 또는 데이터베이스 시스템에 변경 사항을 반영하기 전에 로깅하는 것, 트랜잭션 등 변경 사항에 대한 로그를 남기는것

 

  • 무결성 : 데이터의 정확성, 일관성, 유효성을 유지하는 것을 말하며, 무결성이 유지되어야 데이터베이스에 저장된 데이터 값과 그값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다

무결성은 종류는 

개체 무결성 기본키로 선택된 필드는 빈 값을 허용하지 않는다
참조 무결성 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다
고유 무결성 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 후 그 속성 값은 모두 고유한 값을 가진다
NULL 무결성 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 후 그 속성 값은 NULL이 될 수 없다는 제약 조건

 

4. 데이터베이스 종류

  • 관계형 데이터베이스는 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스를 가리키며 SQL이라는 언어를 써서 조작한다
  • MySQL은 대부분의 운영체제와 호환되며 현재 가장 많이 사용하는 데이터베이스
  • PostgreSQL : CACUUM이 특징 JSON을 통해서 데이터를 접근 가능

 

NoSQL 데이터베이스

  • Not only SQL이라는 슬로건에서 생겨난 데이터베이스 대표적으로 MongoDB, redis가 있다

 

5. 인덱스

인덱스의 필요성 : 데이터를 빠르게 찾을 수 있는 하나의 장치

 

B-트리 :

인덱스는 B-트리라는 자료 구조로 이루어져 있고 이는 루트 노드, 리프 노드, 루트노드와 리프노트 사이에 있는 브랜치 노드로 나뉜다

 

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

  • 효율적인 이유는 : 효율적인 단계를 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조와 트리 깊이의 대수 확장성 때문
  • 대수 확장성이란 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것을 의미
  • 기본적으로 인덱스가 한 깊이씩 증가할 때마다 최대 인덱스 항목의 수는 4배씩 증가


인덱스를 만드는 방법

  • MySQL의 경우 클러스터형 인덱스와 세컨더리 인덱스가 있으며
  • 클러스터형 인덱스는 : 데이블당 하나를 설정할 수 있다 primary key 옵션으로 기본키를 만들면 클러스터형 인덱스를 생성할 수 있고, 기본키로 만들지 않고 unique not null 옵션을 붙이며 클러스터형 인덱스로 만들 수 있다
  • 세컨더리 인덱스는 : create index 명령어를 기반으로 만들면 된다

 

MongoDB

도큐먼트를 만들면 objectID가 형성되며, 해당 키가 기본키로 설정

 

인덱스 최적화 기법

 

1. 인덱스는 두번 탐색하도록 한다 인덱스 리스트, 컬렉션 순으로 탐색하기 때문이며, 관련 읽기 비용이 든다

2. 최적화기법은 서비스 특징에 따라 달라지고 사용하는 개체의 깊이, 테이블의 양이 다르기 때문인데 그래서 테스팅은 중요하다

3 복합 인덱스를 생성할 때 순서가 있고 생성 순서에 따라 성능이 달라진다 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 한다

 

6. 조인의 종류

  • 조인이란 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것을 말한다
  • 내부 조인(inner join) : 왼쪽 테이블과 오른쪽 테이블의 두행이 모두 일치하는 행이 있는 부분만 표기
  • 왼쪽 조인(left outer join): 왼쪽 테이블과 모든 행이 결과 테이블에 표기
  • 오른쪽 조인(right outer join): 오른쪽 테이브르이 모든 행이 결과 테이블에 표기
  • 합집합 조인(full outer join): 두개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기

내부조인

 

두 테이블 간에 교집합을 나타낸다

SELECT * FROM TableA A
INNER JOIN TableB B ON
A.key = B.key

왼쪽 조인

테이블 B의 일치하는 부분의 레코드와 함께 테이블 A를 기준으로 완전 레코드 집합을 생성

일치하는 항목이 없으면 해당 값은 null

SELECT * FROM TableA A
LEFT JOIN TableB B ON
A.key = B.key

오른쪽 조인 

테이블 A에서 일치하는 부분의 레코드와 함께 테이블 B를 기준으로 완전한 레코드 집합을 생성

일치하는 항목이 없으면 해당 값은 null

SELECT * FROM TableA A
RIGHT JOIN TableB B ON
A.key = B.key

합집합 조인

양쪽 테이블에서 일치하는 레코드와 함께 테이블 A와 테이블 B의 모든 레코드 집합을 생성

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

SELECT * FROM TableA A
FULL OUTER JOIN TableB B ON
A.key = B.key

 

7. 조인의 원리

중첩 루프 조인(NLJ, Nested Loop Join)

  • 중첩 for문과 같은 원리로 조건에 맞는 조인을 하는 방법이며, 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않음
  • 블록 하나씩 조인하는 블록 중첩 조인도 있음

 

정렬 병합 조인

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

 

해시 조인

  • 해시 테이블을 기반으로 조인하는 방법. 두개의 테이블을 조인한다고 했을 때 하나의 테이블이 메모리에 온전히 들어간다면 보통 중첩 루프 조인보다 더 효율적 동등 조인에서만 사용 가능

 

빌드 단계 

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

프로브 단계

  • 프로브 단계 동안 레코드 읽기를 시작하며, 각 레코드에서 'persons.country_id'에 일치하는 레코드를 찾아서 결괏값으로 반환
  • 이를 통해 한번씩만 읽게되어 중첩 루프조인보다 성능이 좋다

 

 

블로그의 정보

개발 블로그👩‍💻

Blairj

활동하기