– 데이터베이스 정규화란?
데이터베이스 정규화는 중복성을 최소화하도록 설계되었으며 비정규화는 읽기 시간을 최적화하도록 설계되었습니다.
데이터베이스를 설계할 때 불필요한 데이터를 제거하고 중복성을 최소화하여 데이터 유연성을 극대화하고 데이터 중복을 최소화하여 데이터를 구조화하는 과정을 정규화라고 합니다.
정규화는 저장 공간을 최소화하고 데이터 구조의 안정성과 무결성을 유지할 수 있지만 관계 분해로 인한 관계 간 연산(JOIN 연산) 횟수로 인해 쿼리 응답 시간이 느려지는 단점이 있습니다.
이를 극복하기 위해 부분 비정규화를 사용한다.
– 비정규화는 어떻습니까?
정규화된 엔터티, 속성 및 관계를 중복 통합 및 분리하여 시스템 성능을 향상시키고 개발 및 운영을 단순화하는 데이터 모델링 기법 중 하나입니다.
일반적으로 쿼리 처리 성능이 중요하다고 판단되면 부분 비정규화를 고려합니다. 비정규화는 디스크 I/O가 많을 때, 테이블 간 경로가 너무 멀 때, 컬럼 연산 및 쿼리 시 성능 저하가 우려될 때 고려된다.
비정규화는 한 번에 특정 범위의 쿼리, 성능 문제 또는 테이블의 과도한 조인 사용으로 인해 데이터 검색이 기술적으로 어려울 때 고려됩니다.
단점은 비정규화를 과도하게 적용하면 데이터의 무결성이 손상될 수 있고 쿼리 입력, 변경 및 삭제에 대한 응답 시간이 지연될 수 있다는 점입니다.
데이터베이스 정규화 및 비정규화는 데이터베이스 설계에서 중요한 개념입니다.
정규화는 데이터베이스의 테이블을 분할하고 중복을 제거하여 데이터의 일관성과 무결성을 유지하는 프로세스입니다. 일반적으로 정규화는 제1정규형, 제2정규형, 제3정규형과 같이 여러 단계로 나뉜다. 정규화를 통해 데이터 중복성을 줄이고 디스크 공간을 절약하며 데이터 일관성과 무결성을 보장합니다.
반면 비정규화는 정규화된 테이블을 하나의 테이블로 결합하는 과정을 말합니다. 이렇게 하면 데이터를 검색할 때 조인 작업을 줄일 수 있으므로 성능을 향상시킬 수 있습니다. 그러나 이러한 데이터의 비정규화는 데이터 중복 및 일관성 문제로 이어질 수 있으므로 주의해서 사용해야 합니다.
요약하면 정규화는 데이터 일관성과 무결성을 유지하고 중복을 제거하여 디스크 공간을 절약하는 반면 비정규화는 중복을 허용하여 성능을 향상시키는 프로세스입니다.
– 데이터베이스 색인이란 무엇입니까?
데이터베이스의 인덱스는 테이블에서 자주 검색되는 열 값을 미리 정렬하여 검색 속도를 높이는 데이터 구조입니다. 간단히 말해서 색인을 사용하면 데이터베이스에서 원하는 데이터를 빠르게 찾을 수 있습니다.
인덱스는 검색 속도를 높이지만 인덱스 자체가 데이터베이스 용량을 사용하기 때문에 인덱스를 사용할 열을 선택하는 것이 중요합니다. 또한 인덱스는 데이터를 삽입, 수정, 삭제하기 위한 추가 작업이 필요하므로 너무 많은 인덱스를 사용하면 성능이 저하될 수 있습니다. 따라서 적절한 인덱스 설계가 필요하다.
데이터베이스를 사용할 때 실행 결과의 속도는 데이터(행)의 양에 따라 다릅니다.
특히, 데이터 양이 증가하면 실행 속도가 느려지고 JOIN이나 Subquery를 사용할 때 곱셈 연산이 발생하여 데이터 양이 늘어나므로 인덱스를 적시 적소에 사용하는 것이 중요하다.
특정 열에 인덱스가 생성되면 해당 열의 데이터가 정렬되어 데이터의 물리적 주소와 함께 별도의 메모리 위치에 저장됩니다. 인덱스를 사용할 때 인덱스에 저장된 데이터의 물리적 주소로 먼저 이동하여 데이터를 가져오면 검색 속도를 높일 수 있습니다.
인덱스의 가장 큰 특징은 데이터가 정렬된다는 점입니다. 일반적으로 테이블이 생성되고 그 안에 데이터가 쌓이면 테이블의 행은 내부적으로 순서 없이 뒤섞인 순서로 저장된다. 이 경우 WHERE 절에 특정 조건을 만족하는 데이터가 있더라도 전체 레코드를 처음부터 끝까지 읽어 해당 레코드가 검색 조건에 맞는지 확인하기 위해 전체 스캔을 수행해야 합니다. 반면 인덱스 테이블을 스캔할 때 조건(WHERE)을 만족하는 데이터를 정렬하여 저장하기 때문에 빠르게 찾을 수 있다.
단점은 인덱스를 유지 관리하는 데 추가 작업이 필요하다는 것입니다. 항상 최신 데이터를 정렬된 상태로 유지하여 필요한 값을 빠르게 검색할 수 있도록 하며, 데이터가 추가되거나 값이 변경되면 인덱스 테이블의 값을 재정렬해야 합니다. 인덱스 테이블과 원본 테이블의 두 위치에서 데이터를 변경해야 합니다. 따라서 검색 위주의 테이블보다는 INSERT, UPDATE, DELETE DML이 빈번하게 발생하는 테이블에 인덱스를 생성하는 것이 좋다.
또한 인덱스를 관리하려면 데이터베이스의 약 10%에 해당하는 추가 디스크 공간이 필요합니다.
인덱스가 누적되면 전체 데이터베이스 성능이 저하될 수 있으므로 인덱스를 최소한으로 사용하고 전체 SQL 문을 효율적으로 구성해야 합니다.
– 거래요?
데이터베이스 트랜잭션은 데이터베이스에서 수행되는 작업 단위입니다. 트랜잭션은 하나 이상의 데이터베이스 작업으로 구성되며 모든 작업이 성공하거나 작업이 실패할 경우 롤백하여 이전 상태로 돌아가도록 보장합니다. 이를 통해 데이터베이스의 일관성을 유지할 수 있습니다.
트랜잭션에는 원자성, 일관성, 격리 및 내구성의 네 가지 속성이 있습니다. 즉, 트랜잭션은 완료된 작업으로 간주되며 모든 작업이 성공적으로 실행되거나 실패 시 이전 상태로 롤백됩니다. 이를 통해 데이터베이스의 일관성을 유지할 수 있습니다. 또한 여러 트랜잭션이 동시에 수행되는 경우에도 각 트랜잭션이 독립적으로 실행되도록 보장합니다. 마지막으로 모든 성공적인 트랜잭션이 데이터베이스에 영구적으로 커밋되도록 보장합니다.
– 연결하다?
데이터베이스의 조인은 둘 이상의 테이블에서 데이터를 결합하여 단일 결과 집합으로 반환하는 방법입니다. 조인은 테이블 간에 관련 데이터를 검색하는 데 사용됩니다.
고객 정보와 주문 정보가 있는 두 개의 테이블이 있다고 가정합니다. 고객 정보 테이블은 고객의 이름, 주소, 전화번호 등을 포함하고, 주문 정보 테이블은 주문 번호, 주문 날짜, 주문 수량 등을 포함한다. 이 두 테이블을 연결하여 고객이 어떤 주문을 했는지 확인할 수 있습니다.
조인의 종류에는 내부 조인, 외부 조인, 자연 조인이 있으며 각각의 조인은 상황에 따라 다르게 사용된다.
– 참조 무결성
데이터베이스의 참조 무결성은 데이터베이스에서 관계형 데이터베이스를 생성할 때 관계에 있는 두 테이블 간의 무결성을 보장하는 것입니다. 이를 위해 외래 키 제약 조건이 사용됩니다. 외래 키 제약 조건은 부모 테이블의 기본 키와 자식 테이블의 외래 키 간의 관계를 정의하는 제약 조건입니다.
외래 키 제약 조건은 상위 테이블의 기본 키를 참조하여 하위 테이블의 데이터를 제어합니다. 즉, 상위 테이블의 기본 키 값이 변경되거나 삭제되면 해당 값을 참조하는 하위 테이블의 데이터도 변경되거나 삭제되어야 합니다. 이러한 방식으로 데이터베이스의 데이터 일관성 및 무결성을 유지할 수 있습니다.
