데이터베이스

sumi Yoo·2022년 12월 18일
0

💡 DBMS
데이터베이스 내 데이터에 접근하도록 도와주는 시스템입니다. DBMS는 크게 질의처리기와 저장 시스템으로 이루어져 있습니다.

💡 데이터베이스의 특징에 대해 설명해주세요.
데이터베이스의 특징에는 4가지가 있습니다.
실시간 접근성: 질의에 대한 응답이 실시간으로 처리되어야 합니다.
지속적인 변화: 데이터의 삽입, 삭제 수정으로 항상 최신 데이터를 유지해야 합니다.
동시 공용: 데이터베이스는 서로 다른 목적을 가진 여러 응용자들을 위한 것이므로 다수의 사용자가 동시에 같은 데이터를 이용할 수 있어야 합니다.
내용에 의한 참조: 데이터베이스를 조회할 때 데이터 레코드의 주소나 위치에 의해서가 아니라 사용자가 요구하는 데이터의 내용으로 찾습니다.

💡 데이터베이스 언어(DDL, DML, DCL)에 대해 설명해주세요.
DDL(Data Definition Language): 데이터 정의어로 데이터베이스의 구조를 정의, 수정, 삭제하는 언어입니다. create, alter, drop
DML(Data Manipulation Language): 데이터 조작어로 데이터베이스 내의 데이터 검색, 수정, 삭제, 삽입을 하기 위한 언어입니다. insert, delete, update, select
DCL(Data Control Language): 데이터의 무결성, 병행 제어, 보안을 위한 언어입니다. rollback, revoke, commit, grant

💡 트리거(Trigger)에 대해 설명해주세요.
특정 테이블에 대한 이벤트에 반응해 insert, delete, update와 같은 DML 문이 수행되었을 때 데이터베이스에서 자동적으로 동작하도록 작성된 프로그램입니다. 사용자가 직접 호출하는 것이 아닌 데이터베이스에서 자동적으로 호출한다는 것이 가장 큰 특징입니다.

💡 트랜잭션
데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업의 단위입니다. 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능으로 작업의 완전성을 보장해줍니다.

💡 트랜잭션 특징(ACID)
원자성(Atomicity): 트랜잭션 내에서 실행된 작업은 모두 성공하거나 실패해야 합니다.
일관성(Consistency): 데이터베이스는 항상 일관성 있는 상태를 유지해야 합니다.
독립성(Isolation): 동시에 실행되는 트랜잭션은 서로에게 영향을 미치지 않아야 합니다.
영속성(Durability): 트랜잭션 완료 시 결과가 영구적으로 반영되어야 합니다.

💡 Index에 대해 설명해주시고, 장/단점에 대해 아는대로 말해주세요.
Index란 테이블을 처음부터 끝까지 검색하는 방법인 FTS과는 달리 인덱스로 검색하여 해당 데이터에 접근하는 방법입니다.
인덱스는 항상 정렬된 상태를 유지하기 때문에, 데이터의 추가, 삭제, 수정하는 경우에 쿼리문 실행 속도가 느려집니다.
즉, 인덱스는 데이터의 저장 성능을 희생하고, 데이터의 검색 속도를 높이는 기능입니다.

💡 그렇다면 DBMS는 Index를 어떻게 관리하고 있나요? (Index 자료구조)
B+Tree 인덱스
자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조로, leaf node에만 데이터를 저장하고 leaf node가 아닌 node에서는 자식 포인터만 저장합니다. 그리고 leaf node끼리는 linked list로 연결되어 순차 검색에 용이합니다.

해시 테이블
컬럼의 값으로 해시 값을 생성해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원합니다. 하지만, 해시 테이블은 등호(=) 연산에 최적화 되어 있기 때문에 부등호 연산이 자주 사용되는 검색에는 해시 테이블의 사용이 적합하지 않습니다.

💡 SQL Injection이 무엇인지 설명해주세요.
악의적인 의도를 갖는 SQL문을 삽입하여 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법입니다.

