1.Rdbms 와 no-sql 의 차이점은?
RDBMS는 관계형 데이터베이스 관리 시스템을 의미합니다.
관계형 데이터 모델을 기초로 두고 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스입니다.
또한 RDMBS는 관계를 맺고 모여있는 테이블들의 집합체로 이해할 수 있습니다.
이러한 테이블 간의 관계에서 서로의 칼럼을 기준으로 Join이 가능하다는 게 RDBMS의 가장 큰 특징입니다.
NoSQL이란(Not Only SQL)의 비 관계형 데이터베이스로서
약자로 말 그대도 위에서 설명한 RDB 형태의 관계형 데이터베이스가 아닌
다른 형태의 데이터 저장 기술을 의미하고 있습니다.
NoSQL에서는 RDBMS와는 달리 테이블 간 관계를 정의하지 않습니다.
관계 정의가 없으니 Join이 불가능하고 트랜잭션을 지원하지 않습니다.
NoSQL은 점점 빅데이터의 등장으로 인해 데이터와 트래픽이 기하급수적으로 증가함에 따라
RDBMS에 단점인 성능을 향상하기 위해서는 장비가 좋아야 하는 Scale-Up의 특징이
비용을 기하급수적으로 증가시키기 때문에 데이터 일관성은 포기하되
비용을 고려하여 여러 대의 데이터에 분산하여 저장하는 Scale-Out을 목표로 등장하였습니다.
RDB는 Transaction과 정합성에 초점이 맞춰진 데이터베이스라면
NoSQL은 RDB 보다는 고속의 읽기와 쓰기가 가능하고 분산처리에 뛰어다는 점이 특징입니다.
** 사전 지식
Scale-Up : cpu 변경 램 추가 등 하드웨어를 변경하여 시스템의 성능을 높임
=> rdbms에서 사용하는 성능 개선 방식 (비용이 많이 발생)
Scale-Out : 하나의 장비에서 처리하던 일을 여러 장비에 나눠서 처리함
=> 비교적 저렴한 방식으로 서버 유지 가능
2.index 특징?
Index는 데이터베이스 테이블의 검색 속도를 향상해주기 위한 자료구조입니다.
일반적으로 Index에 비유되는 예가 책의 색인 혹은 목차입니다.
Index는 열 단위로 생성되는데, 하나의 열에 Index를 생성할 수 있고,
여러 열에 하나의 Index를 생성할 수도 있습니다
Clustered Index를 책으로 비유하자면 페이지를 알고 있어서
바로 해당 페이지를 펼치는 것과 같습니다.
Clustered Index는 테이블의 데이터를 지정된 칼럼에 대해 물리적으로 데이터를 재배열합니다.
Index Page를 키값과 데이터 페이지 번호로 구성하고,
검색하고자 하는 데이터의 키 값으로 페이지 번호를 검색하여 데이터를 찾습니다.
Clustered Index는 루트 페이지와 리프 페이지로 구성되며,
리프 페이지는 데이터 그 자체를 의미합니다.
Non-Clustered Index를 책으로 비유하자면 목차에서 찾고자 하는 내용의 페이지를 찾고 나서
해당 페이지로 이동하는 것과 같습니다.
Non-Clustered Index는 물리적으로 데이터를 배열하지 않은 상태로 데이터 페이지가 구성됩니다.
테이블의 데이터는 그대로 두고 인덱스로 지정된 칼럼에 대해서 정렬시킨 인덱스를 만듭니다
Non-Clustered Index는 Clustered Index보다 검색 속도는 느리지만,
데이터의 입력/수정/삭제는 더 빠릅니다.
Non-Clustered Index는 clustered index 와는 다르게
테이블 당 여러 개 존재 가능하며 함부로 남용하면 오히려 시스템 성능을 떨어뜨리게 됩니다.
Non-clustered index 페이지는
인덱스 페이지의 리프 페이지에 Index로 구성한 열을 정렬한 후 위치 포인터(RID)를 생성합니다.
Non-Clustered Index에서 인덱스 자체의 리프 페이지는 데이터가 아니라,
데이터가 위치하는 포인터(RID)를 저장하고 있습니다.
검색하고자 하는 데이터의 키 값을 루트 페이지에서 비교하여 리프 페이지 번호를 찾고,
리프 페이지에서 RID 정보로 실제 데이터의 위치로 이동하는 방식으로
실제 데이터를 찾아주는 작업을 수행합니다.
*clustered index
*non-clustered index
3. 테이블 파티셔닝이란?
파티션의 사전적 의미는 칸막이 분할입니다.
실생활 넓은 사무실 공간을 부서나 팀 단위로 적당히 나누어 사용하는 것처럼
데이터 베이스에서 테이블과 인덱스를 분할하여 저장하는 개념입니다.
데이터가 일정 규모를 넘어서면 인덱스 조정이나 쿼리 변경만으로는 한계가 있습니다.
적절한 인덱스가 생성되었다고 해도 랜덤 액세스의 양이 방대해지기 때문에
오히려 테이블 풀스캔이 나을 수도 있고 이러한 탐색은 상당히 비효율적이고 시간도 오래 걸립니다.
이럴 때 파티션 개념을 적용하게 된다면 쿼리를 튜닝하지 않고도 성능을 끌어올릴 수 있습니다.
그래서 파티셔닝 개념은 대용량 데이터가 분포된 테이블에
적절하게 사용하면 큰 효과를 볼 수 있습니다.
파티셔닝에는 대표적으로 4가지의 파티셔닝 방법이 있습니다.
1) range partitioning (범위 파티셔닝)
첫 번째로 range partitioning 즉 범위 파티셔닝이 있는데 데이터 내의 특정 범위 내역을 정하여
파티셔닝 해주는 방법으로 사용하기 쉽다는 장점이 있으나,
데이터가 균일하게 분포되지 못해서 성능 저하가 생길 수 있다는 단점이 존재합니다.
2) hash partitioning
두 번째로 hash partitioning 즉 해시 파티셔닝이 있습니다.
range 파티션에서 범위 분포에 대한 단점을 보완한 것으로
hash 함수가 데이터를 균등하게 분포시켜 성능 하락을 방지합니다.
하지만, 데이터의 관리가 어렵다는 단점이 존재합니다.
3) list partitioning
세 번째는 list partitioning 방법이 있는데 파티셔닝 할 항목을 관리자가 직접 지정하는 방식으로
잘 설정한 결우에는 빠른 성능이 보장되지만,
잘못 설정된 경우에는 성능 저하가 발생할 수 있습니다.
마지막으로 conposite partitioning 이 존재합니다.
이름 그대로 복합 파티션으로 위의 파티셔닝을 복합적으로 사용하는 것입니다.
4. 정규화와 역 정규화에 대해 설명해보시오
정규화는 무결성을 유지하기 위해 데이터를 구조화하는 작업입니다.
정규화의 장점은 데이터베이스 변경 시 이상 현상을 제거하고,
데이터베이스 구조 확장 시 재디자인을 최소화한다는 점입니다.
단점은 릴레이션 분해로 인해서 릴레이션 간의 연산을 수행할 때
join 이 많아지고 이로 인해 성능이 저하될 수 있습니다.
<추가 설명>
정규화에는 대표적으로 1 정규화, 2 정규화, 3 정규화가 존재합니다.
제1 정규화
- 릴레이션(테이블)의 튜플(행)은 반드시 고유해야 합니다.
- 모든 특성들은 더 이상 분해할 수 없는 원자적이어야 합니다.
- 쉽게 생각하면 기본키의 특성을 갖는 속성이 있어야 합니다.
제2 정규화
- 데이터는 반드시 1 정규화를 충족해야 한다.
- 기본키가 아닌 속성들이 모두 기본키에 완전 함수 종속되어야 합니다
제3 정규화
- 데이터는 반드시 2 정규화를 충족해야 합니다.
- 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않아야 합니다.
역정규화는 데이터베이스의 비용을 최소화하기 위해 중복을 허용하며
entity를 다시 통합하거나 분할하여 정규화 과정을 통해 도출된 db 구조를 재조정하는 과정입니다.
정규화를 통해 분할된 entity로 인해 어떠한 로직을 위해 사용된 쿼리의
join이 너무 많을 경우에 성능 저하가 발생할 수 있으므로
이럴 때 역 정규화를 통하여 db의 전반적인 성능을 향상할 수 있는 구조화 과정을 거치는 것입니다.
5. 트랜잭션의 개념?
트랜잭션(Transaction 이하 트랜잭션)이란,
데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻합니다.
또한 트랜잭션은 4가지의 성질을 가지고 있습니다
<ACID>
1) Automicity
트랜잭션은 모두 완료되거나 하나도 완료되지 않아야 합니다.
2) Consistency
트랜잭션의 작업 처리 결과는 항상 일관성을 유지해야 합니다.
3) Isolation
하나의 트랜잭션이 작동하고 있을 때 다른 트랜잭션이 해당 트랜잭션의 연산에 끼어들 수 없습니다.
4) Durability
트랜잭션이 완료된 후의 데이터는 영구적으로 보존되어야 합니다.
6. dbms의 장점?
dbms 란 database management system으로 database 자체를 조작하기 위한 소프트웨어입니다.
dbms는 데이터베이스를 구축하는 틀을 제공하고 데이터베이스를 공유하며 사용할 수 있는 환경을 제공합니다.
또한 응용프로그램들이 데이터베이스에 접근할 수 있는 인터페이스를 제공하고
복구 기능과 보안성 기능을 제공합니다.
이러한 dbms의 특징을 통해서 사용자는 더욱 편리한 db 조작을 수행할 수 있습니다.
7. SQL 이란?
SQL 이란 Structured Query Language (구조적 질의 언어)의 줄임말로,
관계형 데이터베이스 시스템에서 자료를 관리 및 처리하리 위해 설계된 언어입니다.
SQL 문법은 크게 3가지 범주로 나뉘게 됩니다.
1) DDL(Data Definition Language, 데이터 정의 언어)
각 릴레이션을 정의하기 위해 사용되는 언어입니다.
대표적인 문법으로는 create., drop, alter 등이 있습니다.
2) DML(Data Manipulation Language, 데이터 조작 언어)
데이터를 조회/추가/삭제/수정하기 위한, 즉 데이터 관리를 위한 언어입니다.
대표적인 문법으로는 select, insert, update, delete 가 존재합니다.
3) DCL(Data Control Language, 데이터 제어 언어)
사용자 관리 및 사용자별로 릴레이션 또는 데이터를 관리하고 접근하는
권한을 다루기 위한 언어입니다. 대표적인 문법으로는 grant, revoke 가 존재합니다.
8. join에 대해서 설명해보시오
두 개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법입니다.
조인은 논리적인 조인과 물리적인 조인으로 나뉘게 되는데
논리적 조인에는 cross join, inner join, outer join 이 존재합니다
1) cross join
두 테이블 간의 카테이션곱을 통하여 데이터를 도출하는 조인 방식이다.
2) inner join
inner join 은 대상이 되는 두 테이블 간의 교집합을 도출하는 방식입니다.
3) outer join
outer join은 대상이 되는 두 테이블 간의 합집합을 도출하는 방식입니다.
여기서 left join right join으로 나누어지게 되는데 보존 테이블을
두 개의 테이블 중에서 왼쪽으로 정할지 오른쪽으로 정할지 정해주는 예약어입니다.
물리적 조인 방식에는 크게
Nested Loops join, Sorted Merge join, Hash join이 존재합니다.
4) Nested Loops join
NL 조인 같은 경우에는 구동 테이블이 있고
내부 테이블이 존재하는데 구동 테이블을 기준으로
내부 테이블을 반복적으로 탐색해주는 방식입니다.
이 조인 방식에서는 구동 테이블의 크기가 중요한데
구동 테이블의 크기가 작으면 연산이 적어지므로
구동 테이블의 크기를 작은 방식으로 조인을 수행해야 합니다.
NL 조인은 인덱스를 이용한 조인 방식이므로 인덱스 구성에 따른 성능 차이가 심합니다.
또한 인덱스를 아무리 완벽히 구성해도 랜덤 I/O 때문에 대량 데이터 처리에 불리하고
버퍼 캐시 히트율에 따라 들쭉날쭉한 성능을 보이게 됩니다.
5) sorted merge join
그리하여 이를 개선할 방법으로 sorted merge join이 존재하는데,
소트 머지 조인은 조인에 참여하는
두 집합을 조인 키(칼럼) 순서대로 정렬(sort) 한 다음에 병합(merge) 하는 조인 방식입니다.
NL 조인은 구동 테이블을 기준으로 내부 테이블을 반복적으로 탐색하는데 반해,
소트 머지 조인은 처음에 두 테이블을 조인 키를 통해
정렬을 수행하고 비교하므로 반복적인 탐색이 줄어들게 됩니다.
6) hash join
세 번째 방식으로는 hash join이 존재합니다.
소트 머지 조인에서 두 테이블을 조인하기 전에 sort 하는 연산과정이 필요했는데 hash join은
그러한 연산과정도 필요하지 않습니다.
일반적으로 HASH JOIN은 HASH 알고리즘을 적용하여 조인을 수행합니다
해시 조인은 빌드 단계와 probe 단계가 존재하는데
빌드 단계에서는 작은 쪽 테이블을 스캔하여 해시 테이블을 생성합니다.
그 후 probe 단계로 넘어가서 큰 쪽 테이블을 스캔하여
만들어진 해시 테이블을 탐색하면서 조인을 수행합니다.
9.Delete Truncate Drop의 차이점은?
'DELETE' 연산을 실행한 후 손실된 데이터를 검색하기 위해
COMMIT 및 ROLLBACK 문을 수행할 수 있습니다.
'TRUNCATE' 조작을 실행한 후 손실된 데이터를 검색하기 위해
COMMIT 및 ROLLBACK 문을 수행할 수 없습니다.
'DROP' 명령은 기본 키 / 외래 키와 같은 테이블 또는 키를 삭제하는 데 사용됩니다.
10. 저장 프로시저란?
저장 프로시저는 사전 컴파일된 SQL 쿼리의 모음으로,
사전에 준비해 둔 많은 명령을 자동으로 실행할 수 있기 때문에
작업의 효율성을 높일 수 있습니다.
저장 프로시저의 첫 실행 시에 컴파일 과정을 거쳐
버퍼 풀 내에 있는 플랜 캐시에 해당 실행계획이 저장되게 됩니다.
그래서 두 번째 이상의 실행 시에는 플랜 캐시 내에 있는 실행계획을 토대로
쿼리를 하여 최적의 실행을 수행할 수 있습니다.
11. 데이터베이스 뷰란?
허용된 데이터를 제한적으로 보여주기 위해 하나 이상의 테이블에서 유도된 가상 테이블입니다.
테이블이 아닌 뷰를 사용하는 이유는 대체로 사용자의 편의와 데이터베이스의 보안 때문입니다.
원본 테이블에 직접 접근하지 않아도 사용자가 임의의 뷰를 구성하여 별도의 이름을 붙이거나
접근 가능한 사람을 지정할 수 있습니다.
이렇게 하면 데이터베이스의 데이터를 안전하게 유지하면서
필요한 사용자에게 적절한 데이터를 제공할 수 있습니다.
또한 임의의 뷰 구성을 통해 자주 사용되는 복잡한 SQL 문을 매번 작성하지 않도록 할 수 있습니다.
이처럼 테이블을 대체하여 편리하게 사용하기 위한 것이 뷰입니다.
뷰의 단점은 큰 테이블에 대한 뷰를 만들 때 오히려 더 많은 메모리가 사용됩니다.
12. ERD 란?
개체-관계 다이어그램으로서 현실에 존재하는 사물이나 개체들을
데이터로 변환시켜 해당 개체의 속성과 다른 개체와의 관계를 도식화하여 나타내 주는 다이어그램입니다.
erd 다이어그램을 통해 개체의 성질과 데이터의 흐름을 파악하기가 용이해집니다.
13. 데이터베이스 무결성이란?
데이터 베이스에 저장된 데이터 값과
그것이 표현하는 현실 세계의 실제값이 일치하는 정확성을 말합니다.
개체 무결성 은 릴레이션에서 기본키를 구성하는 속성은 NULL값이나 중복 값을 가질 수 없고
참조 무결성 은 외래 키 값은 NULL이거나 참조 테이블의 기본키 값이어야 한다는 특징이 있습니다.
14. 이상현상이란?
데이터베이스에서 정규화를 수행하지 않으면,
데이터의 중복이 발생하고 전체적인 무결성이 저하됩니다.
이러한 원인은 데이터 이상 현상(Anomaly)에 의해 발생하며,
이상 현상으로 인해 현실세계의 실제 값과
데이터베이스에 저장된 값이 일치하지 않는 문제가 발생합니다.
대표적인 이상현상으로는 3가지의 현상이 존재합니다.
1) 삽입 이상
원하지 않는 데이터가 삽입되는 이상현상입니다.
2) 갱신 이상
데이터 일부만 변경되어 정합성에 모순이 생기는 현상입니다.
3) 삭제 이상
하나의 자료만 삭제하고 싶지만,
그 자료가 포함된 튜플 자체가 삭제되는 현상으로
원하지 않는 정보까지 같이 삭제되는 현상을 일컫습니다.
15. elastic search에 대해서 설명해보시오
엘라스틱 서치는 no-sql 중 하나로써 기존 rdbms 와는 다른 성질을 가지고 있습니다.
일반적인 디비에서는 볼 수 없는
역 색인을 통해 데이터를 rdbms 보다 훨씬 더 빠르게 찾을 수 있도록 구성되어
검색엔진으로 널리 쓰이고 있습니다.
일반적인 색인은 문서의 위치에 대한 인덱스를 만들어서 빠르게 그 문서에 접근하고자 하는 것인데
역 색인은 반대로 문서 내의 문자와 같은 내용물의 맵핑 정보를 색인해놓는 것입니다
예를 들어 책 뒤표지에 색인된 키워드를 이용해 역으로 본문을 찾는 방식을 말합니다,
만약 rdbms에서 'banana'가 들어간 물품을 찾으려고 하면 like '% banana%'를 써서 찾아야 하는데
이런 식으로 찾게 되면 테이블 풀 스캔을 진행하기 때문에 속도면에서 현저히 느립니다.
하지만, 역 색인을 지원하는 엘라스틱 서치로 물품이름을 찾게 되면
banana 란 단어 정보에 해당 물품 위치정보가 색인되어 있으므로
table full scan을 하지 않고 더 빠르게 찾을 수 있습니다.
하지만 이러한 엘라스틱 서치도 단점을 가지고 있는데,
rdbms에서는 트랜잭션 개념을 지원하지 않기 때문에
데이터 정합성에 문제가 발생할 수 도 있습니다.
16. 트랜잭션을 병행으로 처리하려고 할 때 발생할 수 있는 문제는? 그리고 이를 해결하기 위한 해결방안은 무엇인가요?
갱신 내용 손실
현황 파악 오류
모순성
연쇄 복귀
동시의 하나의 데이터가 갱신될 때 하나의 갱신이 누락될 수 있고
하나의 데이터 갱신이 끝나지 않은 시점에서
다른 트랜잭션이 해당 데이터를 조회할 수 있으며
또한 두 트랜잭션이 동시에 실행될 때 데이터베이스가 일관성이 없는
모순된 상태로 남는 문제가 발생할 수 있으며
두 트랜잭션이 하나의 레코드를 갱신할 때 하나의 트랜잭션이 롤백하면 다른 하나의 트랜잭션
마저 롤백이 되는 문제가 발생할 수 있습니다.
이를 해결하기 위해선 "로킹 제어 기법"을 사용하면 됩니다.
어떤 트랜잭션이 특정 db의 데이터를 사용할 때 db의 일정 부분을 lock 시키고
트랜잭션이 완료될 때 해당 부분을 unlock 시키는 것입니다.
17. 로킹 제어를 크게 하였을 경우와 작게 하였을 경우의 차이점은?
로킹 단위가 크면 그만큼 관리가 쉽지만 병행성이 떨어지고,
로킹 단위가 작으면 병행성이 올라가지만 관리가 어려워집니다.
18. 데드락에 대해서 설명해보시오
데드락은 교착상태라고 합니다.
어떠한 데이터 A, B 가 있다고 하고 트랜잭션 t1, t2 가 있다고 가정해 보면
t1은 리소스 a에 대한 잠금을 가지며 b에 대해서 잠금을 요청한 상태이고
t2는 리소스 b에 대한 잠금을 가지며 a에 대해 잠금을 요청한 상태입니다.
두 작업은 자원이 사용 가능할 때까지 계속 수행할 수 없으며 task 가 계속될 때까지
자원을 해제할 수 없기 때문에 교착상태에 빠지게 됩니다.
데드락을 회피하기 위해서는 여러 가지 방법이 존재하는데
로킹 제어 기법을 타임스탬프 기법으로 바꾼다거나
또한 디비마다 세션 옵션을 통해 교착상태에 대한 우선순위를 조절할 수 있습니다.
19. No SQL 데이터베이스의 유형을 설명해보시오.
No sql의 데이터베이스의 유형은 크게 4가지로 나눌 수 있습니다.
1. 문서 데이터베이스
이 유형의 Nosql 데이터베이스는 항상 데이터를 저장하는 문서 중심 접근 방식을 기반으로 합니다.
문서 데이터베이스의 주요 목적은 단일 엔터티의 모든 데이터를
문서로 저장하는 것이며 모든 문서를 컬렉션으로 저장할 수 있습니다.
예 ) mongo db
2. 키-값 데이터베이스
키-값 저장이 데이터를 저장하는 가장 간단한 방법이기 때문에
이러한 유형의 데이터베이스는 스키마가 없는 방식으로 데이터를 저장합니다.
예 ) Redis
3. 열 저장소 데이터베이스
이러한 유형의 데이터베이스는 키 공간 내 열의 데이터를 저장합니다.
키 공간은 항상 고유한 이름, 값 및 타임스탬프로 정의됩니다.
예 ) Cassandra
4. 그래프 스토어 데이터베이스
주로 그래프 데이터로 쉽게 표현할 수 있는 데이터용으로 설계되어 있습니다.
예 ) Neo4 j
20. MongoDB란 무엇입니까?
mongo db는 문서 데이터베이스형 no-sql입니다.
-Document
-BASE
-Open Source
데이터는 Document 기반으로 구성되어 있고
ACID 대신 BASE를 택하여 데이터의 정합성보단
성능과 가용성을 우선시합니다.
그리고 오픈 소스라는 점 덕분에 무료로 이용할 수 있습니다.
Document 기반의 데이터베이스란 RDB와 비교했을 때는
TABLE 이 Collenctions의 개념과, ROW 가 Dcument의 개념과,
Column 이 Field의 개념과 일치합니다.
Document 구조기반인 mongo-db는 RDB 와는 다르게
데이터 구조를 더 유연하게 잡을 수 있습니다.
BASE라는 개념은 ACID와 대립되는 개념으로 다음 세 가지로 이루어져 있습니다.
1) Basically Available
언제든지 사용할 수 있다는 의미를 가지고 있습니다.
2) Soft State
외부의 개입이 없어도 정보가 변경될 수 있다는 의미를 가지고 있고
문제가 발생되어 일관성이 보장되지 않는 경우에는
일관성을 위해 데이터를 자동으로 수정합니다.
3) Eventually Consistent
일시적으로 일관되지 않은 상태가 되어도 일정 시간 후에는
일관적인 상태가 되어야 한다는 의미로
장애 발생 시 일관성을 유지하기 위한 이벤트를 발생시킵니다.