Key의 종류와 설명
슈퍼키
: 각 행을 구분할 수 있는 속성들 중, 유일성을 만족하는 속성들의 집합
후보키
: 슈퍼키 중, 최소성을 만족하는 속성들의 집합으로 종속적인 속성들이 포함되지 않음
기본키
: 후보키 중, 테이블을 대표할 수 있는 속성들의 집합 (기본키가 아닌 후보키는 대체키가 됨)
-> 후보키와 다른 점은 무조건 NULL값을 가질 수 없다는 점이다.
외래키
: 다른 테이블의 기본키를 참조하는 값. 개체와의 관계를 식별하는 데 사용
필드 타입
CHAR - 테이블 생성 시, 선언한 길이로 고정해서 사용됩니다.
VARCHAR - 입력된 데이터에 따라 용량을 가변시켜 저장합니다.
트랜잭션이란?, ACID 원칙
트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 의미합니다.
- 원자성(Atomicity) : 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것을 말합니다. 데이터의 무결성을 보장할 수 있습니다.
- 일관성(Consistency) : '허용된 방식'으로만 데이터를 변경해야하는 것을 의미합니다.
- 격리성(Isolation) : 트랜잭션 수행 시 서로 끼어들지 못하는 것을 의미합니다.
- 지속성(Durability) : 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미합니다.
트랜잭션의 격리레벨
- SERIALIZABLE : 트랜잭션을 순차적으로 실행시키는 것을 의미합니다. 여러 트랜잭션이 동시에 같은 행에 접근이 불가합니다. 동시 처리 성능이 매우 떨어집니다.
- REPEATABLE_READ : 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아줍니다. 하지만 INSERT는 막지 않습니다.
- READ_COMMITTED : 가장 많이 사용되는 격리 수준으로, 커밋하기 전에는 SELECT할 수 없도록 합니다. 하지만 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 있습니다.
- READ_UNCOMMITED : 커밋하지 않은 데이터들에 대해 접근할 수 있는 격리 수준입니다. 가장 빠르지만 데이터 정합성에 문제가 생길 수 있습니다.
인덱스가 무엇이고, 언제 사용하는지
인덱스는 책의 목차처럼 행마다 표시를 해두고 데이터의 조회 성능을 높일 수 있게 합니다.
인덱스가 효율적인 이유는 효율적인 단계를 거쳐 모든 요소에 접근할 수 있는 트리구조와 트리 깊이의 대수확장성 때문입니다.
⭐️ 대수 확장성
: 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것
B-Tree와 B+Tree?

인덱스는 B-Tree 자료구조로 이루어져 있습니다. 루트 노드, 브랜치 노드, 리프 노드로 나뉘는 것을 알 수 있습니다.
B-Tree는 정렬된 값을 기반으로 위의 그림과 같이 '균형 트리'를 만들며, 10^6 개의 항목을 10번의 탐색만으로 찾을 수 있다는 특징을 가지고 있습니다.
B+Tree는 B-Tree와 달리 리프 노드에만 데이터가 저장되어 있고 리프 노드들끼리 Linked List로 연결되어 있다는 특징이 있습니다. 리프 노드에서 선형 탐색
을 진행합니다.
정규화가 무엇인지
정규화 과정은 DB의 저장 공간을 효율적으로 사용하기 위해 테이블을 여러 개로 분리하거나 테이블 간의 잘못된 종속 관계로 인해 이상 현상이 발생해 이를 해결하는 목적으로 테이블을 분리하는 것을 의미합니다.
각각의 릴레이션이 독립적으로 표현이 가능해야하며 자료의 중복성은 감소해야합니다.
- 제 1 정규형 : 모든 도메인이 더 이상 분해될 수 없는 원자 값으로 구성되어야 합니다. 또한 컬럼 간에 비슷하거나 겹치는 컬럼이 없어야 합니다.
- 제 2 정규형 : 기본키가 복합키일 경우, 부분 함수 종속성을 제거하여 완전 함수 종속성을 갖는 테이블로 변경해야 합니다.
- 제 3 정규형(BCNF) : 기본키가 아닌 다른 컬럼들에 의존하는 이행적 종속성을 제거하여 테이블을 분리해야 합니다.