데이터 베이스
데이터베이스는 관계형 데이터베이스, NoSQL 데이터베이스, 그래프 데이터베이스 등 다양한 유형이 있습니다. 관계형 데이터베이스는 SQL(Structured Query Language)을 사용하여 데이터를 조작하는 데 중점을 둔 전통적인 데이터베이스 유형이며, NoSQL 데이터베이스는 SQL을 사용하지 않는 비관계형 데이터베이스 유형입니다. 그래프 데이터베이스는 데이터를 그래프로 저장하고 관리하는 유형으로, 복잡한 관계형 데이터를 다루는 데 유용합니다. 오늘은 관계형 데이터베이스에 대해 좀 더 깊게 공부하는 과정에서 기록을 남겨두려 합니다.
RDB, 관계형 데이터 베이스란?
관계형 데이터베이스는 서로 관계가 있는 데이터들을 모아둔 데이터 저장공간입니다. 주제가 같은 행( Row ), 열( Column )로 구성된 데이터로 표( Table )를 만들고 관계가 있는 표( Table )들을 연결( Join )하여 정보를 얻을 수도 있습니다.
관계형 데이터 베이스를 이해하기 위해서 알아야 할 키워드 중에서 몇 가지 추려서 정리해보려고 합니다.
- 키, KEY
- 인덱스, INDEX
- 무결성, INTEGRITY
- 조인, JOIN
- 정규화, NORMALIZATION
- 트랜잭션, TRANSACTION
키, Key
성격 | 중복 | NULL | 예시 | |
기본키, Primary Key | 테이블에 존재하는 고유의 ID | X | X | 주민등록번호 |
고유키, Unique Key | 기본키가 아닌 모든 행이 값이 다른 고유의 값 | X | O | |
외래키, Foreign Key | 두 테이블을 연결해주는 다리 역할의 값 | O | O | 회원-주문정보 조인을 위한 회원 ID |
이 외에도 유일성을 만족하는 슈퍼 키, 2개 이상의 속성을 사용한 복합 키, 후보 키, 대체 키 등이 있습니다.
인덱스, Index
인덱스는 데이터베이스에서 검색 속도를 높이기 위한 자료 구조입니다.
대개 B-트리나 B+트리와 같은 자료 구조를 기반으로 하며 인덱스를 생성하면 데이터베이스는 해당 Column의 값을 정렬하고, 검색 시에 이를 바탕으로 특정 값을 빠르게 찾아낼 수 있게 됩니다. 이렇게 하면 대용량 데이터베이스에서도 검색 속도를 빠르게 유지할 수 있으며, 데이터의 무결성을 보장하는데도 도움이 됩니다.
하지만 인덱스는 디스크 공간을 차지하기 때문에 삽입( Insert ), 수정( Update ), 삭제( Delete )를 처리하는 경우에 쿼리문의 속도가 느려집니다. 즉, 인덱스를 사용하게 되면 데이터 저장 성능을 희생하면서 읽기 속도를 높이는 기능이라고 할 수 있습니다.
인덱스를 사용하기 좋은 경우는 Where절에서 자주 사용, 외래키가 자주 사용, Join에 자주 사용되는 Column이 있습니다. 반면 인덱스 사용을 피해야 하는 경우는 Data 중복도가 높고 DML이 자주 일어나는 Column입니다.
DDL - Data Definition Language | 데이터 정의어 | Create, Alert, Drop, Truncate
DML - Data Manipulation Language | 데이터 조작어 | Select, Insert, Update, Delete
DCL - Data Control Language | 데이터 제어어 | Grant, Revoke, Commit, Rollback
무결성, Integrity
무결성은 데이터베이스에 저장된 데이터의 정확성과 일관성을 보장하기 위한 개념입니다. 크게 엔티티 무결성, 도메인 무결성, 참조 무결성 그리고 Null 무결성과 고유 무결성으로 구분됩니다.
1. 엔티티 무결성: 테이블 내에 모든 레코드는 유일한 식별자(primary key)를 가져야 하며, 이를 통해 각 레코드를 고유하게 식별할 수 있습니다.
2. 도메인 무결성: 각 칼럼에 입력되는 데이터의 유형(type), 크기(size), 형식(format) 등에 대한 제약 조건을 정의합니다. 예를 들어, 숫자형 데이터에는 음수가 입력되지 않도록, 문자형 데이터에는 특정한 문자가 입력되지 않도록, 날짜형 데이터에는 유효한 날짜가 입력되도록 하는 등의 제약 조건을 설정할 수 있습니다. 그리고 성별을 입력하는 Column이라면 남자 또는 여자만 입력되도록 제한할 수 있습니다.
3. 참조 무결성: 다른 테이블의 레코드를 참조하는 외래 키(foreign key) 값은 참조되는 테이블에 존재하는 레코드의 값과 일치해야 합니다. 이를 통해 데이터의 일관성과 무결성을 보장할 수 있습니다.
4. Null 무결성: 테이블의 특정 속성 값에는 Null을 가질 수 없다는 규칙입니다. 테이블에서 중요한 정보들은 Null이 올 수 없음을 미리 정의할 수 있습니다.
5. 고유 무결성: 특정 속성에 삽입되는 데이터는 고유한 값을 가져야 한다는 규칙입니다. 예를 들어 회원 Table에서 이름과 나이 등의 속성은 서로 같은 값을 가질 수 있지만 주민등록번호는 서로 다른 값을 가져야 합니다.
조인, Join
조인은 관계가 있는 테이블들을 연결하여 사용자가 원하는 데이터의 형태로 만들어줍니다.
정규화, Normalization
정규화는 관계형 데이터 베이스에서 설계할 때 중복을 최소화하기 위해 데이터를 구조화하는 작업을 말합니다. 일반적으로 아래와 같은 단계를 거쳐 수행됩니다.
정규화 단계
A. 1NF(First Normal Form) 각 열은 원자 값(Atomic value)만 포함합니다. 즉, 다중 값 속성(Multivalued attribute)을 허용하지 않습니다.
B. 2NF(Second Normal Form) 모든 비주요 속성들은 기본 키를 완전 함수 종속(Functionally dependent)합니다. 즉, 기본 키의 일부 속성이 다른 속성의 결정자가 되는 부분 함수 종속(Partial dependency)을 제거합니다.
C. 3NF(Third Normal Form) 모든 비주요 속성들은 기본 키를 이행적으로 함수 종속하지 않습니다. 즉, 비주요 속성이 다른 비주요 속성의 결정자가 되는 이행 함수 종속(Transitive dependency)을 제거합니다.
D. BCNF(Boyce-Codd Normal Form) 모든 결정자(Determinant)가 후보 키(Candidate key)인 테이블입니다. 즉, 모든 함수 종속이 후보 키에 대해 적용됩니다.
E. 4NF(Fourth Normal Form) 다중 값 종속(Multivalued dependency)을 분해하여 중복된 데이터를 제거합니다.
F. 5NF(Fifth Normal Form) 조인 종속(Join dependency)을 사용하여 테이블을 분해합니다.
정규화를 수행하면 데이터의 일관성과 효율성을 개선할 수 있지만, 반대로 복잡성을 증가시킬 수도 있기 때문에 때로는 데이터 중복을 허용하는 비정규화를 선택하는 것이 더 나은 방법일 수 있습니다.
✓ 비정규화란? 일부 데이터의 중복을 허용하여 읽기 속도를 높이는 것을 의미, 무결성에 문제가 될 수 있다.
트랜잭션, Transaction
트랜잭션은 데이터베이스에서 수행하는 작업의 논리적인 단위를 의미합니다. 일반적으로 데이터베이스에서 수행되는 작업은 여러 단계로 이루어지는데, 이러한 작업들은 전체적으로 하나의 논리적인 작업으로 처리되어야 합니다.
이를 위해 트랜잭션은 작업의 성공 여부와 관계없이 전체 작업을 완료하거나, 전체 작업을 취소하는 기능을 제공합니다. 트랜잭션은 대개 4가지 특성을 가지고 있습니다. 이러한 특성들은 트랜잭션이 어떻게 처리되는지를 정의하는 규칙이며, 다음과 같습니다.
트랜잭션의 특징, ACID
1. 원자성(Atomicity): 트랜잭션이 하나의 논리적인 작업 단위로 처리되어야 한다는 것을 의미합니다. 즉, 모든 작업이 전부 완료되거나 전부 취소되어야 합니다.
2. 일관성(Consistency): 트랜잭션이 수행되기 전과 후의 데이터베이스 상태는 항상 일관성이 있어야 합니다. 즉, 트랜잭션이 수행되기 전에 유효한 데이터베이스 규칙은 트랜잭션이 수행된 후에도 유지되어야 합니다.
3. 격리성(Isolation): 동시에 실행되는 여러 개의 트랜잭션이 서로 영향을 미치지 않도록 하여, 각각의 트랜잭션이 마치 자신만 데이터베이스를 사용하고 있는 것처럼 동작하도록 합니다.
4. 지속성(Durability): 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 저장되어야 합니다.
이러한 트랜잭션은 데이터베이스에서 데이터의 무결성을 보장하고, 데이터의 일관성을 유지하기 위해 매우 중요한 개념입니다. 또한, 트랜잭션을 지원하는 데이터베이스는 트랜잭션 롤백(rollback) 기능을 제공하여, 트랜잭션 중간에 문제가 발생했을 경우에도 이전 상태로 복구할 수 있습니다.
Reference
박연호님의 블로그, wooaoe님의 블로그, RAREBEEF님의 블로그, choice님의 블로그, 인파님의 블로그