스키마에 맞춰 데이터를 관리하기 때문에 정합성을 유지할 수 있다. 하지만 시스템이 커질수록 쿼리가 복잡해지고 성능이 저하되며 수평 확장이 어렵다.
예) PostgreSQL, MySQL
Q. NoSQL
A. 스키마 없이 키와 값 형태로 자유롭게 값을 저장하는 데이터베이스이다. 스키마가 없어 유연하고 새로운 필드 저장과 저장된 데이터 조정이 가능하다. 따라서 데이터 조회가 빠르고 수직 및 수평 확장이 가능하다. 하지만 중복 데이터 저장이 가능하여 이에 대한 관리가 필요하다.
정확한 데이터 구조를 알 수 없거나 변경, 확장될 수 있는 경우 사용한다.
예) MongoDB
[차이점] RDBMS는 행과 열 형태로 데이터를 저장하는(스키마가 정해진) 데이터베이스이다. 반면 NoSQL은 정해진 스키마가 없이 키와 값 형태로 데이터를 저장한다. RDBMS는 데이터 구조가 명확하고 변경될 일이 없을 때 사용하는 것이 좋다. 또한 중복 데이터가 없어 변경이 용이하다. NoSQL은 정해진 데이터 구조가 없거나 수직, 수평 확장이 자주 일어날 때 사용한다.
++ NoSQL도 정규화가 가능할까?
Q. SQL(Structured Query Language)
A. 데이터베이스(RDBMS)에 사용하는 쿼리 언어이다.
DDL 데이터베이스 스키마와 설명을 처리하는 언어이다. 테이블 생성, 변경, 삭제 등의 작업을 한다. 예) CREATE, ALTER, DROP, RENAME, …
DML 데이터 검색, 삽입, 변경, 삭제 등을 수행하여 조작하는 언어이다. 예) SELECT, UPDATE, INSERT, DELETE, MERGE, …
DCL 데이터에 접근할 수 있는 권한을 관리하는 언어이다. 예) GRANT, REVOKE
TCL 트랜잭션을 다루는 언어이다. 예) COMMIT, ROLLBACK, SAVEPOINT, …
Q. 이상현상
A. 데이터 중복으로 인해 발생되는 데이터 불일치 현상이다.
갱신 이상 반복된 데이터 중 일부를 갱신할 때 데이터 불일치가 발생한다.
삽입 이상 원치 않는 정보가 저장되거나 정보가 부족하여 삽입이 발생하지 않는다.
삭제 이상 정보 삭제 시 원치 않는 정보가 함께 삭제된다.
Q. 정규화와 비정규화
A.
정규화 관계형 데이터베이스에서 중복을 최소화하는 방법이다. 데이터 구조의 안정성과 무결성을 유지하고 이상현상을 최소화한다.
제 1정규형 모든 속성 값이 원자값을 갖도록 한다.
제 2정규형 제 1정규형을 만족하고 기본키가 아닌 속성이 기본키에 완전 함수 종속이도록 분해한다. * 완전함수종속이란? 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미한다.
제 3정규 제 2정규형을 만족하고 기본키가 아닌 속성이 기본키에 직접종속 하도록 분해한다. * 직접 종속(비이행적 종속)이란? A->B->C가 성립할 때 (A, B), (B, C)로 분해한다,
BCNF 정규형 제 3정규형을 만족하고 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키가 되도록 분해한다.
비정규화(반정규화) 의도적으로 정규화 규칙을 위배하여 데이터 모델을 중복, 통합시켜 시스템 성능을 상승시킨다. 하나의 테이블에 데이터를 중복시켜 배치하는 최적화 방법이다. 쿼리가 단순하고 조회 속도는 빠르나 갱신, 삽입시 비용이 크고 저장공간을 더 많이 사용한다. 데이터 일관성이 무시될 수 있다.
Q. 데이터베이스 뷰
A. 사용자에게 접근이 허용된 자료만을 제한적으로 보여주는 기본 테이블로부터 유도된 가상의 테이블이다. 뷰는 저장장치 내에 물리적으로 존재하지 않지만 임시적인 작업을 위해 있는 것처럼 간주도외 활용된다.
특징으로는
기본테이블로부터 유도되었기 때문에 유도한 테이블과 같은 형태의 구조를 사용한다.
가상테이블이기 때문에 물리적으로 구현되어있지 않다.
논리적 독립성을 제공한다.
필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고 명령문이 간단해진다.
뷰를 통해서만 데이터에 접근하면 데이터를 안전하게 보호할 수 있다.
기본 테이블의 기본키를 포함한 속성 집합으로 뷰를 구성해야지만 삽입, 삭제, 갱신 연산이 가능하다.
뷰는 다른 뷰 정의에 기초가 될 수 있다.
뷰가 정의된 기본 테이블이나 뷰를 삭제하면 그 테이블이나 뷰를 기초로 정의된 다른 뷰도 삭제된다.
뷰의 장점
논리적 데이터 독립성을 제공한다.
동일 데이터에 대해 동시에 여러 사용자의 상이한 응용이나 요구를 지원해준다.
사용자의 데이터 관리를 간단하게 해준다.
접근 제어를 통한 자동 보안이 제공된다.
단점
독립적인 인덱스를 가질 수 없다.
뷰의 정의를 변경할 수 없다.
뷰로 구성된 내용에 대한 삽입, 삭제, 갱신 연산에 제약이 있다.
Q. 트랜잭션
A. 작업의 안정성을 보장해주는 것으로 작업 도중 문제가 발생하면 해당 작업을 취소한다.
트랜잭션의 특징(ACID)
Atomicity 원자성 트랜잭션 중간에 문제가 발생하면 해당 작업 모두가 취소되어야 한다. 아무런 문제가 발생하지 않았을 경우에만 작업이 완료된다.
Consistency 일관성 트랜잭션 전 후 데이터베이스는 일관된 상태를 유지해야한다.
Isolation 고립성 한 트랜잭션 수행 도중 다른 트랜잭션이 끼어들어서는 안된다.
Durability 지속성 트랜잭션 수행 후 변경된 데이터는 영구히 저장되어야 한다.
Q. 인덱스
A. 책의 목차와 같이 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 <키, 포인터> 자료구조이다. 데이터베이스에서 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성해 빠르게 데이터를 조회할 수 있다.
인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 쿼리 실행 시 인덱스 생성 컬럼을 where 조건에 포함하여 인덱스를 타게 되고 인덱스를 먼저 조회 후 데이터의 물리적 주소로 가서 데이터를 가져오는 식으로 검색 속도를 향상시킬 수 있다.
대부분의 DBMS는 기본키에 대해 자동적으로 기본 인덱스(기본인덱스, 보조인덱스)를 생성한다.
* full-scan 데이터 처음부터 끝까지 조건과 맞는지 비교
인덱스의 장점
인덱스 테이블은 정렬되어있기 때문에 조건에 맞는 데이터를 빠르게 찾을 수 있다(검색 성능 향상).
min, max에 대한 효율적인 처리가 가능하다.
인덱스의 단점
테이블 내 값들을 계속 정렬된 상태를 유지해주어야 한다.
튜플 수정(UPDATE), 삭제(DELETE) 등과 함께 인덱스도 함께 관리해주어야 한다. * 삭제의 경우 인덱스 삭제가 아닌 ‘사용하지 않는 인덱스’로 변경
추가 저장공간이 필요하다.
잘못 관리할 시 인덱스의 증가로 성능이 더 저하된다.
인덱스 생성 전략
= 비교를 많이 하는 컬럼
조건절에 자주 사용되는 컬럼
중복 데이터가 최소한인(분포도가 좋은) 컬럼
order by 절에 자주 사용되는 컬럼
조인 조건으로 자주 사용되는 컬럼
인덱스 사용 시 주의사항
하나 혹은 여러 필드에 적용 가능하다.
기수성(특정 컬럼에 대한 데이터 중복 수치, 컬럼의 유니크한 정도)가 높은 컬럼에 적용하는 것이 좋다.
Q. 인덱스의 자료 구조
A.
해시테이블 컬럼의 값으로 생성된 해시를 기반으로 인덱스를 구현한다. 검색 시간 복잡도가 O(1)로 매우 빠르나 부등호(<,>)와 같은 연속적인 데이터를 위한 순차 검색이 불가능하다.
B+Tree(Balanced Tree) 대부분의 DBMS 특히 오라클에서 중점적으로 사용하는 방법 이진 트리를 개선시킨 자료구조로 노드들을 연결리스트로 연결하여 순차 검색을 용이하게 하였다. 시간복잡도O(logN)
Q. 인덱스 헌팅을 사용하여 쿼리 성능을 향상시키는 방법
A. 인덱스 헌팅은 쿼리 성능과 데이터베이스 속도 향상을 위해 도움이 되는 인덱스 수집을 강화하는 프로세스이다.
Q. 데이터 사전
A. 테이블과 데이터베이스 개체의 내용과 구조를 설명하는 정보 집합으로 데이터 사전에 저장된 정보의 역할은 데이터베이스 요소 간의 관계를 제어, 조작 및 조회하는 것이다.
Q. 데이터 무결성
A. 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미한다.
개체 무결성 모든 테이블은 기본키를 가지며 중복되어선 안된다.
참조 무결성 외래키는 널이거나 참조 릴레이션의 기본키와 동일해야 한다(참조할 수 없는 외래키 값을 가질 수 없다).
도메인 무결성 속성 값이 정의된 도메인에 속한 값이어야 한다.
사용자 정의 무결성(업무 무결성) 사용자가 정의한 제약 조건을 만족해야한다.
Q. 데이터베이스 파티셔닝(단편화)
A. 큰 데이터를 파티션이라는 여러 테이블로 나누는 방법이다.
수평 파티셔닝
수직 파티셔닝
쿼리 성능과 가용성, 관리 용이성이 향상되나 join 비용이 증가한다.
Q. 데이터베이스 샤딩
A. 데이터베이스 트래픽 분산처리 방법이다. 하나의 큰 데이터를 여러 인스턴스에 나눠 저장한다. 수평 파티셔닝과 동일한 개념이다. 다수의 데이터베이스에 데이터를 분산 저장한다.
Q. 데이터베이스 옵티마이저
A. 가장 효율적인 방법으로 SQL을 실행시킬 수 있는 방법을 찾는 DBMS 엔진. 실행 계획을 수립하고 실행한다.
Q. 클러스터링과 리플리케이션
A.
리플리케이션 여러 개의 DB를 권한에 따라 수직적인 구조(Master/Slave)로 구축하는 방식이다. 비동기 방식으로 노드들 간의 데이터를 동기화한다.
장점: 비동기 방식으로 데이터가 동기화되어 지연 시간이 거의 없다.
단점: 노드들 간의 데이터가 동기화되지 않아 일관성있는 데이터를 얻지 못할 수 있다.
클러스터링 여러 개의 DB를 수평적인 구조로 구축하여 FailOver한 시스템을 구축하는 방식이다. 데이터베이스를 여러 서버가 나눠 처리한다. 동기 방식으로 노드들 간의 데이터를 동기화한다.
장점: 1개의 노드가 죽어도 다른 노드가 살아 있어 시스템을 장애없이 운영할 수 있다.
단점: 여러 노드들 간의 데이터를 동기화하는 시간이 필요하므로 리플리케이션에 비해 쓰기 성능이 떨어진다.
댓글 영역