기술 개념

데이터베이스 개념

에어팟맥스 2023. 3. 12. 17:21

- 데이터베이스 정규화란?

데이터베이스의 정규화는 중복을 최소화하도록 설계하는 것이고, 비정규화는 읽는 시간을 최적화 하도록 설계하는 것이다.

 

데이터베이스를 설계할 때 최소한의 데이터 중복, 최대한의 데이터 유연성을 위해 불필요한 데이터를 제거하고 중복을 최소화하여 데이터를 구조화하는 프로세스를 정규화라고 한다.

정규화는 저장공간을 최소화 하고 데이터 구조의 안정성 및 무결성을 유지할 수 있지만, Relation의 분해로 인해 Relation 간의 연산(JOIN 연산)이 많아져서 질의에 대한 응답 시간이 느려질 수 있다는 단점이 있다.

이를 극복하기 위해 부분적으로 비정규화를 사용하기도 한다.

 

- 비정규화는?

정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다.

일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다. 디스크 I/O 량이 많거나, 테이블끼리의 경로가 너무 멀거나, 칼럼을 계산하여 조회할 때 성능의 저하가 우려될 때 반정규화를 고려하게 된다.

항상 일정한 범위만을 조회하거나, 성능 상 이슈가 있거나, 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우 등이 반정규화의 고려 대상이 된다.

단점은 반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있고, 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다.

 

데이터베이스의 정규화와 비정규화는 데이터베이스 설계에서 중요한 개념이다.

정규화는 데이터베이스의 테이블을 나누고 중복을 제거하여 데이터의 일관성과 무결성을 유지하는 과정이다. 일반적으로 정규화는 제1정규형, 제2정규형, 제3정규형 등 다양한 단계로 나뉘어 적용된다. 정규화를 통해 데이터 중복이 줄어들어 데이터 저장 공간을 절약하고, 데이터의 일관성과 무결성을 보장할 수 있다.

반면 비정규화는 정규화된 테이블을 다시 하나의 테이블로 합치는 과정을 말한다. 이렇게 하면 데이터 조회 시에 조인 연산을 줄일 수 있기 때문에 성능 향상을 기대할 수 있다. 하지만 이렇게 데이터를 비정규화할 경우, 데이터 중복과 일관성 문제가 발생할 수 있으므로 신중하게 적용해야 한다.

요약하자면, 정규화는 데이터의 일관성과 무결성을 유지하고 중복을 제거하여 저장 공간을 절약하는 반면, 비정규화는 성능 향상을 위해 중복을 허용하는 과정이다.

 

- Database 인덱스란?

데이터베이스의 인덱스(Index)는 테이블에서 자주 검색되는 컬럼들의 값을 미리 정렬하여 검색 속도를 높이는 자료구조이다. 쉽게 말해, 인덱스는 데이터베이스에서 원하는 데이터를 빠르게 찾을 수 있도록 해주는 것이다.

인덱스를 사용하면 검색 속도가 빨라지지만, 인덱스 자체도 데이터베이스의 용량을 차지하므로 인덱스를 사용할 컬럼을 선택하는 것이 중요하다. 또한, 인덱스를 사용하면 데이터의 삽입, 수정, 삭제 시에도 추가 작업이 필요하므로 인덱스를 너무 많이 사용하면 성능 저하가 발생할 수 있습니다. 따라서, 적절한 인덱스 설계가 필요하다.

 

데이터베이스를 사용할 때 데이터의 양(row)에 따라 실행 결과의 속도가 차이가 나게 된다.

특히 데이터의 양이 증가할수록 실행 속도는 느려지고, JOIN이나 서브 쿼리 사용 시 곱 연산이 일어나 데이터 양이 증가하기 때문에 WHERE 조건에서 필요한 데이터만 추출 후 사용하는 것이 좋다고 알고 있는데, 보다 쿼리의 성능을 높이는 데 중요한 것은 인덱스를 적재적소로 활용하는 것이다.

특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장한다. 만약 인덱스를 타게 되면 먼저 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 데이터를 가져오는 식으로 동작을 하여 검색 속도의 향상을 가져올 수 있다.

 

