# HSH - Database 답변
###### tags: `Database 답변`
## 황성현
### 데이터베이스란 무엇인가?
* 데이터베이스란 여러 사람들이 공유하고 사용할 목적으로 통합 관리되는 데이터들의 집합입니다.
### 데이터베이스의 특징은?
* 데이터베이스는 서로 다른 목적을 가진 유저들이 사용 가능하며 동적으로 최신 데이터를 유지하고 실시간 처리에 응답이 가능하다는 특징을 가지고 있습니다. (동시 접근, 실시간, 동적)
### DBMS의 속성에는 무엇이 있나요?
* 동시 공유가능, 실시간 데이터, 일관성 유지, 내용에 의한 접근, 데이터 중복 최소화
* 독립성, 무결성, 보안성, 일관성
* 독립성 -> 데이터베이스 사이즈를 늘리기 위해 시스템을 수정하거나 응용프로그램에 맞출 필요가 없음.
* 무결성 -> 데이터 변경이나 수정시 제한을 두어 데이터의 정확성을 보장
* 보안성 -> 접근 권한이 있는 사용자만 접근할 수 있도록 보안성을 보장함.
* 일관성 -> 데이터들을 논리적인 구조로 관리하여 데이터가 변경됐을 때도 일관성을 유지함.
### Schema란 무엇인가?
* 스키마는 데이터베이스의 제약 조건에 대한 메타데이터(데이터의 정보를 담는 데이터들)의 집합이다.
### 메타데이터란 무엇인가?
* 한마디로 표현하면 데이터의 정보를 담고 있는 데이터이다. 예를 들면 이미지 파일의 크기나 날짜 데이터들을 메타데이터라고 할 수 있다.
### DB 설계시 유의사항?
* 보안, 무결성 유지, 일관성, 회복, 확장성
* 무결성 유지 : 무결성 제약조건을 만족하도록 설계해야함 -> 삽입, 삭제, 갱신 연산 후에도 제약조건을 계속 만족하도록 설계해야 합니다.
### 정규화란무엇인가?
* 관계형 데이터베이스에서 데이터 중복을 최소화 하기 위해 데이터를 구조화하는 작업입니다.
### 제 3정규형까지설명해주세요.
* 제 1정규형은 도메인을 원자값으로 변경해주고 2정규형은 부분 함수 종속을 제거하고 3정규형은 이행 함수 종속을 제거하는 것입니다.
### 데이터의 중복을 피할수있는데 역정규화는 왜실행하나요?
* 계속 함께 사용하는 테이블이 정규화로 인해 쪼개진다면 join문으로 두 테이블을 연산해서 가져와야 하기 때문에 오히려 성능의 저하가 생길 수 있어 이러한 경우에 역정규화를 실행합니다.
### 키의 종류에는 어떤게 있나요?
* 기본키, 대체키, 슈퍼키, 후보키
* 기본키 -> 후보키 중 선정된 키
* 대체키 -> 기본키가 아닌 후보키
* 후보키 -> 튜플을 식별할 수 있는 속성의 최소 집합
* 슈퍼키 -> 튜플을 식별할 수 있는 속성의 집합
### SQL과 NoSQL의 차이
* NoSQL은 관계형 데이터베이스와 반대되는데 스키마가 없고 자유롭게 데이터를 추가 할 수 있고 수평적 확장에 용이함.
* [+phb] sql은 제약조건에 따라 데이터를 저장하기 때문에 검색에 용이합니다. 반면 스키마가 없는 NoSQL은 방대한 양의 데이터를 자유롭게 저장하기에 용이합니다.
### 무결성 제약조건에 대해 아는대로 서술하시오.
* 데이터베이스의 무결성을 보장하기 위해 데이터 삽입 시에 주어지는 제약조건입니다.
* 개체, 참조, 도메인, 고유 등 다양한 제약조건이 존재합니다.
* 개체 : 기본기 null 불가
* 참조 : 외래키는 null이거나 참조 릴레이션의 기본키 값
* 도메인 : 주어진 데이터 형식을 맞추어야함
### 트랜잭션(Transaction)이란 무엇인가?
* DB의 상태를 하나의 일관된 상태에서 또 다른 일관된 상태로 변환시켜주는 연산들의 집합입니다.
### 트랜잭션의성질
* 트랜잭션의 4가지 특성으로는 (원자성, 일관성, 독립성, 지속성)ACID가 있습니다.
* DB 전체에 반영되거나 아무것도 반영되지 않아야 합니다.
* 트랜잭션 전과 후에도 데이터가 일관돼야 하며 반영된 내용은 계속 유지되어야 합니다.
* 마지막으로 한 트랜잭션 중간에 다른 트랜잭션이 끼어들 수 없습니다.
* 성공적으로 완료됐을 경우 영구적으로 반영되어야 함
### Locking 기법이란?
* 하나의 트랜잭션이 특정 데이터에 접근하는 동안 다른 트랜잭션이 접근을 하지 못하도록 잠금을 하는 기법입니다.
### Locking의 문제점에 대해서 말하시오.
* 트랜잭션들이 Lock을 무기한 대기하는 현상인 데드락이 발생될 수 있습니다.
### 교착상태
* 트랜잭션들이 Lock을 무기한 대기하는 현상
### 교착상태의 빈도를 낮추는방법
* 예방과 회피기법이 있습니다. 예방은 트랜잭션 전에 필요한 데이터에 Lock을 미리 걸어주는 방법입니다. 하지만 데이터 양이 많으면 데드락이 발생할 수 있습니다. 회피기법은 타임스탬프 기법을 적용하여 데이터를 시간 순서대로 제어하는 방법입니다.
### 서브쿼리가 뭐에요?
* 하나의 sql문 안에 존재하는 또 다른 sql문입니다.
### 서브쿼리의 성능은 어때요?
* 실행될 때마다 select문을 수행해야 하고 별도의 인덱스가 없어 속도가 느립니다.
[database DB 인덱스(INDEX)란? | 코딩장이](https://itholic.github.io/database-index/)
### Index란 무엇인가?
* 책의 목차처럼 지정한 칼럼을 정렬하여 쉽게 찾을 수 있도록 만든 테이블입니다.
### Index의 자료구조
* 해쉬테이블과 B+Tree 구조가 있습니다. 하지만 데이터베이스에서 범위 연산에서 우수한 B+ Tree를 사용합니다.
### Index를 모든 칼럼에 적용하면 좋은가?
* 아닙니다. Index를 설정한 칼럼에 대해 새로운 테이블을 만들고 값을 재정렬하게 됩니다. Index를 모든 칼럼에 적용하게 된다면 칼럼에 값이 갱신, 삭제, 삽입될 때마다 인덱스 테이블에 값을 변경하고 재정렬을 해야하기 때문에 오히려 성능의 저하가 발생될 수 있습니다.
### Index는 어디에 사용하는게 좋아요?
* 삽입, 삭제, 갱신이 거의 없고 검색을 많이 하는 테이블에 사용하는 것이 좋습니다.