데이터 베이스 기본 지식 늘리기

YJS·2023년 10월 5일
0

🤓오늘의 공부 주제: N:M 관계, RDB, No-SQL,Transaction, DeadLock, Index🤓

Q. 관계형 데이터베이스의 N:M 관계란 무엇인가?

A. 관계형 데이터베이스에서 양쪽 entity 모두가 서로에게 1:N 관계를 갖는 구조


Q. RDB - NoSQL의 차이점은 무엇인가?

A.관계형 데이터베이스는 사전에 엄격하게 정의된 DB schema를 요구하는 테이블 기반 데이터 구조. 반면 비관계형데이터베이스는 테이블 형식이 아닌 비정형 데이터를 저장할 수 있도록 지원.

RDB는 엄격한 스키마로 인해 데이터 중복이 없어 데이터 업데이트가 많을 때 유리
No-SQL의 경우 데이터 중복으로 인해 데이터 업데이트 시 모든 컬렉션에서 수정이 필요하기 때문에 업데이트가 적고 조회가 많을 때 유리

Q. NoSQL이란?

Key-value stores는 NoSQL system이라고도 불리며 SQL을 보통 지원하지 않고 transaction을 지원하지 않는 등 SQL을 사용하는 기존의 RDB와의 차이점이 있다. 관계형으로 처리도리 필요가 없는 경우, 빅데이터를 처리하기 위한 해결책 중 하나.

DB와 비교하여 NoSQL의 특징은 ACID, Transaction을 지원하지 않는다는 것. RDB는 ACID와 Transaction을 보장하기 위해 수평적 확장이 쉽지가 않음. 또한 RDB 같은 경우에는 multiple server로 수평적 확장을 하게 되면 join을 하기 위해 굉장히 복잡한 과정이 필요함.

💡요약💡

NoSQL은 정확한 데이터 구조가 정해지지 않은 경우, 데이터 update가 자주 이루어지지 않고 조회가 많은 경우, 또 scale out이 가능하므로 데이터 양이 매우 많은 경우에 사용하면 좋음. 반면 RDB는 데이터 구조가 명확하여 변경될 여지가 없는 경우, 또 데이터 중복이 없으므로 데이터 update가 잦은 시스템에서 사용하면 좋음.

Q. Transaction이란 무엇인가?

A.데이터베이스 내에서 수행되는 작업의 최소 단위로, 데이터베이스의 무결성을 유지하며 DB의 상태를 변화시키는 기능을 수행. transaction은 하나 이상의 query를 포함해야 하고, ACID라고 칭해지는 원자성, 일관성, 고립성, 지속성의 4가지 규칙을 만족해야함.

💡여기서 잠깐! ACID란?💡

트랜잭션은 데이터베이스의 무결성을 유지하기 위해 원자성, 일관성, 고립성, 지속성의 성질을 갖는다.
  • Atomicity(원자성) : transaction에 포함된 작업은 전부 수행되거나 아니면 전부 수행되지 말아야 합니다.(all or nothing)
  • Consistency(일관성): transaction이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 송금 전후 모두 잔액의 data type은 integer이여야 한다는 것이 일관성의 한 예가 될 수 있습니다.
  • Isolation(고립성): 여러 Transaction은 동시에 수행됩니다. 이때 각 transaction은 다른 transaction의 연산 작업이 끼어들지 못하도록 보장하여 독립적으로 작업을 수행합니다. 따라서 동시에 수행되는 transaction이 동일한 data를 가지고 충돌하지 않도록 제어해줘야 합니다. 이를 동시성제어(concurrency control) 라고합니다.
  • Durability(지속성): 성공적으로 수행된 transaction은 데이터베이스에 영원히 반영되어야 함을 의미합니다. transaction이 완료되어 저장이 된 데이터베이스는 저장 후에 생기는 정전, 장애, 오류 등에 영향을 받지 않아야 합니다.

💡여기서 잠깐! 동시성제어란?💡

여러 개의 transaction이 한 개의 데이터를 동시에 갱신(update)할 때 어느 한 transaction의 갱신이 무효화 될 수 있는데 이를 갱신손실이라고함. 따라서, transaction이 동시에 수행될 때 일관성을 해치지 않도록 transaction의 데이터 접근을 제어하는 DBMS의 기능을 동시성제어라고함.

Q. DeadLock이란 무엇인가?

