SQL이란?
SQL은 선언적인 언어로, 관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어입니다. SQL을 통해 데이터베이스의 구조 지정, 데이터 삽입/수정/조회/삭제, 성능 향상과 최적화를 진행할 수 있습니다. SQL이 선언적 언어인 이유는 무엇을 할지에 대해서만 정의해주고, 구체적인 동작 과정은 데이터베이스의 옵티마이저에 일임하여 최적화된 방법으로 처리하도록 하기 때문입니다.
파일시스템에 비해 데이터베이스가 가지는 장점은?
데이터베이스는 여러 사용자와 응용 프로그램이 동시에 접근할 수 있고, 통합하여 관리하기 때문에 데이터의 중복을 최소화하는 동시에 데이터의 일관성을 유지할 수 있습니다. 또한 허가된 사용자들만 데이터베이스에 접근할 수 있도록 설정함으로써 데이터의 보안성도 파일시스템에 비해 높습니다. 접근 방법이 응용프로그램에 상세하게 표현되어 있는 파일 시스템과 달리 데이터데이스는 비교적 독립적으로 존재하여, 프로그램을 수정하지 않더라도 데이터의 구조를 변경할 수 있습니다.
정규화에 대해 설명하시오
정규화란 이상현상이 있는 릴레이션을 분해해 이상현상을 없애는 과정입니다. 즉, 데이터 무결성을 유지하기 위해 테이블을 분할하여 중복 데이터를 제거하는 과정입니다. 정규화를 통해 데이터베이스 구조 확장 시 재디자인을 최소화 할 수 있지만, join 연산이 많아져 응답시간이 늦어질 수 있습니다.
제1정규형은 각 컬럼은 같은 종류와 1개의 값만 가지고, 순서가 상관없어야 한다입니다.
제2정규형은 기본키의 특정 키에만 종속적인 컬럼이 없는 완전 함수적 종속성을 만족해야 한다입니다.
제3정규형은 A->B, B->C일 때 A->C가 만족하는 이행 함수적 종속을 없애는 과정입니다.
BCNF(Boyce-Codd)정규형은 모든 결정자가 후보키 집합에 포함되어야 합니다.
제4정규형은 A,B값에 따라 여러 C값이 존재하는 다치 종속을 없애는 과정입니다.
제5정규형은 분해 후 다시 조인 시 원래대로 돌아오는 조인종속을 없애는 과정입니다. A->B, A->C의 연관이 있다면 분리하게 됩니다.
이상현상(Anomaly)이란?
테이블을 잘못 설계하여 데이터를 삽입, 삭제, 수정할 때 발생하는 논리적 오류를 의미합니다. 크게 3가지 이상현상이 있습니다.
함수적 종속성이란?
함수적 종속성이란 결정자 A에 의해 종속자 B가 결정되는, 어떤 속성에 의해 다른 속성의 값이 결정되는 것을 의미합니다.
역정규화란?
정규화된 데이터베이스에서 성능이나 편의성을 향상시키기 위해 사용하는 전략입니다. 쓰기 성능의 하락과 중복이 있을 수 있지만 읽기 성능을 높이기 위해 사용합니다.
릴레이션 역정규화는 서로 다른 두 릴레이션 간 잦은 참조와 조인을 줄이기 위해 역정규화를 하는 릴레이션 병합과, 자주 사용하는 일부 데이터만 분리하는 릴레이션 분할(수평분할, 수직분할)입니다.
속성 역정규화는 현재 릴레이션에 없는 칼럼을 추가하여 계산을 줄이는 등에 사용하는 것을 의미합니다.
데이터베이스 무결성
데이터베이스에 저장된 데이터의 정확성, 일관성, 유효성을 지키는 것을 의미합니다. 무결성을 위한 제약조건은 아래와 같습니다.
데이터베이스 정합성
데이터가 올바른지에 대한 유무는 상관없이 데이터들의 값이 서로 일치하는지를 판단하는 것을 정합성이라고 합니다. 무결성보다는 작은 개념으로 볼 수 있습니다.
트랜잭션의 개념과 성질은?
트랜잭션은 데이터베이스의 상태를 변화시키는 논리적 단위로, 논리적인 작업 단위를 완수하지 못하면 원상태로 되돌려 일부만 반영되는 상황을 방지하여 완전성을 보장합니다.
트랜잭션은 ACID의 성질을 가지고 있습니다.
트랜잭션의 동시성 처리 이슈란?
트랜잭션의 동시성 처리 이슈란 실행시간 개선을 위해 트랜잭션을 병렬적으로 처리하는 경우에 발생합니다. 아래와 같은 문제가 발생할 수 있습니다.
트랜잭션의 격리 수준은?
트랜잭션은 크게 4가지의 격리 수준으로 나눌 수 있습니다.
트랜잭션 교착상태의 해결 방법은?
타임스탬프를 이용하여 회피할 수 있습니다. Wait-Die 방식으로 먼저 온 트랜잭션이라면 대기하고, 늦게 왔다면 취소 후 이후에 재요청하거나 Wound-Wait 방식으로 먼저 온 트랜잭션이라면 선점하고, 늦게온 트랜잭션이면 wait하는 방식을 통해 교착상태를 회피할 수 있습니다.
뷰란?
사용자에게 접근이 허용된 데이터만 보여주기 위해 하나 이상의 테이블로부터 유도된 가상 테이블입니다. 뷰를 사용함으로써 논리적 데이터 독립성을 제공할 수 있고, 데이터 관리를 간단하게 해줄 수 있습니다. 하지만 독립된 인덱스를 가질 수 없고 뷰의 정의를 변경할 수 없으며, 삽입/삭제 등의 연산에는 제약이 따릅니다.
MVCC란?(Multi-Version Concurrency Control)
Locking 방식의 동시성 문제를 해결하기 위해 등장한 개념입니다. 사용자가 데이터에 접근하는 순간의 데이터베이스의 snapshot을 읽고 해당 snapshot을 변경하게 됩니다. 변경이 완료된 데이터는 undo영역으로 들어가고, 이후 이전 데이터와 비교하여 변경된 내용을 기록한다. 단 여러 사용자의 수정으로 인해 여러 버전이 존재할 수 있는데, 이는 어플리케이션 영역에서 처리를 해야합니다.
NoSQL의 종류와 특징은?
noSQL은 정해진 규격이 없고 칼럼이 지정되지 않아 자유롭게 데이터를 삽입할 수 있다는 특징이 있습니다. 관계를 별도로 정의하지 않으며 분산처리가 훨씬 쉽습니다. 데이터베이스의 무중단 서비스와 복구 서비스를 지원합니다. 트랜잭션과 조인이 존재하지 않습니다.
noSQL의 데이터모델에는 여러가지가 존재합니다. Redis와 같은 Key-Value 데이터가 존재하고, 열 별로 연속적으로 저장하는 Column-Based 데이터, JSON이나 XML과 같은 Collection데이터 모델의 Document-Based, 데이터 간의 관계를 구성하는 Graph데이터가 있습니다.
CAP 이론이란?
Consistency: 어디에 요청해도 일관된 결과를 받아야 한다.
Availability: 언제나 응답 가능한 상태여야한다.
Partition Tolerance: 분산 시스템에서 시스템의 일부가 고장나더라도 다른 시스템에 영향을 주면 안된다.
하지만 CAP의 3가지를 모두 만족하기엔 어렵기 때문에 보통은 일관성을 포기한다고 합니다. Consistency 대신 Eventual Consistency라고, 미래의 언젠가 일관성을 이룰 수 있도록 하는 것에 목표를 가지고 있다.
Inno DB란? 장점은?
mySQL과 mariaDB를 위한 데이터베이스 엔진입니다. ACID원칙을 준수하는 트랜잭션 기능을 제공합니다. inno DB는 메모리영역, CPU영역, 디스크 스토리지 영역으로 나눌 수 있습니다. 메모리 영역에는 insert버퍼, undo영역, 로그 버퍼가 있고, 디스크 스토리지 영역에는 시스템 테이블 스페이스와 유저 테이블 스페이스가 존재합니다.
inno DB은 대용량 데이터 처리와 다수 사용자 접속에 강하고, 트랜잭션을 통한 무결성을 보장한다는 점입니다. 하지만 노드 간 체크로 인한 deadlock이 발생할 수 있고, 많은 자원을 소모하며 복구를 지원하지만 과정이 복잡합니다.
데이터베이스 회복 기법의 종류는?
WAL 방식이란?
데이터베이스 수정 이전에 로그를 먼저 기록하는 방식을 의미합니다. 보통 redo와 undo정보를 모두 기록합니다. ACID성질 중 원자성과 지속성을 WAL을 통해 만족할 수 있습니다. WAL 방식은 OS의 fsync명령어를 통해 디스크에 저장을 요청하기 때문에 바로바로 저장되므로 강제종료에 대한 걱정이 없습니다.
데이터베이스의 인덱스란?
데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조입니다. 특정 칼럼(들)에 대해 인덱스를 생성하면 인덱스를 정렬하여 저장하고, 해당 인덱스를 가지는 데이터를 오름차순으로 정렬하여 가지고 있기 때문에 Group by, Order by와 같은 연산에 유리합니다. 하지만 데이터의 삽입/수정/삭제가 발생하였을 때 다시 정렬을 해야하고, 전체 데이터의 10% 이상을 검색한다면 오히려 full scan이 더 빠릅니다. 또한 인덱스는 별도의 저장공간을 차지하기 때문에 인덱스 생성을 할 때에는 충분히 고려를 해야 합니다.
B*트리와 B+트리란?
B*트리는 Oracle DB에서 채택한 인덱싱 알고리즘 기법입니다. B-트리의 성능 개선을 이룬 트리로, 각각의 노드에는 데이터가 존재합니다. 이에 비해 B+트리는 오직 리프노드에만 데이터를 저장하고 있습니다. 그리고 리프노드는 각각이 연결리스트로 연결되어 있어, 임의탐색 뿐만이 아니라 순차탐색도 가능합니다.
클러스터링 인덱스란?
클러스터링 인덱스란 전체 테이블의 물리적인 데이터가 인덱스로 정렬되는 것을 의미합니다. 디스크로부터 메모리로 데이터를 가져오는 단위인 페이지에 맞게 데이터가 저장되어 있는데, 각 페이지 내의 데이터는 정렬된 상태를 유지하고 페이지의 주소만을 가지는 루트 페이지를 통해 참조할 수 있습니다. 물리적인 정렬이기 때문에 클러스터링 인덱스는 테이블 당 하나만 가질 수 있고, 보통은 기본키 인덱스를 기준으로 정렬하게 됩니다. 클러스터링 인덱스는 B+트리와 같은 구조로 이루어져 있습니다. 리프노드에 실제 데이터를 가지는 페이지가 위치하고 있고, 상위 노드에 해당하는 페이지에는 리프를 가리키는 포인터가 저장되어 있습니다.