본문 바로가기

질문과 답변/DB

ERD, Normalization, Index

ERD 는 무엇인가?

더보기

Entity Relational Diagram : DB에서 엔티티간 관계를 그려주는 diagram

 

ERD 에서 Entity 와 Relationship 은 각각 무엇을 의미하는가?

더보기

Entity는 table을 말하고, Relationship이란 Entity간 연결성(table간 연결성)을 PK와 FK로 연결한 것을 의미한다.

 

ERD 의 Relationship 에서 슈퍼키, 후보키, 기본키, 외래키 4가지 키를 모두 설명하라

더보기

슈퍼키 : Entity를 고유하게 식별할 수 있는 모든 속성 조합을 말한다. (유일성)

후보키 : Entity를 고유하게 식별할 수 있는 최소한의 속성 조합을 말한다. (유일성, 최소성)

기본키 : 후보키중 하나를 선택해서 Entity를 고유하게 식별할 수 있는 속성을 정함. Primary Key

(유일성, 최소성을 가진 것 중 하나를 선)

외래키 : Relation 관계 설정 시 참조하는 키 (참조되는 테이블의 기본 키) Foreign Key

 

ERD 표기법 중 하나인 Crow's Foot Notation 을 설명하라

더보기

ERD에서의 관계 형태를 보여줄 때 한 entity의 cardinality의 최소, 최대에 따라 표기하는 방식으로

0일때 동그라미, 1일때 짝대기, 2 이상일 때 crow's foot을 통해서 그려진다.

 

ERD 내 Relationship 표기 시 Identifying 식별 관계와 Non-identifying 비식별 관계의 차이를 설명하라

더보기

자식테이블(참조하는 테이블)이 부모 테이블(참조되는 테이블)에 의존적인 경우, Identifying Relationship이 있다고 한다. ERD 상으로 실선으로 표기된다. (FK에 매핑되는 PK가 null이어서는 안된다.)

 

자식테이블(참조하는 테이블)이 부모 테이블(참조되는 테이블)에 의존적이지 않은 경우, Non-Identifying Relationship이 있다고 한다. ERD 상으로 점선으로 표기된다. (FK에 매핑되는 PK가 null 이어도 상관은 없다.)

 

Normalization 정규화는 무엇이며, 왜 필요한지 3가지의 Anomaly 기반으로 설명하라

더보기

1. 삭제 상황 : 특정 튜플(row)를 삭제 할 때 저장된 다른 정보까지 연쇄적으로 삭제되는 현상

2. 삽입 상황 : 특정 튜플을 삽입할 때 해당 column 뿐 아니라 필요한 다른 것까지 신경써야하는 값들을 추가해야 하는 상황

3. 수정 상황 : 튜플 수정 시 중복된 데이터의 일부분만 수정되어 일어나는 데이터의 불일치 현상

이렇게 될 경우 중복된 데이터가 필요해지고, 유지보수가 어려워지고, 데이터의 무결성이 깨지는 현상이 일어나기 때문에 정규화가 필요하다.

 

제 1 정규형에서 BCNF 까지 4개의 정규형에 대해 설명하라

더보기

제 1 정규형 : 한 컬럼에 한 값이 되도록(원자값을 가지도록), 종속성을 명확히 정의하는 과정이다.

제 2 정규형 : 기본키의 부분집합이 결정자가 되지 않도록, 완전 함수 종속을 만족하도록

테이블을 분해하는 것이다.

제 3 정규형 : 이행적 종속성(두 개의 종속성을 통해 형성된 제 3의 종속성)을 분리한다.

BCNF : 모든 결정자가 후보키가 되도록 테이블을 분해해 종속성을 형성.

 

Denormalization 반정규화는 왜 필요한가?

더보기

비효율적인 정규화로 인해 성능이 떨어지게 되는데, 성능적 측면을 고려해서 반정규화를 사용한다.

중복 컬럼 허용이나 유도컬럼(ex. SUM 조회를 따로 하기보다 SUM 컬럼을 추가해서 사용)을 생성하는 방식이 있다.

 

