1. 데이터베이스의 구성요소는?
- 데이터 베이스의 구성요소에는 3가지가 있다.
1. 개체(Entity) 2. 속성(Attribute) 3. 관계(relationship)
- 개체 : DB에서 표현하고자하는 유, 무형의 객체 -> 저장, 관리되어야하는 데이터의 집합 :: 테이블
- 속성 : 개체의 특성이나 상태 :: 컬럼(column)
- 관계 : 개체와 개체 또는 개체와 속성간의 관계
2. RDBMS는 무엇인가?
- 관계형 데이터베이스로써, 데이터가 논리적인 값에의한 관계를 가진 것을 말한다.
- 데이터 검색을 위해 관계형 연산을 지원하는 SQL명령어를 사용한다.
2.1 NoSQL은 무엇인가?
- NoSQL은 데이터 검색과 삽입의 속도 향상에 특화된 목적을 위해 비관계형 데이터 저장소에 데이터를 저장하는 분산 저장 시스템이다.
- 관계형 모델을 사용하지 않으므로 테이블간의 조인 기능이 없다.
- 비 SQL 인터페이스를 통한 데이터 액세스를 지원한다.
- 여러 대의 DB 서버를 묶어 하나의 데이터베이스를 구성한다.(DB 클러스터링)
- 기존 관계형 데이터베이스의 트랜잭션에서 제공하는 ACID 특성을 지원하지 않는다.
2.2 NoSQL은 왜 사용할까?
- SNS나 온라인 쇼핑몰 서비스같이 실시간으로 데이터가 빠르게 쌓이는 서비스가 증가하면서 NoSQL의 사용성이 증가했다.
- 다수의 클라이언트가 동시에 데이터를 읽고 쓰는 상황에서 성능 향상을 위해 사용할 수 있다.
2.3 NoSQL에서 사용하는 모델에 대해서 설명해보라.
- NoSQL에서 사용하는 모델에는 크게 4가지가 있다.
: Key-Value, Document, Column-Family, Graph
- Key-Value : 가장 대표적으로 사용하는 모델로써, 데이터를 키와 값 쌍으로 저장하는 모델이다.
RDBMS의 PK를 키값으로 하고 다른 속성값들을 값으로 하여 각 로우에 저장한다.
value값은 어떠한 형태도 가능하지만 값의 내용을 사용한 쿼리가 불가능하다는 단점이 있다.
ex ) Redis
- Document : 데이터를 키와 도큐먼트의 형태로 저장하는 모델이다.
테이블 대신 Collection에 Document를 XML이나 JSON 같은 형태로 저장한다.
ex) MongoDB, FireBase
- Column-Family : 각 데이터가 각자의 column-name을 가지고 column-family에 속하여 저장된 형태의 모델이다.
RDBMS의 속성들이 계층적인 구조를 가지고 있어 각 데이터에 맞는 속성을 가질 수 있다.
3. PK와 FK에 대해 설명하라.
- Primary Key는 테이블의 각 튜플을 유일하게 식별해주는 속성의 조합이다.
일반적으로 변경되지 않는 값으로 정한다.
- Foreign Key는 같은 테이블 또는 다른 테이블의 PK를 참조하는 속성의 조합이다.
이는 논리적인 값에 의한 것일뿐 물리적으로 pointer가 존재하지 않는다.
FK는 참조하는 PK의 값이나 NULL값만 허용한다.
4. SQL 명령어의 종류
- SQL 명령어의 종류에는 크게 3가지가 있다 : DDL, DML, DCL
- DDL(Data Definition Language) : 테이블 생성이나 구조 변경, 삭제 등의 데이터 구조에 관한 명령어
- DML(Data Manipulation Language) : 데이터 조작에 관한 명령어(insert, update, delete,..)
- DCL(Data Control Language) : DB에 접근하고 데이터를 사용하도록 권한을 주고받는 명령어(grant, revoke)
- rollback, commit은 TCL(Transaction Control Language)
5. delete, truncate, drop의 차이점은?
- delete : 원하는 데이터만 삭제할 수 있고, rollback할 수 있다.
- truncate : 데이터를 선택해서 삭제할 수 없고, rollback할 수 없다.
테이블은 남아있고 데이터만 삭제된다.
- drop : 테이블 전체를 삭제한다. rollback할 수 없다.
6. Join의 개념과 종류에 대해 설명하라.
- 하나 이상의 테이블로부터 연관된 데이터를 검색해오는 방법이다.
- 조인은 크게 세가지로 나눌 수 있다. -> inner join과 outer join, self join
* inner join
- 기본 조인 형식으로써 두개의 테이블의 컬럼값을 결합하여 새로운 결과 테이블을 생성한다.
- equi join, cross join, natural join이 있다.
- equi join : 동등 비교를 통해 결과 테이블을 생성한다.
- natural join : 컬럼명이 같은 컬럼에 대해 비교를 통해 결과 테이블을 생성한다.
(결과 테이블에서 동일한 컬럼명을 가지고 있는 컬럼은 유일하게 추출된다.)
- cross join : 곱집합(카티시안곱) 결과로 결과 테이블을 생성한다.
* outer join
- 조인 대상 테이블에서 특정 테이블의 데이터가 모두 필요한 상황일 때 그 테이블을 기준으로 조인하여 결과 테이블을 생성한다.
- left outer join과 right outer join이 있다.
* self join
- 한 테이블이 자기 자신과 조인하여 결과 테이블을 생성한다.
7. savepoint의 개념에 대해서 설명하라.
- savepoint는 트랜잭션 중간에 위치를 지정하여 특정 지점까지 rollback 할 수 있는 명령어이다.
- 현재 트랜잭션을 더 작은 단위로 나눌 수 있게된다.
8. View란 무엇인가?
- view는 테이블이나 다른 뷰를 기초로한 논리적인 가상 테이블이다.
- 실제 데이터는 없고 질의 문장만 가지고 있다.
- 허용된 데이터만 제한적으로 보여줌으로써 보안측면으로 활용할 수 있다.
8.1 뷰를 생성한 기본 테이블이 변경되면 뷰도 함께 변경해주어야 하는가?
- 아니다. 기본 테이블 데이터가 변경되면 뷰도 자동적으로 변경된다.
+) 뷰가 정의된 기본테이블이나 다른 뷰가 삭제되면 해당 뷰도 함께 삭제된다.
8.2 뷰를 사용하는 이유는 무엇인가?
- 실제 데이터 테이블에 접근하지 않고 가상 테이블의 데이터만 보여주기 때문에 접근 제어가 가능해 보안 유지를 할 수 있다.
- 복잡한 쿼리문의 경우 한번 생성해놓고 재사용함으로써 편의성을 증가시켜준다.
9. Index란 무엇인가?
- 인덱스란 테이블에 대한 명령어 수행 속도를 높여주는 자료구조이다.
- 인덱스는 테이블의 일부 컬럼의 조합으로 하나의 또 다른 테이블을 생성하여 특정 기준으로 정렬한다.
=> 각 행의 주소(rowid)와 인덱스 컬럼값으로 이루어져있다.
- 내부적으로 B-Tree 구조로 데이터를 저장하기 때문에 특정 컬럼값을 찾아내는 것이 빠르다.
=> 해당 노드가 가지고있는 rowid값으로 기존 테이블에서 조회하면 나머지 컬럼값도 조회 가능하다.
(rowid는 데이터를 삽입할 때 DB 내부에서 자동으로 생성하는 값으로 rowid가 주어지면 해당 행의 데이터로 바로 접근이 가능하다)
- MySQL은 기본적으로 PK에 대한 인덱스 테이블을 생성한다.
9.1 인덱스를 주로 어떤 때 사용하는가?
- where 조건이나 join 조건으로 특정 컬럼을 기준으로 많이 사용할 때와 컬럼이 많을 때 주로 사용할 수 있다.
- 테이블의 데이터가 방대하고 테이블에서 주로 조회되는 행의수가 전체의 5% 미만일 때 효율적으로 사용할 수 있다.
9.2 인덱스의 단점이 있을까?
- 인덱스도 결국 테이블이 생성되는 것이므로 너무 많은 컬럼 조합에 대해서 인덱스를 생성하면 메모리 낭비가 생기게된다.
- select를 제외한 insert, update, delete의 경우 관련 인덱스 테이블에서 새롭게 데이터를 정렬해야 하므로 성능이 저하된다.
=> 많은 컬럼을 인덱스로 남용하지 않는 것이 좋다.
10. 데이터베이스 트랜잭션의 개념과 성질에 대해 설명해보라.
- 트랜잭션은 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위이다.
- 하나의 트랜잭션은 여러개의 SQL 명령어로 이루어질 수 있다.
=> 하나의 트랜잭션은 commit되거나 rollback된다.
- 트랜잭션의 성질에는 4가지가 있다 : ACID
Atomicity (원자성) : 트랜잭션의 모든 연산들은 모두 수행되거나 모두 수행되지 않아야한다.
Consistency (일관성) : 트랜잭션이 완료된 후에도 데이터베이스 상태가 일관되게 유지되어야 한다.
즉, 데이터 모델의 모든 제약조건(PK, FK 등)이 트랜잭션 후에도 만족해야 한다.
Isolation (격리성) : 하나의 트랜잭션은 독립적으로 수행된다.
즉, 하나의 트랜잭션이 실행 중 변경한 데이터는 트랜잭션 수행이 완료될 때까지 다른 트랜잭션이 참조하지 못한다.
Durability (지속성) : commit된 트랜잭션의 결과는 영원히 반영되어야 한다.
10-1. 트랜잭션의 독립성을 보장하기 위한 방법에는 무엇이 있는가?
- 병행 처리되는 트랜잭션들간의 독립성을 보장하기 위해 lock & excute unlock 방식을 사용한다.
- 데이터를 읽을 때는 다른 여러 트랜잭션이 동시에 데이터를 읽을수 있도록 shared_lock을 한다.(쓰기는 불가능하다)
- 데이터를 쓸 때는 다른 어떤 트랜잭션이 쓰거나 읽을 수 없도록 exclusive_lock을 한다.
- 특정 데이터에 대한 작업이 끝나면 unlock을 통해 다른 트랜잭션의 접근을 허용하도록 한다.
10-2. 트랜잭션의 독립성이 보장되지 않은 경우 발생할 수 있는 문제에 대해서 설명하라.
- 크게 4개의 트랜잭션의 격리 수준에 따라 다른 현상이 발생한다.
1. 레벨 0 : Read Uncommitted
- 트랜잭션이 처리중인 데이터에 대해서 shared_lock을 걸지않고 접근을 허용하는 레벨
- 수정중인 데이터를 읽을 수 있어 일관성을 유지할 수 없다.
=> Dirty Read 발생
2. 레벨 1 : Read Committed
- 트랜잭션의 쿼리문(select)이 수행중일 때 같은 데이터에 접근하지 못하게 shared_lock을 거는 레벨
- commit이 완료된 데이터만 읽을 수 있다.
- 많은 SQL 서버가 지원하는 격리 수준 레벨
- 한 트랜잭션 내에서 같은 쿼리문을 두번 이상 수행할 때 그 사이에 다른 트랜잭션이 데이터를 수정 또는 삭제하면 각 쿼리의 결과들이 다르게 나와 일관성을 유지할 수 없다.
=> Non-Repeatable Read 발생
3. 레벨 2 : Repeatable Read
- 트랜잭션이 완료될 때까지 select 문장이 사용하는 모든 데이터에 shared_lock을 거는 레벨
- 한 트랜잭션 내에서 같은 쿼리는 같은 결과를 보장하도록 한다.
즉, 다른 트랜잭션이 해당 데이터에 대해서 수정 또는 삭제할 수 없다.
- 새로운 데이터가 삽입되면 이전 쿼리 결과에는 없었던 데이터가 다음 쿼리 결과에 나타나게 된다.
=> Phantom Read 발생
4. 레벨 3 : Serializable
- 트랜잭션이 완료될 때까지 해당 테이블에 다른 트랜잭션이 데이터 삽입, 수정, 삭제를 하지 못하도록 하는 레벨
- 완벽한 일관성을 제공하지만 병행 처리가 힘들어 동시성이 떨어지게 된다.
11. 데이터베이스 정규화에 대해서 설명하라.
- 정규화는 데이터베이스의 테이블을 일정 기준으로 분리함으로써 데이터의 중복을 제거하고, 이상현상을 방지하는 과정이다.
- 또한, 불필요한 쿼리 제거로 성능을 향상시킬 수 있다.
- 슈퍼키 : 릴레이션에서 특정 튜플을 유일하게 구분할 수 있는 속성의 조합
- 후보키 : 슈퍼키 중에서 최소한의 조합으로 특정 튜플을 유일하게 구분할 수 있는 키
- 함수 종속성 : 어떤 릴레이션에서 속성 A에 대해 속성 B의 값이 결정되는 관계를 말한다.
이 때 속성 B가 속성 A에 종속된다고 하고, 속성 A를 결정자, 속성 B를 종속자 라고 한다.
- 결합 종속성 : 어떤 릴레이션이 여러개의 릴레이션의 결합으로 이루어진 관계를 말한다.
* 1차 정규화 : 각 로우의 컬럼값이 원자값을 갖도록 하는 과정이다.
즉, 컬럼값이 2개이상인 로우가 있을 경우 로우를 추가하여 분리한다.
=> 데이터 중복이 생기지만 논리적 구성을 위해 trade-off 한다.
* 2차 정규화 : 모든 컬럼이 완전 함수 종속성을 만족하도록 하는 과정이다.
기본키 집합 중 일부 컬럼에만 종속된 컬럼이 존재하는 경우 부분적 종속성을 가지게 된다.
이 부분적 종속을 없애기 위해 해당 종속 컬럼과 그 결정자(기본키 부분집합)를 다른 테이블로 분리한다.
* 3차 정규화 : 기본키를 제외한 컬럼들 간의 이행적 함수 종속성을 제거하는 과정이다.
기본키 이외의 다른 컬럼이 그 외 다른 컬럼을 결정하면 이행적 함수 종속성을 가지게 된다.
이 이행적 종속을 없애기 위해 해당 종속 컬럼과 그 결정자를 다른 테이블로 분리한다.
* BCNF : 3차 정규형을 좀 더 강화하는 과정이다.
모든 결정자가 후보키 집합에 속하도록 한다.
3차 정규형을 만족하면서 BCNF를 만족하지 않는 경우는 일반 컬럼이 후보키를 결정하는 경우이다.
이 때 해당 결정자와 후보키를 다른 테이블로 분리하여 정규화 한다.
참고 : https://3months.tistory.com/193
데이터베이스 정규화 1NF, 2NF, 3NF, BCNF
데이터베이스 정규화 1NF, 2NF, 3NF, BCNF 데이터베이스 정규화란 데이터베이스의 설계를 재구성하는 테크닉입니다. 정규화를 통해 불필요한 데이터(redundancy)를 없앨 수 있고, 삽입/갱신/삭제 시 발생할 수 있..
3months.tistory.com
11-1. 정규화는 무조건 좋은가?
- 그렇지 않다. 정규화된 테이블은 중복을 제거하기 때문에 용량이 줄어드는 효과가 있지만, 데이터 처리 속도가 느려질 수도 있다. 또한, 복잡한 쿼리문을 작성해야 하는 단점이 있다.
- 느려지는 경우의 대표적인 예는 join 연산이다.
- 정규화 과정에서 너무 많은 릴레이션의 분리가 일어나면 많은 join 연산을 수행해야 하고, 이는 데이터 조회 속도가 느려지게 되는 원인이 된다.
11-2. 정규화의 단점을 극복하는 방안에는 무엇이 있는가?
- 반정규화(역정규화)를 통해서 분리했던 테이블을 통합하는 과정을 수행한다.
- 특히 자주 사용되는 테이블에 접근하는 프로세스의 수가 많은 경우, 대량 데이터의 대량의 범위를 자주 처리하는 경우 사용할 수 있다.
- 반정규화를 과도하게 적용하면 데이터의 무결성이 깨질 수 있다.
- 또한, 데이터 조회 이외의 삽입, 수정, 삭제시에 수행시간이 오래 걸릴 수 있다.
=> 이 경우 무리한 반정규화보다 View를 통한 복잡한 쿼리문 문제 해결과 클러스터링 또는 인덱스를 통한 조회 시간 단축을 할 수 있는지 확인하는 것도 좋다.
12. 데이터베이스 Connection Pool 에 대해 설명하라.
- Connection Pool은 데이터베이스에 접근하기 위한 Connection을 미리 생성해두어 저장해놓은 캐시 공간이다.
- DB Connection에 대한 요청이 오면 커넥션 풀의 커넥션 하나를 빌려주고 다시 반납받는 방식으로 운영한다.
- 미리 커넥션을 생성해놓기 때문에 요청이 들어올 때마다 커넥션 생성과 소멸하는 과정을 생략하여 성능 향상을 기대할 수 있다.
13. DB 파티셔닝이란 무엇인가?
- 큰 테이블이나 인덱스를 작은 단위로 물리적으로 분할함으로써 대규모 데이터베이스의 성능 저하 문제를 해결하는 과정이다.
- 각 파티션을 독립적으로 백업, 복구할 수 있어 효율적인 관리가 가능하다.
- 많은 insert 작업들을 파티션들로 분산시켜 효율적으로 수행한다. (삽입, 수정, 삭제 작업의 분산)
- 테이블간 조인 비용이 추가적으로 발생하는 단점이 있다.
- 수평 파티셔닝과 수직 파티셔닝이 있다.
13-1. 수직 파티셔닝과 정규화의 차이점?
- 둘 다 테이블의 컬럼을 분리한다는 공통점이 있지만, 수직 파티셔닝은 이미 정규화된 테이블을 분리하는 과정이다.
14. 데이터베이스 설계 과정에 대해서 설명하라.
- 데이터베이스 설계에는 크게 3가지가 있다. : 개념적 설계, 논리적 설계, 물리적 설계
- 개념적 설계 : 사용자 요구사항에서 데이터를 구조화하여 E-R 다이어그램을 작성하는 단계
- 논리적 설계 : 특정 DBMS의 논리적 자료 구조로 변환하는 과정. 테이블을 설계하고 정규화하는 단계
- 물리적 설계 : 데이터를 물리적 구조로 변환하는 과정.
'DEVELOP > DB' 카테고리의 다른 글
Persistence Framework (0) | 2019.10.14 |
---|---|
트랜잭션(Transaction) (0) | 2019.10.04 |