인덱스의 가장 큰 특징은 데이터들이 정렬이 되어있다는 점이다. 일반적으로 테이블을 만들고 안에 데이터가 쌓이게 되면 테이블의 행은 내부적으로 순서가 없이 뒤죽박죽으로 저장이 된다. 이렇게 되면 WHERE절에 특정 조건에 맞는 데이터들을 찾아낼 때도 레코드의 처음부터 끝까지 다 읽어서 검색 조건과 맞는지 비교하는 풀 스캔을 해야한다. 반면 인덱스 테이블을 스캔할 때는 데이터들이 정렬되어 저장되어 있기 때문에 해당 조건(WHERE)에 맞는 데이터들을 빠르게 찾아낼 수 있다.

 

단점은 인덱스를 관리하기 위해 추가 작업이 필요하다는 것이다. 항상 최신의 데이터를 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있는데, 데이터가 추가되거나 값이 변경되는 경우 인덱스 테이블 내에 있는 값들을 다시 정렬을 해야 한다. 인덱스 테이블, 원본 테이블 이렇게 두 군데의 데이터 수정 작업을 해줘야 한다. 따라서 INSERT, UPDATE, DELETE 의 DML 이 빈번하게 일어나는 테이블보다는 검색을 위주로 하는 테이블에 인덱스를 생성하는 것이 좋다.

 

또, 인덱스를 관리하기 위해서는 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요하다.

 

인덱스가 쌓여가면서 전체적인 데이터베이스의 성능 저하를 초래할 수도 있기 때문에 인덱스는 최소한으로 사용하고 전체적인 sql 문을 효율적으로 짜는 방향으로 나아가야 한다.

 

 

- 트랜잭션?

데이터베이스의 트랜잭션(Transaction)은 데이터베이스에서 수행하는 작업의 단위를 의미한다. 하나의 트랜잭션은 하나 이상의 데이터베이스 작업들로 구성되며, 모든 작업이 성공적으로 수행되거나, 하나라도 실패할 경우 롤백(rollback)하여 이전 상태로 되돌리는 것을 보장한다. 이렇게 함으로써 데이터베이스의 일관성을 유지할 수 있다.

트랜잭션은 "원자성(Atomicity)", "일관성(Consistency)", "격리성(Isolation)", "지속성(Durability)"이라는 네 가지 속성을 가지고 있다. 즉, 하나의 트랜잭션은 완전한 하나의 작업으로 간주되며, 모든 작업이 성공적으로 수행되거나, 실패할 경우 이전 상태로 롤백된다. 이렇게 함으로써 데이터베이스의 일관성을 유지할 수 있다. 또한, 여러 개의 트랜잭션이 동시에 수행될 경우에도 각각 독립적으로 실행되는 것을 보장합니다. 마지막으로, 모든 성공적인 트랜잭션은 영구적으로 데이터베이스에 적용되는 것을 보장한다.

 

 

- 조인?

데이터베이스에서의 조인(join)은 두 개 이상의 테이블에서 가져온 데이터를 결합하여 하나의 결과 집합으로 반환하는 방법이다. 조인은 테이블 간에 연관된 데이터를 검색하는 데 사용된다.

예를 들어, 고객 정보와 주문 정보가 있는 두 개의 테이블이 있다고 가정해보자. 고객 정보 테이블에는 고객의 이름, 주소, 전화번호 등이 포함되어 있고, 주문 정보 테이블에는 주문 번호, 주문 일자, 주문 수량 등이 포함되어 있다. 이 두 개의 테이블을 조인하면 고객이 어떤 주문을 했는지를 파악할 수 있다.

조인의 종류에는 내부 조인(inner join), 외부 조인(outer join), 자연 조인(natural join) 등이 있으며, 각각의 조인은 다양한 상황에 따라 사용된다.

 

 

- 참조무결성

데이터베이스의 참조 무결성은 데이터베이스에서 관계형 데이터베이스를 구축할 때, 관계를 맺고 있는 두 테이블 사이에서 무결성을 보장하기 위한 것이다. 이를 위해 외래키(Foreign Key) 제약 조건을 사용한다. 외래키 제약 조건은 부모 테이블의 기본키(Primary Key)와 자식 테이블의 외래키(Foreign Key) 간의 관계를 정의하는 제약 조건이다.

외래키 제약 조건은 부모 테이블의 기본키를 참조하여 자식 테이블의 데이터를 제어한다. 즉, 부모 테이블의 기본키에 있는 값이 변경되거나 삭제되면, 해당 값을 참조하고 있는 자식 테이블의 데이터도 함께 변경이나 삭제되어야 한다. 이렇게 함으로써 데이터베이스의 데이터 일관성과 무결성을 유지할 수 있다.