데이터베이스에 저장된 데이터 값과 그것이 표현하는 현실 세계의 실제값이 일치하는 정확성을 말합니다.
개체 무결성은 릴레이션의 기본키는 null 값이나 중복된 값을 가질 수 없습니다.
참조 무결성은 외래키의 값은 null이거나 참조 테이블의 기본키 값이여야 합니다.
데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)이 있습니다.
데이터 정의어는 테이블의 구조를 삽입, 수정, 삭제할 때 사용되며 CREATE, ALTER, DROP이 있습니다.
데이터 조작어는 데이터를 검색, 삽입, 수정, 삭제할 수 있는 언어이며 SELECT, INSERT, UPDATE, DELETE가 있습니다.
데이터 제어어는 데이터베이스의 보호와 관리를 위해 사용되며 GRANT, REVOKE가 있습니다.
키의 종류에는 슈퍼키
, 후보키
, 기본키
, 대체키
, 외래키
가 있습니다.
슈퍼키는 유일성은 만족하지만 최소성은 만족하지 않는 키입니다.
후보키는 유일성과 최소성 둘다 만족하는 속성 또는 속성들의 집합입니다. 유일성, 최소성 특징은 새로운 투플이 삽입되거나 변경되어도 유지되어야 하며 기존 릴레이션의 인스턴스만 보고 유일성과 최소성을 판단하면 안됩니다.
기본키는 후보키 중 기본적으로 사용할 키로 선택된 키를 말하며, 널 값을 가질 수 없고 중복이 허용되지 않습니다.
대체키는 후보키 중 기본키를 제외한 나머지 키를 말합니다.
외래키는 어떤 릴레이션에 소속된 속성 또는 속성 집합이 다른 릴레이션의 기본키가 되는 키입니다. 외래키는 null 값이나 중복된 값을 가질 수 있습니다.
인덱스는 테이블을 처음부터 끝까지 검색하는 방법인 FTS(Full Table Scan)과 다르게, 인덱스를 검색해 해당 자료의 테이블을 액세스 하는 방법입니다. 또한, 데이터의 저장 성능을 희생해 데이터의 검색 속도를 높이는 기능
입니다.
예를 들어서 DB를 책에 비유하면 데이터는 책의 내용이고 데이터가 저장된 레코드의 주소는 인덱스 목록에 있는 페이지 번호일 것입니다.
인덱스는 항상 정렬된 상태를 유지하므로 원하는 값을 검색하는데에 빠르지만, 새로운 값을 추가하거나, 삭제, 수정할 경우에는 쿼리문 실행 속도가 느려집니다.
B+ 트리와 해시 테이블이 있습니다.
B+ 트리
는 자식 노드가 2개 이상인 비 트리를 개선시킨 자료구조로서, 비 트리 리프노드들을 연결 리스트로 연결해 순차 검색을 용이하게 합니다. 해시 테이블보다 나쁜 의 시간복잡도를 갖지만 일반적으로 사용되는 자료구조 입니다.
해시 테이블
은 컬럼 값으로 생성된 해시를 기반으로 인덱스를 구현합니다. 시간복잡도는 로서 검색이 매우 빠릅니다.
부등호와 같은 연속적 데이터를 위한 순차 검색이 불가능해서 사용에 적합하지 않습니다.
트리거는 특정 테이블에 대한 이벤트에 반응해 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램입니다.
사용자가 직접 호출하지 않고 데이터베이스에서 자동적으로 호출한다는 것이 큰 특징입니다.
하나의 릴레이션에 하나의 의미만 존재하도록 릴레이션을 분해하는 과정이며 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법입니다.
제 1 정규형은 테이블의 컬럼이 원자 값만을 갖도록 분해합니다.
제 2 정규형은 제 1 정규형을 만족하고, 기본키가 아닌 속성이 기본키에 완전 함수 종속이도록 분해합니다. (부분 함수 종속성을 없앤다)
완전 함수적 종속은 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미합니다.
제 3 정규형은 제 2 정규형을 만족하고, 이행적 함수 종속을 없애도록 분해합니다.
이행적 함수 종속은 A→B, B→C가 성립할 때 A→C가 성립되는 것을 의미합니다.
BCNF 정규형은 제 3정규형을 만족하고, 함수 종속성 X→Y가 성립할 때 모든 결정자 X가 후보키가 되도록 분해합니다.
장점
데이터베이스 변경시 이상현상이 발생하는 문제점을 해결할 수 있습니다.
데이터베이스 구조 확장시 정규화된 데이터베이스는 그 구조를 변경하지 않아도 되거나 일부만 변경해도 됩니다.
단점
릴레이션의 분해로 인해 릴레이션 간의 JOIN 연산이 많아져 질의에 대한 응답 시간이 느려질 수 있습니다.
정규화를 거치면 릴레이션 간의 조인 연산이 많아져 성능이 저하될 수 있습니다. 따라서 역정규화를 하는 이유는 성능 문제가 있는(특히 읽기 작업이 많은 경우) 데이터베이스의 전반적인 성능을 향상시키기 위함입니다.
이상 현상은 테이블을 잘못 설계하여 데이터를 삽입, 삭제, 수정할 때 생기는 논리적 오류를 말합니다.
삽입 이상은 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제를 말합니다.
갱신 이상은 중복 투플 중 일부만 변경해 데이터가 불일치하게 되는 모순의 문제를 말합니다.
삭제 이상은 투플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제를 말합니다.
트랜잭션은 작업의 완전성을 보장해줍니다.
작업들을 모두 처리하거나 처리하지 못한 경우 이전 상태로 복구해 작업의 일부만 적용되는 현상이 발생하지 않도록 방지하는 역할을 합니다.
하나의 트랜잭션은 Commit(작업완료)되거나 Rollback(취소)될 수 있습니다.
📒 트랜잭션의 특징으로는 ACID가 있습니다.
원자성은 작업이 모두 반영되던지 아니면 전혀 반영되지 않아야 합니다.
일관성은 실행이 완료되면 언제나 일관성 있는 상태를 유지해야 합니다.
독립성은 둘 이상 트랜잭션이 동시에 실행될 경우 서로의 연산에 끼어들 수 없습니다.
영속성은 완료된 결과는 영구적으로 반영되어야 합니다.
락은 트랜잭션 처리의 순차성을 보장하기 위한 방법입니다.
공유락(Shared Lock)
은 트랜잭션이 읽기를 할 때 사용하는 락이며 데이터를 읽기만 하므로 같은 공유락 끼리는 동시 접근이 가능합니다.
베타락(Exclusive Lock)
은 데이터를 변경할 때 사용하는 락입니다. 트랜잭션이 완료될 때까지 유지되며, 베타락이 끝나기 전까지 어떠한 접근도 허용하지 않습니다.
갱신 분실
, 모순성
, 연쇄 복귀
의 문제점이 발생할 수 있습니다.
갱신 분실은 하나의 트랜잭션이 수행한 데이터 변경 연산의 결과를 다른 트랜잭션이 덮어씌워 변경 연산이 무효화 되는 문제를 말합니다.
모순성은 하나의 트랜잭션이 여러 개의 데이터 변경 연산을 실행할 때, 일관성 없는 상태의 데이터베이스에서 데이터를 가져와 연산을 실행하여 모순된 결과가 발생하는 것을 말합니다.
연쇄 복귀는 두 트랜잭션이 하나의 레코드를 접근할 때, 하나의 트랜잭션이 Rollback하면 다른 하나의 트랜잭션 마저 Rollback이 되는 문제가 발생합니다.
각 문제가 발생하지 않기 위해 로킹 제어 기법
을 사용합니다.
하나의 트랜잭션이 데이터를 사용할 때 데이터베이스 일부를 lock하고, 완료되면 unlock하여 다른 트랜잭션이 사용할 수 있도록 합니다. 로킹의 단위가 크면 관리는 쉬우나 병행성이 낮고 너무 작으면 관리하긴 어렵지만 병행성이 높아집니다.
내부 조인
은 서로 연관된 내용만 검색하는 조인 방법입니다. A와 B에 대해 수행하는 것은 A와 B의 교집합을 말합니다.
외부 조인
은 한 쪽에는 데이터가 있고 한 쪽에는 데이터가 없을 경우, 데이터가 있는 쪽의 내용을 전부 출력하는 방법입니다. A와 B의 합집합을 말합니다. 종류로는 왼쪽 외부 조인, 오른쪽 외부 조인, 완전 외부 조인이 있습니다.
관계형 데이터베이스는 2차원 테이블로 관계를 관리하는 데이터베이스입니다. 고정된 스키마에 맞춰 데이터를 관리하므로 데이터의 정합성을 보장하는 대신, 시스템이 커질 수록 쿼리가 복잡해져 성능이 저하되고 scale-out(수평 확장)이 어렵습니다.
RDBMS는 데이터 구조가 명확하고 변경될 일이 거의 없고 스키마가 중요할 경우 사용하는 것이 좋습니다. 또한 중복된 데이터가 없어 변경이 용이하므로
관계를 맺고 있는 데이터가 자주 변경이 이루어지는 시스템에 적합합니다.
NoSQL은 고정된 스키마가 없이 Key-value 형태로 자유롭게 데이터를 관리할 수 있습니다. 분산처리에 특화되어 수평적 확장이 쉽고 빠른 쓰기가 가능합니다. 하지만, 트랜잭션을 지원하지 않으며 중복된 데이터가 추가가 가능해 별도의 관리가 필요합니다.
NoSQL은 정해진 데이터 구조가 없고 데이터가 변경/확장될 수 있을 때 사용하는 것이 좋습니다. 데이터 중복이 발생할 수 있으므로 중복된 데이터가 변경된다면
모든 컬렉션에서 수정해야하므로 Update가 많이 이루어지지 않는 시스템에서 사용하는 것이 좋으며 Scale-out이 가능하다는 점을 활용해 막대한 데이터를 저장해 데이터베이스를 Scale-out해야 되는 시스템에 적합합니다.