💡 RDBMS와 NoSQL의 차이에 대해 설명해주세요.
RDBMS: 모든 데이터를 2차원 테이블 형태로 표현합니다.
장점

  • 정해진 스키마에 따라 데이터를 저장해야 하기 때문에 명확한 데이터 구조를 보장합니다.
  • 각 데이터를 중복없이 한 번만 저장할 수 있습니다.
    단점
  • 테이블 간에 관계를 맺고 있어 시스템이 커질 경우 join문이 많은 복잡한 쿼리가 만들어질 수 있습니다.
  • 성능 향상을 위해서는 scale-up만 지원하기 때문에 이로 인해 비용이 기하급수적으로 늘어날 수 있습니다.
  • 스키마로 인해 데이터가 유연하지 못합니다.

NoSQL: RDMBS와 반대로 데이터간의 관계를 맺지 않고, 스키마가 없어 좀 더 자유롭게 데이터를 관리할 수 있으며, 컬렉션이라는 형태로 데이터를 관리합니다.
장점

  • 스키마 없이 key-value 형태로 데이터를 유연하게 관리할 수 있습니다.
  • 스키마가 없어 데이터를 조회하고 삽입하는 속도가 빠릅니다
  • 데이터 분산이 용이하여 성능 향상을 위해 scale-up 뿐만이 아니라 scale-out 또한 가능합니다.
    단점
  • 데이터 중복이 발생할 수 있으며 중복된 데이터가 변경 될 경우 모든 컬렉션에 수정을 반영해야 합니다.
  • 스키마가 존재하지 않기 때문에 명확한 구조를 보장하지 않고, 데이터 구조를 결정하기가 어렵습니다.

💡 그렇다면 RDBMS와 NoSQL은 어느 경우에 적합한가요?
RDBMS는 데이터 구조가 명확하여 변경 될 여지가 없고, 스키마가 중요한 경우 사용하는 것이 좋으며, 중복된 데이터가 없어 데이터 변경에 용이하기 때문에 데이터의 변경이 자주 일어나는 시스템에 적합합니다.

NoSQL은 정확한 구조를 알 수 없는 경우에 사용하는 것이 좋습니다. 또한, update가 자주 이루어지지 않는 시스템에 좋으며, scale-out이 가능하는 장점으로 막대한 데이터를 저장해야 해서 scale-out을 해야하는 시스템에 적합합니다.

💡 DB 락에 대해 설명해주세요.
트랜잭션 처리의 순차성을 보장하기 위한 방법입니다.
공유락: Read Lock이라고도 불리며, 데이터를 읽을 때 사용하는 락입니다. 트랜잭션이 데이터를 읽기만 하면 되기 때문에, 같은 공유락 끼리는 동시에 데이터에 접근할 수 있습니다.
베타락: Write Lock이라고도 하는 베타락은 데이터를 변경할 때 사용하는 락입니다. 트랜잭션이 완료될 때까지 유지되며, 베타락이 끝나기 전까지는 어떠한 접근도 허용하지 않습니다.

💡 옵티마이저(Optimizer)에 대해 아는대로 말해주세요.
SQL을 가장 빠르고 효율적으로 수행할 수 있는 최적의 경로를 생성해주는 DBMS 내부의 핵심 엔진입니다.
컴퓨터의 두뇌가 CPU인 것처럼 DBMS의 두뇌는 옵티마이저라고 할 수 있습니다. 사용자가 SQL을 작성하고 실행하면 즉시 실행되는 것이 아니라 옵티마이저라는 곳에서 이 쿼리문을 어떻게 실행하겠다 라는 실행계획을 세우고, 최고의 효율을 갖는 실행계획을 판변할 후에 그 실행계획에 따라 쿼리를 수행하게 됩니다.

💡 group by의 역할에 대해 설명해주세요.
특정 컬럼을 기준으로 그룹화할 수 있습니다.
그룹화를 하면 조회된 데이터의 통계를 내기 위한 집계 함수를 사용할 수 있습니다.
집계함수에는 sum, count, avg, max, min이 있습니다.
DISTINCT와 같이 중복 데이터를 제거하는 특징이 있습니다.

💡 DELETE, TRUNCATE, DROP의 차이를 설명해주세요.
DELETE는 행 일부 또는 전체 데이터를 삭제합니다.
TRUNCATE는 전체 데이터 뿐만 아니라 행이 저장되어있던 공간과 인덱스도 삭제됩니다.
DROP은 행 데이터 뿐만 아니라 테이블 전체를 삭제합니다.

