CS/데이터베이스

(CS) 데이터베이스 - 질문

흰색텀블러 2025. 3. 12. 23:43

질문 1: 데이터베이스 정규화(Normalization)란 무엇이며, 그 목적은 무엇인가요?

  • 답변: 데이터베이스 정규화는 데이터의 중복을 줄이고 무결성을 향상시키기 위해 관계형 데이터베이스를 정규화된 형태로 재디자인하는 과정입니다. 이를 통해 데이터 삽입, 수정, 삭제 시 발생할 수 있는 이상 현상을 방지하고, 데이터베이스 구조 확장 시 재디자인을 최소화할 수 있습니다. ​

꼬리질문 1-1: 정규화의 단계에는 어떤 것들이 있으며, 각 단계의 특징은 무엇인가요?​

  • 답변: 정규화는 일반적으로 제1 정규형(1NF)부터 제3 정규형(3NF), 그리고 보이스-코드 정규형(BCNF)까지 진행됩니다. 1NF는 모든 컬럼이 원자값을 갖도록 하여 중복과 반복을 없애는 것이며, 2NF는 부분 함수적 종속성을 제거하여 모든 속성이 주식별자에 완전 종속되도록 합니다. 3NF는 이행적 종속성을 제거하여 주식별자를 제외한 나머지 속성들 간의 종속이 존재하지 않도록 합니다. BCNF는 결정자가 후보키에 속하지 않는 경우를 제거하여 모든 결정자가 후보키가 되도록 합니다. 

꼬리질문 1-2: 정규화를 과도하게 진행했을 때 발생할 수 있는 단점은 무엇인가요?

  • 답변: 과도한 정규화는 테이블을 지나치게 분할하여 조인 연산이 증가하게 되고, 이는 데이터 조회 시 성능 저하를 초래할 수 있습니다. 또한, 분할된 테이블을 다시 합치는 과정에서 복잡성이 증가하여 관리가 어려워질 수 있습니다. ​

꼬리질문 1-3: 이러한 단점을 보완하기 위한 방법으로는 어떤 것이 있나요?

  • 답변: 과도한 정규화로 인한 성능 저하를 보완하기 위해 반정규화를 적용할 수 있습니다. 이는 정규화된 테이블을 성능 향상 및 개발과 운영의 단순화를 위해 의도적으로 정규화 원칙을 위배하여 통합하거나 분할하는 과정입니다.

 

 

질문 2: 트랜잭션(Transaction)이란 무엇이며, 그 특성은 무엇인가요?

  • 답변: 트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위를 구성하는 일련의 연산들을 의미합니다. 트랜잭션은 ACID 특성을 가져야 하는데, 이는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 의미합니다.​

꼬리질문 2-1: 트랜잭션의 격리성(Isolation)이란 무엇이며, 왜 중요한가요?

  • 답변: 트랜잭션의 격리성은 동시에 여러 트랜잭션이 수행되더라도 각 트랜잭션이 독립적으로 실행되어야 함을 의미합니다. 이는 데이터의 일관성을 유지하고, 트랜잭션 간의 간섭으로 인한 오류를 방지하기 위해 중요합니다.​

꼬리질문 2-2: 격리 수준(Isolation Level)에는 어떤 것들이 있으며, 각 수준에서 발생할 수 있는 현상은 무엇인가요?

  • 답변: 격리 수준에는 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE이 있습니다. 낮은 수준에서는 더 높은 동시성을 제공하지만, 더 많은 이상 현상인 Dirty Read, Non-repeatable Read, Phantom Read이 발생할 수 있습니다. 반대로, 높은 수준에서는 이상 현상이 줄어들지만, 동시성이 낮아질 수 있습니다.​

꼬리질문 2-3: 격리 수준을 설정할 때 고려해야 할 요소는 무엇인가요?

  • 답변: 격리 수준을 설정할 때는 시스템의 성능과 데이터 일관성 요구 사항을 고려해야 합니다. 높은 격리 수준은 데이터 일관성을 보장하지만, 성능 저하를 초래할 수 있으므로, 애플리케이션의 특성과 요구 사항에 맞게 적절한 수준을 선택해야 합니다.

 

 

질문 3: 데이터베이스에서 '키(Key)'란 무엇이며, 종류에는 어떤 것들이 있습니까?

  • 답변: 데이터베이스에서 '키(Key)'는 테이블 내의 각 레코드를 고유하게 식별하는 데 사용되는 속성 또는 속성의 집합을 말합니다. 주요 키의 종류로는 기본키, 후보키, 대체키, 슈퍼키, 외래키가 있습니다.

꼬리질문 3-1: 후보키와 슈퍼키의 차이점은 무엇인가요?

  • 답변: 후보키는 유일성과 최소성을 모두 만족하는 키로, 기본키로 선택될 수 있는 후보들입니다. 반면, 슈퍼키는 유일성만을 만족하며 최소성을 만족하지 않을 수 있습니다. 즉, 후보키는 최소한의 속성 집합으로 레코드를 식별하지만, 슈퍼키는 불필요한 속성을 포함할 수 있습니다.​