A.데이터베이스 deadlock(교착 상태)이란, 여러 transaction들이 각각 자신의 데이터에 대하여 lock을 획득한 상태에서 상대방 데이터에 대하여 접근하고자 대기를 할 때 교차 대기를 하게 되면서 서로 영원히 기다리는 상태

🤓해결방법🤓
1. 예방기법: 각 transaction이 실행되기 전에 필요한 데이터를 모두 Locking 해주는 것입니다. 하지만 locking해줘야 하는 데이터가 많다면 사실상 모든 데이터를 전부 locking한 것과 동일하여 transaction의 병행성을 보장하지 못할 수 있습니다.
2. 회피기법: 자원을 할당할 때 timestamp를 사용하여 deadlock가 일어나지 않도록 회피하는 방법입니다.
3. 탐지/회복 기법: Transaction이 실행되기 전에는 아무런 검사를 하지 않고, deadlock이 발생하면 이를 감지하고 회복시키는 방법입니다.

Q. Index가 왜 필요한가?

A.Index는 데이터베이스에서 table의 검색 성능을 높여주는 대표적인 방법중 하나. 일반적인 RDBMS(관계형데이터베이스)에서는 B+Tree구조로 된 index를 사용하여 검색속도를 향상시킴.

index는 책마다 마지막 페이지에 있는 색인(index)과 같은 역할을 하는 자료구조. Full Table Scan을 하지 않고 index를 활용하여 데이터를 바로 찾을 수 있는 것을 Index Scan이라함.

SELECT ~WHERE query를 통해 특정 조건을 만족하는 데이터를 찾을 때, full table scan할 필요 없이 정렬되어 있는 index에서 훨씬 빠른 속도로 검색을 할 수 있게 된다.

💡여기서 잠깐! Index란?💡

특정 column을 search-key 값으로 설정하여 index를 생성하면, 해당 search-key 값을 기준으로 정렬하여 (search-key, pointer)를 별도 파일에 저장하는데 이를 index라고 한다.

Table에 데이터를 지속적으로 저장하게 되면 내부적으로 순서 없이 쌓이게 되는데 이 경우에 특정 조건을 만족하는 데이터를 찾고자 WHERE절을 사용한다면 Table의 row(record)를 처음부터 끝까지 모두 접근하여 검색조건과 일치하는지 비교하는 과정이 필요하게 됨. 이를 Full Table Scan이라고 함. 하지만 특정 coloumn에 대한 Index를 생성해 놓은 경우 해당 속성에 대하여 search-key가 정렬되어 저장되어 있기 때문에 조건 검색(SELECT ~ WHERE) 속도가 굉장히 빠르다.

  • 클러스터형 인덱스: 특정 칼럼을 기본키로 지정하면 자동으로 클러스터형 인덱스가 생성되고 해당 칼럼 기준으로 정렬됨. 테이블 자체가 하나의 인덱스.

  • 보조 인덱스: create index와 같이 인덱스 생성하기를 하거나 고유키로 지정하면 보조 인덱스가 생성됨.

    💡여기서 잠깐! Index는 어느 칼럼에 사용?💡

index는 where 절에서 자주 조회되고, 수정 빈도가 낮으며, 카디널리티는 높고, 선택도가 낮은 column을 선택해서 설정하는 것이 가장 좋다.

insert / update / delete 작업 시, 데이터에 변화가 생기기 때문에 index에서는 매번 정렬을 다시 해야해서 부하가 발생하기 때문에 수정 빈도가 낮은 column을 index로 설정하면 좋다. 또한 데이터 중복이 높은 칼럼은 효과가 별로 없다. 데이터 양이 많을 수록 인덱스로 인한 성능향상이 크다. 조인 조건으로 자주 사용되는 칼럼의 경우도 효과적. 다만 한 테이블에 인덱스가 너무 많으면 데이터 수정시 소유 시간이 길어지므로 테이블당 4-5개 권장.

Q. 데이터를 검색을 할 때 hash table의 시간복잡도는 O(1)이고 b+tree는 O(logn)으로 더 느린데 왜 index는 hash table이 아니라 b+tree로 구현하는가?

A.Hash table을 사용하면 하나의 데이터를 탐색하는 시간은 O(1)로 b+tree보 다 빠르지만, 값이 정렬되어 있지 않기 때문에 부등호를 사용하는 query에 대해서는 매우 비효율적이게 되어 데이터를 정렬해서 저장하는 b+tree를 이용

출처 : 인프런 - 기출로 대비하는 개발자 전공면접 [CS 완전정복]

profile
우당탕탕 개발 일기

0개의 댓글