💡 HAVING과 WHERE의 차이를 설명해주세요.
HAVING은 그룹을 필터링 하는데 사용되고, WHERE은 개별 행을 필터링 하는데 사용됩니다.
집계함수는 having과 함께 사용할 수 있으나 where절은 사용할 수 없습니다. GROUP BY 절보다 WHERE절이 먼저 수행되기 때문입니다.

💡 JOIN에서 ON과 WHERE의 차이를 설명해주세요.
ON이 WHERE보다 먼저 수행되어 ON 조건으로 필터링 된 레코드간에 JOIN이 이루어집니다. 그리고 JOIN된 결과에서 WHERE 조건절로 필터링됩니다.

💡 inner join과 outer join의 차이를 설명해주세요.
inner join은 서로 연관된 데이터만 검색하고 조인하는 방법입니다.
A와 B의 교집합이라고 할 수 있습니다.

outer join은 한쪽에는 데이터가 있고, 다른 한쪽에는 데이터가 없을 경우 데이터가 있는 쪽의 내용을 전부 출력하는 조인 방법입니다. outer join에는 left, right, full 방식이 있습니다.

LEFT OUTER JOIN
조인문의 왼쪽에 있는 테이블의 모든 결과를 가져온 후 오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없을 경우 NULL을 표시합니다.
RIGHT OUTER JOIN
조인문의 오른쪽에 있는 테이블의 모든 결과를 가져온 후 왼쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없을 경우 NULL을 표시합니다.
FULL OUTER JOIN
양쪽 모두 조건이 일치하지 않는 데이터들까지 모두 결합하여 출력합니다. 이것 역시 매칭되는 데이터가 없을 경우 NULL을 표시합니다.

CROSS JOIN
Cartesian Product 라고도 하며, 두 테이블의 데이터를 기준으로 가능한 모든 조합의 데이터가 조회됩니다.

💡 이상 현상의 종류에 대해 설명해주세요.
이상 현상은 테이블을 설계할 때 잘못 설계하여 데이터의 삽입, 삭제, 수정 시 생기는 오류를 의미합니다.

삽입 이상은 불필요한 정보를 함께 저장하지 않고서는 정보를 저장하는 것이 불가능한 경우입니다.
갱신 이상은 중복된 데이터 중 일부만 수정되어 데이터의 모순이 발생하는 경우입니다.
삭제 이상은 어떤 정보를 삭제하면 의도하지 않은 다른 정보까지 삭제되는 현상

💡 정규화에 대해 설명해주세요.
한 테이블에 하나의 의미만 존재하도록 테이블을 분해하는 과정으로, 데이터의 일관성 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법입니다.

제 1 정규형: 테이블의 컬럼 값이 원자 값을 갖도록 분해합니다.
제 2 정규형: 제 1 정규형을 만족하고, 완전 함수 종속을 만족하도록 테이블을 분해합니다.
완전 함수 종속이란 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미합니다.
제 3 정규형: 제 2 정규형을 만족하고, 이행적 함수 종속을 없애도록 분해합니다.
이행적 종속이란 A가 B의 결정자이고, B가 C의 결정자 관계일 경우, A가 C의 결정자가 되는 것을 의미합니다.
BCNF 정규화: 제 3 정규형을 만족하고, 모든 결정자가 후보키가 되도록 테이블을 분해하는 것입니다.

💡 역정규화를 하는 이유에 대해 아는대로 설명해주세요.
정규화를 거치면 JOIN 연산이 많아지는데, 이로 인해 성능이 저하될 수 있습니다. 역정규화를 하는 가장 큰 이유는 읽기 작업이 많이 필요한 데이터베이스의 경우 성능을 향상시키기 위함입니다.

💡 파티셔닝
테이블을 컬럼 단위로 나누는 기법입니다. 장점은 update나 insert 같은 작업이 분산되어 성능이 향상됩니다. 단점은 테이블 간 join 비용이 증가하게 됩니다.

💡 샤딩
테이블을 row 단위로 분산해서 저장하는 방법으로, Horizontal Partitioning 이라고도 합니다. 샤드 key를 정하는 방법에 따라서 샤드 종류가 결정되는데 크게 Hash Sharding과 Dynamic Sharding이 있습니다.

0개의 댓글