꼬리질문 3-2: 외래키를 사용할 때 주의해야 할 점은 무엇인가요?

  • 답변: 외래키를 사용할 때는 참조 무결성을 유지해야 합니다. 즉, 외래키가 참조하는 값은 반드시 해당되는 다른 테이블의 기본키 값과 일치해야 하며, 삭제나 업데이트 시에도 이러한 관계를 고려하여 데이터의 일관성을 유지해야 합니다.​

꼬리질문 3-3: 외래키 제약 조건을 사용하면 어떤 이점이 있나요?

  • 답변: 외래키 제약 조건을 사용하면 데이터베이스의 무결성을 유지할 수 있으며, 테이블 간의 관계를 명확하게 정의하여 데이터의 일관성을 보장합니다. 또한, 데이터 삭제나 수정 시 참조 무결성을 자동으로 관리하여 오류를 방지할 수 있습니다.

 

질문 4: 데이터베이스에서 인덱스(Index)란 무엇이며, 어떤 최적화 방법이 있습니까?

  • 답변: 인덱스는 데이터베이스에서 데이터를 빠르게 검색하기 위해 사용하는 자료 구조입니다. 인덱스를 활용하면 검색 속도를 향상시킬 수 있지만, 잘못된 인덱스 사용은 오히려 성능을 저하시킬 수 있습니다. 인덱스 최적화 방법에는 두번 탐색 강요, EXPLAIN 함수를 활용한 테스팅, 복합 인덱스 생성시 우선순위 고려하기 등이 있습니다.​

꼬리질문 4-1: 인덱스를 과도하게 사용하면 어떤 문제가 발생할 수 있나요?

  • 답변: 인덱스를 과도하게 사용하면 데이터 삽입, 수정, 삭제 시 인덱스도 함께 수정되어야 하므로 쓰기 성능이 저하될 수 있습니다. 또한, 인덱스는 추가적인 저장 공간을 필요로 하므로 디스크 공간을 많이 차지할 수 있습니다.​

꼬리질문 4-2: 인덱스의 종류에는 어떤 것들이 있으며, 각각의 특징은 무엇인가요?

  • 답변: 인덱스의 종류에는 B-Tree 인덱스, 해시 인덱스, 비트맵 인덱스 등이 있습니다. B-Tree 인덱스는 범위 검색에 효율적이며, 해시 인덱스는 정확한 값 검색에 빠릅니다. 비트맵 인덱스는 값의 종류가 적은 컬럼에 적합하며, 대용량 데이터에서 효율적입니다.​

꼬리질문 4-3: 복합 인덱스를 생성할 때 컬럼의 순서가 중요한 이유는 무엇인가요?

  • 답변: 복합 인덱스에서 컬럼의 순서는 쿼리의 조건절에 사용되는 컬럼의 순서와 일치해야 인덱스가 효과적으로 활용될 수 있습니다. 잘못된 순서로 인덱스를 생성하면 인덱스가 사용되지 않거나 성능이 저하될 수 있습니다.

 

 

질문 5: 데이터베이스에서 조인(Join)이란 무엇이며, 어떤 종류가 있습니까?

  • 답변: JOIN은 두 개 이상의 테이블을 결합하여 데이터를 조회하는 방법입니다. SQL에서 여러 테이블을 연결하여 원하는 데이터를 얻을 때 사용됩니다. 주요 조인의 종류는 INNER JOIN, LEFT OUTER JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN, SELF JOIN등이 있습니다.

꼬리질문 5-1: INNER JOIN과 OUTER JOIN의 차이점은 무엇인가요?

  • 답변: INNER JOIN은 두 테이블 간에서 일치하는 데이터만 가져오지만, OUTER JOIN은 한쪽 또는 양쪽 테이블의 모든 행을 포함할 수 있습니다.

꼬리질문 5-2: LEFT JOIN을 사용할 때 주의해야 할 점은 무엇인가요?

  • 답변: LEFT JOIN을 사용할 때 NULL 값이 발생할 수 있다는 점을 고려해야 합니다. 따라서 NULL 값을 처리하는 방법을 정해야 하며, COALESCE() 함수를 사용하여 기본 값을 설정할 수도 있습니다. 또한, 불필요한 조인을 수행하면 성능이 저하될 수 있으므로 적절한 인덱스를 사용하여 최적화하는 것이 중요합니다.

꼬리질문 5-3: CROSS JOIN은 어떤 경우에 사용될 수 있나요?

  • 답변: CROSS JOIN은 두 테이블의 모든 행을 조합하는 방식으로, 특정한 경우 유용할 수 있습니다. 예를 들어, 모든 제품과 모든 고객의 조합을 생성해야 하는 경우에 사용할 수 있습니다. 하지만, 테이블의 행 개수가 많을 경우 조인 결과가 기하급수적으로 증가할 수 있으므로 주의해야 합니다.