1. 정규화란 무엇이고 대표적인 장점과 단점은 무엇이 있을까요?
데이터베이스 설계에서 정규화(normalization)는 중복을 최소화하고 데이터를 구조화하는 프로세스입니다. 이는 데이터의 무결성과 효율성을 향상시키기 위한 핵심적인 단계입니다. 정규화는 테이블의 속성들이 더 이상 분해될 수 없을 때까지 속성들을 분해하며 진행됩니다.
정규화의 주요 장점은 다음과 같습니다:
- 데이터 중복 최소화: 정규화는 데이터의 중복성을 제거함으로써 저장 공간을 절약합니다. 이는 데이터베이스에서 불필요한 데이터를 줄이는데 도움이 됩니다.
- 데이터 무결성 향상: 정규화를 통해 데이터의 일관성과 정확성을 보장할 수 있습니다. 데이터가 여러 곳에 중복으로 저장되지 않기 때문에 데이터 수정(갱신) 시 일관성을 유지하기 쉽습니다.
- 데이터베이스 구조 확장 용이: 정규화된 데이터베이스 구조는 확장하기 쉽습니다. 새로운 데이터 타입이나 구조를 추가할 때 기존 데이터 구조에 영향을 미치지 않습니다.
그러나 정규화도 일부 단점을 가지고 있습니다:
- 복잡한 쿼리: 정규화는 데이터를 여러 테이블로 분산시키므로 데이터를 검색하려면 여러 테이블을 조인해야 할 수 있습니다. 이는 쿼리의 복잡성을 증가시키고 성능에 영향을 미칠 수 있습니다.
- 성능 저하: 높은 수준의 정규화는 데이터베이스의 성능을 저하시킬 수 있습니다. 데이터를 검색하거나 수정하기 위해 여러 테이블을 조인해야 하기 때문에 쿼리 실행 시간이 길어질 수 있습니다.
정규화의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것입니다. 중복된 데이터를 허용하지 않음으로서 무결성을 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있습니다. 종속성 삭제로 데이터의 일관성과 무결성을 보장합니다. 릴레이션에서 발생 가능한 이상현상을 제거합니다. 정규화의 단점은 빈번한 join 연산 증가로 인한 시스템 실행과다 및 비효율적 검색 시간 이 있으며 과다한 검색 조건문 발생으로 부자연스러운 데이터베이스 semantics 초래가 우려됩니다.
데이터베이스 semantics는 데이터베이스 내의 데이터가 어떻게 구성되고, 어떤 의미를 가지고 있는지에 대한 학문을 말합니다.
"Semantics"는 일반적으로 "의미"라는 뜻을 가지고 있습니다. 따라서 데이터베이스 semantics는 데이터베이스에 저장된 정보와 그 정보들 간의 관계에 대한 의미를 설명합니다.
예를 들어, 학생과 성적 데이터베이스를 생각해 봅시다. 여기서 학생(Student)이라는 엔티티와 성적(Grade)이라는 엔티티가 있을 수 있습니다. 이 두 엔티티 간의 관계를 정의하는 것이 semantics입니다. 예를 들어, "학생은 여러 개의 성적을 가질 수 있다"는 관계를 정의할 수 있습니다.
이러한 semantics는 데이터베이스의 구조를 설계하고, 쿼리를 작성하거나 데이터를 분석할 때 중요합니다. 적절한 semantics를 이해하고 구현하면, 데이터베이스에서 원하는 정보를 정확하게 추출할 수 있습니다.
정규화란 데이터 중복으로 인한 이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하는 과정입니다. 이상현상이란 테이블을 설계할 때 잘못 설계하여 데이터를 삽입, 삭제, 수정할 때 논리적으로 생기는 오류를 말합니다. 정규화의 장점은 최소의 데이터로 최적의 데이터베이스 구축 및 데이터 중복성 제거를 할 수 있고 종속성의 제거로 데이터의 일관성과 무결성을 보장하며 앞서 말한 이상현상을 해결할 수 있으며 중복의 최소화로 저장공간의 효율성을 늘릴 수 있습니다. 하지만 join의 연산 증가로 인해 시스템 실행 과다 및 비효율적인 검색시간이 소요될 수 있다는 단점이 있습니다. 단점이 더 큰 경우라면 비정규화로 개선이 가능합니다.
2. 데이터베이스 정규화란 무엇인가요? 그리고 왜 필요한가요?
데이터베이스 정규화(database normalization)는 데이터베이스 설계에서 중요한 과정으로, 중복된 데이터를 제거하고 데이터 구조를 효과적으로 구성하기 위한 작업입니다. 이는 데이터의 무결성과 관리를 향상시키는 데 중요합니다.
정규화의 목표는 다음과 같습니다:
- 중복된 데이터를 최소화하거나 없애서 데이터 저장을 효율적으로 합니다.
- 데이터베이스에서 데이터를 추가, 삭제, 수정할 때 발생할 수 있는 이상 현상(anomalies)을 최소화합니다.
- 이상 현상(Anomalies)은 데이터베이스에서 데이터를 추가, 수정, 삭제하는 과정에서 발생할 수 있는 비일관성이나 오류를 말합니다. 정규화를 통해 이런 이상 현상을 최소화할 수 있습니다. 주로 세 가지 유형의 이상 현상이 있습니다.
- 삽입 이상(Insertion Anomaly): 새로운 데이터를 삽입할 때 의도하지 않은 부작용이 발생하는 현상입니다. 예를 들어, 두 개의 속성이 동시에 저장되어야 하는데, 하나의 속성만으로는 삽입할 수 없는 경우가 있습니다.
- 갱신 이상(Update Anomaly): 데이터를 갱신할 때 일부 데이터만 갱신되어 데이터 간의 불일치가 발생하는 현상입니다. 예를 들어, 중복 데이터를 갱신할 때 일부 데이터만 갱신되어 같은 데이터가 서로 다른 값을 가지게 되는 경우가 있습니다.
- 삭제 이상(Deletion Anomaly): 데이터를 삭제할 때 의도하지 않은 정보까지 삭제되는 현상입니다. 예를 들어, 특정 정보를 삭제하려고 했는데, 그 정보와 연관된 다른 정보까지 함께 삭제되는 경우가 있습니다.
- 데이터 무결성을 유지하고 보장합니다.
정규화가 필요한 이유는 다음과 같습니다:
- 데이터 중복성 감소: 정규화를 통해 중복 데이터를 제거하면 저장 공간을 절약하고 데이터의 일관성을 유지할 수 있습니다. 중복 데이터가 없으면 데이터를 갱신하거나 삭제할 때 발생할 수 있는 이상 현상을 방지할 수 있습니다.
- 데이터 무결성 향상: 정규화된 테이블 구조에서는 각 테이블이 하나의 주제에 대해 정보를 저장하므로, 데이터의 무결성을 보장하기 쉽습니다. 또한, 제약 조건을 사용하여 데이터의 정확성을 보장할 수 있습니다.
- 쿼리 성능 향상: 적절하게 정규화된 테이블에서는 데이터 조회와 관리가 더 쉬워집니다. 특히, 데이터의 일부만 필요한 경우, 작은 테이블에서 데이터를 조회하는 것이 큰 테이블에서 조회하는 것보다 더 빠를 수 있습니다.
- 확장성 및 유지보수 용이: 데이터베이스 구조를 확장하거나 수정하는 것이 더 쉬워집니다. 각 테이블과 엔티티 간의 관계가 명확하기 때문에, 새로운 데이터 형식이나 카테고리를 추가하거나 수정하는 것이 더 간단합니다.
이러한 이유로, 정규화는 데이터베이스 설계 및 개발에서 중요한 역할을 합니다.
3. 정규화의 다양한 단계(1NF, 2NF, 3NF, BCNF 등)를 설명해줄 수 있나요?
데이터베이스 정규화는 주로 5단계로 이루어지며, 각 단계는 '정규형'이라는 개념을 통해 정의됩니다. 각 정규형은 특정한 조건을 충족함으로써 데이터베이스의 이상 현상을 줄이거나 제거하는 데 도움을 줍니다.
- 제1정규형(1NF): 모든 테이블의 컬럼 값이 원자적(분할 불가능)이어야 하며, 각각의 컬럼에는 하나의 값만 들어가야 합니다. 즉, 레코드 내에 동일한 데이터가 중복되어 나타나지 않아야 합니다.
- 제2정규형(2NF): 제1정규형을 충족하고, 부분적 함수 종속성을 제거해야 합니다. 이는 모든 비키 컬럼이 테이블의 기본키에 완전히 종속되어야 함을 의미합니다. 예를 들어, 복합 키를 갖는 테이블에서 하나의 컬럼이 복합 키의 일부에만 종속적인 경우, 이를 분리하여 별도의 테이블을 만들어야 합니다.
- 제3정규형(3NF): 제2정규형을 충족하고, 이행적 함수 종속성을 제거해야 합니다. 이는 비키 컬럼 간에 종속성이 없어야 함을 의미합니다. 예를 들어, A 컬럼이 B 컬럼에 종속되고, B 컬럼이 C 컬럼에 종속되는 경우, A와 C 사이에 이행적 종속성이 발생합니다. 이 경우 A와 C의 관계를 분리하여 별도의 테이블로 만들어야 합니다.
- 보이스-코드 정규형(BCNF): 제3정규형을 충족하고, 기본키가 아닌 모든 컬럼이 기본키에 대해 완전 함수 종속적이어야 합니다. 이 정규형은 보다 엄격한 제3정규형으로 볼 수 있으며, 기본키가 아닌 컬럼 간에는 종속성이 전혀 없어야 합니다.
- 제4정규형(4NF): 이 정규형은 다중 값 종속성(MVD, Multi-Valued Dependency)을 제거하는 것이 목표입니다. 즉, 하나의 컬럼이 다른 컬럼의 집합에 종속되는 경우, 이러한 관계를 분리하여 별도의 테이블로 만들어야 합니다. 이렇게 하면 한 테이블 내에서 동일한 정보의 반복을 피할 수 있습니다.
- 제5정규형(5NF 또는 PJNF, Project-Join Normal Form): 이 정규형은 조인 종속성을 만족하면서 프로젝션을 통한 분해를 할 수 있는 형태를 의미합니다. 제5정규형을 만족하면 각각의 속성이 자신이 속한 릴레이션의 기본키에만 의존하게 됩니다. 제5정규형은 실질적으로는 거의 사용되지 않습니다.
각 정규형을 만족하면 이상 현상을 최소화하고 데이터베이스의 구조를 효율적으로 만들 수 있지만, 정규화가 과도하게 이루어지면 데이터베이스의 성능이 저하되거나 데이터의 중복을 완전히 제거하지 못하는 문제가 발생할 수 있습니다. 따라서 실제 시스템에서는 필요에 따라 적절한 수준의 정규화를 선택하게 됩니다.
4. 정규화의 장점과 단점은 무엇인가요?
장점:
- 데이터 중복 최소화: 정규화를 통해 데이터의 중복을 최소화하므로, 데이터베이스에서의 공간 효율성이 증가합니다.
- 데이터 무결성 유지: 각 테이블에서 속성 간의 종속성이 줄어들며, 이는 데이터 무결성을 유지하는데 도움이 됩니다.
- 삽입/삭제/수정 이상 최소화: 데이터의 중복이 없으므로, 데이터를 삽입, 삭제, 수정할 때 발생할 수 있는 문제를 최소화합니다.
단점:
- 조회 성능 저하: 데이터베이스의 테이블이 너무 많이 분할되면, 조인 연산이 많아져 데이터를 조회하는 성능이 저하될 수 있습니다.
- 설계의 어려움: 정규화를 완전히 이해하고 올바르게 적용하려면 많은 노력이 필요합니다.
- 시스템의 복잡성 증가: 테이블 수가 많아지면 관리해야 할 테이블과 관계도 많아지므로, 데이터베이스의 복잡성이 증가합니다.
따라서, 정규화는 적절한 수준에서 적용하는 것이 중요합니다. 성능과 데이터 무결성 간의 균형을 유지하려면 데이터베이스의 특성과 요구사항을 고려하여 적절한 정규형을 선택해야 합니다.
5. 정규화를 사용하여 데이터 무결성을 어떻게 유지할 수 있나요?
- 도메인 제약조건(Domain Constraint): 각 필드의 값이 허용된 값의 집합, 즉 도메인 내의 값이어야 합니다. 예를 들어, '나이' 필드에는 음수가 입력될 수 없으며, '이메일' 필드는 특정 형식을 충족해야 합니다.
- 개체 무결성(Entity Integrity): 기본키가 중복되거나 null이 될 수 없습니다. 이를 통해 각 행이 고유하게 식별될 수 있습니다.
- 참조 무결성(Referential Integrity): 외래키가 참조하는 기본키 값이 항상 존재해야 합니다. 이를 통해 테이블 간의 관계를 올바르게 유지할 수 있습니다.
- 삽입, 삭제, 수정 이상 방지: 정규화를 통해 데이터 중복을 최소화하므로, 삽입/삭제/수정 시 일관성을 유지하는 데 도움이 됩니다. 예를 들어, 한 테이블에서 일부 데이터만 수정하면 다른 테이블에 불일치가 발생할 수 있는데, 정규화를 통해 이런 문제를 방지할 수 있습니다.
6. 데이터베이스 설계 시 정규화와 비정규화를 언제 사용해야 하나요?
정규화 사용 시점:
- 데이터 무결성이 중요할 때: 데이터의 일관성과 무결성이 중요한 경우에는 정규화를 진행하는 것이 좋습니다. 정규화를 통해 데이터 중복을 제거하고, 데이터 이상 현상을 방지할 수 있습니다.
- 응용 프로그램의 복잡성이 증가할 때: 응용 프로그램이 복잡해질수록 데이터의 일관성을 유지하기 어려워집니다. 이럴 때 정규화를 통해 데이터 구조를 간소화하면 데이터 관리가 용이해집니다.
비정규화 사용 시점:
- 읽기 성능이 중요할 때: 비정규화는 데이터의 중복을 허용하므로, 데이터 조회 시에 조인 연산을 줄일 수 있습니다. 따라서, 읽기 성능이 중요한 응용 프로그램(예: 분석, 보고서 등)에서는 비정규화를 고려해볼 수 있습니다.
- 데이터 변경이 빈번하지 않을 때: 비정규화된 테이블에서는 데이터 변경 시에 여러 테이블을 동시에 수정해야 할 수 있습니다. 따라서, 데이터 변경이 빈번하지 않은 경우에는 비정규화를 고려할 수 있습니다.
정규화와 비정규화는 서로 균형을 이루어야 합니다. 너무 많이 정규화하면 성능이 저하될 수 있고, 너무 많이 비정규화하면 데이터 무결성 문제가 발생할 수 있습니다. 따라서, 데이터베이스의 목적과 응용 프로그램의 요구를 고려하여 적절한 수준에서 정규화와 비정규화를 적용해야 합니다.
7. 데이터 중복성을 피하기 위한 정규화 과정에 대해 설명해주시겠어요?
데이터베이스 정규화는 데이터 중복을 제거하고 데이터베이스 구조를 효과적으로 조직화하는 프로세스입니다. 일반적으로 다음과 같은 단계로 이루어집니다:
- 제1정규형 (1NF): 각 컬럼의 값이 원자적(더 이상 분해할 수 없는)이어야 합니다. 즉, 각 컬럼은 하나의 값만 가질 수 있습니다.
- 제2정규형 (2NF): 테이블이 1NF를 만족하고, 기본키가 아닌 모든 컬럼이 기본키에 완전 함수 종속되어야 합니다. 즉, 부분 함수 종속을 제거해야 합니다.
- 제3정규형 (3NF): 테이블이 2NF를 만족하고, 기본키가 아닌 모든 컬럼이 기본키에 대해 이행적 함수 종속을 가지지 않아야 합니다. 즉, 이행적 함수 종속을 제거해야 합니다.
- 보이스-코드 정규형 (BCNF): 테이블이 3NF를 만족하고, 모든 결정자가 후보 키의 부분집합이어야 합니다.
- 제4정규형 (4NF): 테이블이 BCNF를 만족하고, 다중값 종속성을 제거해야 합니다.
- 제5정규형 (5NF 또는 PJ/NF): 테이블이 4NF를 만족하고, 조인 종속성을 제거해야 합니다.
각 단계는 이전 단계를 만족하면서 추가적인 제약 조건을 만족시킵니다. 이러한 정규화 과정을 통해 데이터 중복을 최소화하고 데이터 무결성을 높일 수 있습니다. 그러나 너무 많이 정규화하면 성능에 문제가 생길 수 있으므로, 정규화 수준은 상황에 따라 적절히 조절해야 합니다.
8. 정규화로 인한 성능 이슈에 대해 어떻게 생각하나요? 이를 해결하기 위한 방법은 무엇이 있나요?
정규화는 데이터 중복성을 제거하고 데이터 무결성을 향상시키지만, 이로 인해 성능에 대한 영향이 발생할 수 있습니다.
예를 들어, 정규화를 완전히 수행한 데이터베이스에서는 정보를 검색하려면 여러 테이블에서 조인 연산을 수행해야 할 수 있습니다. 많은 양의 데이터에 대해 이러한 조인 연산을 수행하면 성능 저하가 발생할 수 있습니다. 또한, 데이터가 여러 테이블에 분산되어 있으면 데이터를 수정하거나 추가하는 데 시간이 더 오래 걸릴 수 있습니다.
이러한 성능 이슈를 해결하기 위한 몇 가지 방법이 있습니다:
- 비정규화: 성능 향상을 위해 일부 데이터 중복성을 허용하는 방법입니다. 특정 쿼리의 성능을 향상시키기 위해 비정규화를 선택할 수 있지만, 데이터 중복성으로 인한 데이터 무결성 문제에 대한 조심스러운 고려가 필요합니다.
- 인덱싱: 데이터베이스에서 검색 성능을 향상시키는 데 도움이 됩니다. 적절한 인덱싱 전략을 사용하면 데이터 검색 속도를 크게 향상시킬 수 있습니다.
- 데이터 분할: 큰 테이블을 여러 개의 작은 테이블로 나누는 것입니다. 이를 통해 쿼리 성능을 개선할 수 있습니다.
- 캐싱: 자주 사용하는 쿼리 결과를 캐시에 저장하여 데이터베이스에 대한 요청을 줄이는 방법입니다.
9. 정규화 이후에도 발생할 수 있는 데이터베이스의 문제점은 무엇인가요?
정규화는 데이터 중복성을 제거하고 데이터 무결성을 향상시키는 데 중요한 역할을 하지만, 이 과정에서도 다음과 같은 문제가 발생할 수 있습니다:
- 조인 연산 증가: 데이터를 정규화하면 데이터가 여러 테이블에 분산되게 되고, 이로 인해 데이터를 검색하거나 통합하는 데 필요한 조인 연산이 증가하게 됩니다. 이는 성능 저하를 초래할 수 있습니다.
- 복잡성 증가: 정규화는 데이터베이스의 전체적인 복잡성을 증가시킬 수 있습니다. 여러 테이블에 데이터가 분산되어 있으면, 데이터베이스의 관리와 유지보수가 복잡해질 수 있습니다.
- 트랜잭션 오버헤드 증가: 데이터가 여러 테이블에 분산되어 있으면, 하나의 비즈니스 연산을 위해 여러 테이블을 동시에 업데이트해야 할 수 있습니다. 이는 트랜잭션 오버헤드를 증가시키고, 락 경합 및 데드락의 가능성을 증가시킬 수 있습니다.
- 데이터 중복 제거 불완전: 3NF나 BCNF와 같은 일반적인 정규화 수준에서는 여전히 데이터 중복성이 남아있을 수 있습니다. 예를 들어, 다중값 종속성이나 조인 종속성과 같은 문제는 보다 고급 정규형(예: 4NF, 5NF)을 사용해야 해결할 수 있습니다.
따라서, 정규화 수준은 성능, 복잡성, 트랜잭션 오버헤드 등과의 트레이드오프를 고려하여 결정해야 합니다. 또한, 필요한 경우 비정규화를 적절히 사용하여 성능을 최적화하는 것도 중요합니다.
10. 비정규화의 경우에는 어떤 상황에서 사용하나요? 그리고 비정규화가 필요한 이유를 설명해주시겠어요?
비정규화는 데이터베이스의 성능을 향상시키기 위해 일부러 데이터 중복을 허용하는 데이터베이스 설계 기법입니다. 정규화를 통해 얻는 중복 제거와 무결성 유지의 장점과 반대되는 측면이지만, 특정 상황에서는 비정규화가 성능 향상에 큰 도움이 될 수 있습니다.
비정규화를 사용하는 상황은 다음과 같습니다:
- 조회성능 향상: 자주 접근하는 테이블의 데이터를 다른 테이블에 복제하여 저장하면, 조인 없이 단일 테이블에서 빠르게 데이터를 조회할 수 있습니다. 이는 특히 복잡한 조회 쿼리의 성능을 향상시키는 데 유용합니다.
- 집계 데이터 저장: 실시간으로 계산하기 어려운 복잡한 통계나 집계 데이터를 미리 계산해서 저장하는 경우입니다. 이는 대용량의 데이터에서 특정 집계 정보를 빠르게 얻어야 하는 비즈니스 요구사항에 응답할 수 있습니다.
비정규화의 필요성은 주로 성능 최적화와 관련이 있습니다. 하지만 비정규화는 데이터 중복을 허용하기 때문에 데이터 무결성을 손상시킬 수 있으며, 이에 따라 데이터 관리 비용이 증가할 수 있습니다. 따라서 비정규화는 필요한 경우에만 주의해서 사용해야 합니다. 주로 읽기 위주의 작업이 많은 데이터베이스나 조회 성능 최적화가 중요한 경우에 적용됩니다.
비정규화는 데이터베이스 설계에서 '일부러' 중복된 데이터를 허용하는 방식입니다. 이렇게 하는 이유는 성능 향상 때문입니다.
예를 들어, 사람들의 성적을 기록하는 데이터베이스가 있다고 가정해봅시다. 이 데이터베이스에는 학생들의 개인 정보와 성적이 기록되어 있습니다. 여기서 학생들의 평균 성적을 계산하려면 매번 모든 성적 데이터를 조회해서 계산해야 합니다. 이렇게 하면 성적을 조회할 때마다 많은 시간이 소요될 수 있습니다.
이런 경우에 비정규화를 사용하면 평균 성적을 계산한 결과를 별도의 테이블에 저장해두고, 성적 정보가 변경될 때마다 이 값을 업데이트 할 수 있습니다. 이렇게 하면 평균 성적을 조회할 때 매번 모든 성적을 계산할 필요 없이 미리 계산해 둔 값을 바로 조회할 수 있으므로 성능이 향상됩니다.
그런데, 비정규화가 성능을 향상시키는 데 도움이 되더라도 주의해서 사용해야 합니다. 왜냐하면 데이터 중복으로 인해 데이터 관리가 복잡해질 수 있고, 중복된 데이터 간에 불일치가 발생할 위험이 있기 때문입니다. 따라서, 비정규화는 성능 향상이 필요하고, 그로 인한 데이터 관리의 복잡성을 감당할 수 있는 경우에만 사용해야 합니다.
'Mockterview' 카테고리의 다른 글
Base64 인코딩(Encoding) (0) | 2023.05.28 |
---|---|
TCP(Transmission Control Protocol), UDP(User Datagram Protocol) (0) | 2023.05.27 |
트랜잭션(Transaction) , @Transactional, 락(Lock) (0) | 2023.05.27 |
사용자 패스워드를 전송하고 보관하는 방법(일반적인 보안 방법) pt.2 (0) | 2023.05.24 |
인덱스(Index), Composite(복합)인덱스 pt.2 (0) | 2023.05.24 |