인덱스는 어떤 개념이며, 데이터베이스에서의 필수 요소인 이유는 왜인가?

더보기

DB에서 검색 쿼리 효율의 향상을 위해서 사용하는 별개의 테이블이다.

B-tree나 B+트리와 같은 자료 구조를 사용해 검색 효율을 높여준다.

 

인덱스의 원리를 B-Tree 와 B+Tree 를 기반으로 설명하라

더보기

인덱스란 column의 값에 따라 data를 나열해 검색 효율을 향상시키기 위해 추가하는 저장소이다.

B-tree를 사용한 방식은 column의 값들을 tree 형식으로 나열하는 방식이다. node를 원하는 대로 개수 조절이 가능하며, 노드에 column의 값이 들어간다.

 

반면 B+tree 는 column의 값들을 tree의 맨 하단에 나열하고, 분기가 되는 node에는 조건문을 사용하는 방식이다.

방식이다.

 

인덱스의 종류 중 클러스터형 인덱스와 비클러스터형 인덱스 각각에 대해 설명하라

더보기

클러스터형 인덱스는 루트페이지에 어떤 PK가 어떤 리프페이지에 있는지 적혀져있고,

리프페이지에 데이터들이 저장된 인덱스의 형태이다.

비클러스터형 인덱스는 루트페이지에 어떤 PK가 리프 페이지에 있는지,

리프페이지는 어떤 PK가 어떤 데이터페이지에 있는지 적혀있고

데이터페이지가 따로 존재하는 식이다.

 

인덱스 생성 시 고려해야할 사항은 무엇인가? 효율적인 인덱스 컬럼을 선택하기 위해 뭘 고려해야하나?

더보기

column의 cardinallity가 높은 것을 사용해 전체를 검색하는 full scan을 지향하도록 선택해야 한다.

효율적인 인덱스 컬럼을 설정하기 위해서는 검색 쿼리에 대해 공통적으로 사용되는 column을 나열하고,

해당 column들의 cardinallity가 높은 것을 사용하는 식으로 선택해야 한다.

 

인덱스는 어떻게 만드는지 절차를 설명하고, 인덱스를 만들때 우리가 주의해야할것들이 어떤것이 있는가?

더보기

검색 속도가 좋지 않은 상황이 형성될 경우,

쿼리의 WHERE 절에 공통적으로 들어가는 조건들,

column들에 대해 cardinality를 비교한다.

그리고 cardinality의 값이 높은 column을 선택해서 index를 형성한다.

 

굳이 단일 컬럼이 아닌, 다수의 컬럼을 통해서 인덱스를 생성 시

컬럼 순서는 cardinality가 높은 것을 우선 인덱싱 하도록 설정해야 함.

다만, 데이터의 상태에 따라 cardinality 가 높은 것을 사용하더라도 검색 효율이 안좋을 수 있다.

(데이터가 10000개인데, cardinality가 1000개고 어느 한 column에 9천개가 들어가있으면 효율 안좋으니.)

 

만들때 주의해야하는 상황 -> cardinality 가 높으면 검색 시간의 효율은 올라가겠지만,

공간적인 효율은 떨어지니 이 부분을 고려해야 하는게 첫 번째

그리고 CUD 상황에서 재인덱스가 일어나는데, 이 경우 재인덱스 시간이 오래 걸림

-> 대용량 실시간 서비스에 치명적이다.

 

SQL 문법은 세부 몇 카테고리로 나뉘는데 그 중 DDL 과 DML 각각은 어떤 작업을 위한 문법들인가?

더보기

DDL : 스키마에 대한 CRUD 작업을 위한 문법이다. 테이블을 정의하고, 변경하고, 삭제하거나 수정하는데 사용한다.

DML : 정의된 테이블에 저장되는 데이터에 대한 CRUD 문법과 JOIN, AGG등을 통한 통계,분석 작업을 위한 문법이다.

 

'질문과 답변 > DB' 카테고리의 다른 글

DB, Concurrency Control, Transaction (2)  (0) 2024.11.17
DB, Concurrency Control , Transaction  (0) 2024.11.14