1. 데이터베이스 특징
2. Index와 DBMS가 인덱스를 관리하는 자료구조
3. RDBMS vs NoSQL
4. 정규화 장단점
5. DB락
study 준비
- transaction과 transaction 특징
- 정규화와 비정규화
- 이상현상
- 제1정규화, 제2정규화, 제3정규화
- 트랜잭션 격리 수준
- DDL, DML, DCL
- 테이블 파티셔닝과 샤딩
- SQL Injection
- DB Tuning
- 데이터베이스 무결성
- 데이터베이스란? 왜사용하는가
- 기본키, 외래키, 후보키, 슈퍼키, 대체키
데이터베이스 특징
[간단하게]
데이터베이스 특징으로는 실시간 접근성(Real-Time Accessibility), 지속적인 변화(Continuous Evolution), 동시 공용(Concurrent Sharing), 내용에 의한 참조(Content Reference)가 있습니다.
[구체적으로]
데이터베이스 특징은 총 4가지가 있습니다. 데이터베이스는 비정형적인 질의(조회)에 대하여 실시간 처리에 의한 응답이 가능해야하며이를 실시간 접근성(Real-Time Accessibility)라 합니다. 또한 데이터베이스의 상태는 동적입니다. 즉 새로운 데이터의 삽입(Insert), 삭제(Delete), 갱신(Update)으로 항상 최신의 데이터를 유지해야 합니다. 이를 지속적인 변화(Continuous Evolution)이라 합니다. 세번째로 데이터베이스는 서로 다른 목적을 가진 여러 응용자들을 위한 것이므로 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 합니다. Concurrent Sharing이라 부릅니다. 마지막으로 데이터베이스에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라 사용자가 요구하는 데이터 내용으로 찾는 내용에 의한 참조(Content Reference) 특징이 있습니다.
Index와 DBMS가 인덱스를 관리하는 자료구조
[간단하게]
인덱스를 검색하여 해당 자료의 테이블을 엑세스 하는 방법입니다. Index 자료구조로는 B+ Tree, 해시 테이블이 있습니다.
[구체적으로]
Index란 테이블을 처음부터 끝까지 검색하는 방법인 FTS(Full Table Scan)과는 달리 인덱스를 검색하여 해당 자료의 테이블을 엑세스하는 방법입니다. 인덱스는 항상 정렬된 상태를 유지하여 원하는 값을 검색하는데 빠르지만, 새로운 값을 추가하거나 삭제, 수정하는 경우에는 쿼리문 실행 속도가 느려집니다. 즉, 인덱스는 데이터의 저장 성능을 희생하고 대신 데이터의 검색 속도를 높이는 기능입니다.
Index 자료구조로는 B+ Tree와 해시테이블 두가지가 있습니다. B+ Tree는 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조이며, B-Tree 리프노드들을 LinkedList로 연결하여 순차 검색을 용이하게 합니다. 해시테이블보다 나쁜 O(log2N)의 시간 복잡도를 가지지만 일반적으로 사용되는 자료구조입니다. 해시테이블ㄹ은 컬럼의 값으로 생성된 해시를 기반으로 인덱스를 구현합니다. 시간복잡도가 O(1)이라 검색이 매우 빠릅니다. 부등호와 같은 연속적인 데이터를 위한 순차 검색이 불가능하기 때문에 사용에 적합하지 않습니다.
+DBMS : 데이터베이스 관리 시스템. 다수의 사용자들이 데이터베이스 내의 데이터를 접근할 수 있도록 해주는 소프트웨어들을 의미합니다. DBMS는 기존의 파일 시스템이 갖는 데이터의 종속성과 중복성의 문제를 해결하기 위해 제안된 시스템으로 모든 응용 프로그램들이 데이터베이스를 공유할 수 있도록 도와줍니다. 또한 DBMS는 데이터베이스의 구성, 접근방법, 유지관리에 대한 모든 책임을 지게됩니다.
RDBMS vs NoSQL
[간단하게]
RDBMS는 모든 데이터를 2차원 테이블 형태로 표현합니다. 반면 NoSQL(Not only SQL)은 RDBMS와 반대로 데이터간의 관계를 정의하지 않고, 스키마가 없어 좀 더 자유롭게 데이터를 관리할 수 있으며, 컬렉션이라는 형태로 데이터를 관리합니다.
[구체적으로]
RDBMS는 모든 데이터를 2차원 테이블 형태로 표현하며 스키마에 맞춰 데이터를 관리하기 때문에 데이터 정합성을 보장할 수 있습니다. 하지만 시스템이 커질 수록 쿼리가 복잡해지고 성능이 저하되며 Scale-out이 어렵다는 단점이 있습니다.(Scale-up만 가능)
NoSQL은 RDBMS와 반대로 데이터간의 관계를 정의하지 않고, 스키마가 없어 Key-Value 형태로 데이터를 관리해 자유롭게 데이터를 관리할 수 있으며, 데이터 분산이 용이하여 성능 향상을 위한 scale-up 뿐만 아니라 scale-out도 가능합니다. 하지만 데이터 중복이 발생할 수 있으며, 중복된 데이터가 변경될 경우 수정을 모든 컬렉션에서 수행해야 합니다. 또한 스키마가 존재하지 않는다는 점이 명확한 데이터 구조를 보장하지 않아 데이터 구조 결정을 어렵게 합니다.
+각각 어느 경우에 적합한가요?
RDBMS는 데이터 구조가 명확하고, 변경 될 여지가 없으며 스키마가 중요한 경우 사용하는 것이 좋습니다. 또한 중복된 데이터가 없어(데이터 무결성) 변경이 용이하기 때문에 관계를 맺고 있는 데이터가 자주 변경이 이루어지는 시스템에 적합합니다.
NoSQL은 정확한 데이터 구조를 알 수 없고 데이터가 변경/확장 될 수 있는 경우 사용하는 것이 좋습니다. 또한 단점에서도 명확하듯 데이터 중복이 발생할 수 있으며 중복된 데이터가 변경될 시 모든 컬렉션에서 수정해야 하기 때문에 Update가 많이 이루어지지 않는 시스템에 좋으며, Scale-out이 가능하다는 장점을 활용해 막대한 데이터를 저장해야 해서 DB를 Scale-out 해야 되는 시스템에 적합합니다.
정규화 장단점
[구체적으로]
정규화란 하나의 릴레이션에 하나의 의미만 존재하도록 릴레이션을 분해하는 과정이며, 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법입니다.
데이터베이스 변경 시 이상현상이 발생하는 문제를 해결할 수 있으며 데이터베이스 구조 확장 시 정규화된 데이터베이스는 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다는 장점이 있습니다. 하지만 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아져 질의에 대한 응답 시간이 느려질 수 있습니다.
+정규화의 목적 : 대표적으로 두가지가 있습니다. 첫째, 불필요한 데이터 (data redundancy)를 제거해 불필요한 중복을 최소화합니다. 하나의 테이블에 모든 정보를 다 넣게 된다면, 동일한 정보들이 불필요하게 중복되어 저장될 수 있습니다. 둘째, 삽입/갱신/삭제 시 발생할 수 있는 각종 이상 현상(Anomaly)을 방지하기 위해서, 테이블의 구성을 논리적이고 직관적으로 합니다.
+정규화를 수행한다는 것은 이상현상을 제거하는 것이다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. 따라서 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.
+JOIN : 두 개의 데이터베이스 혹은 테이블을 연결하여 데이터를 검새갛는 방법을 말합니다. 조인은 크게 내부조인, 외부조인, 셀프조인으로 나뉩니다. 중복이 없는 서로 다른 두 칼럼을 inner JOIN한다고 했을 때, 이를 수행하는 것은 A와 B의 교집합을 말합니다. 동일한 대상을 outer JOIN한다고 했을 때, 이를 수행하는 것은 A와 B의 합집합을 말합니다. 셀프 조인은 자기 자신에 대해 조인을 수행하는 것을 말합니다.
+비정규화(반정규화)
+제1정규화, 제2정규화, 제3정규화
DB 락
[간단하게]
DB Lock은 트랜잭션 처리의 순차성을 보장하기 위한 방법으로 공유락, 베타락이 있습니다.
[구체적으로]
DB Lock은 트랜잭션 처리의 순차성을 보장하기 위한 방법입니다. 공유락과 배타락이 있는데 첫번째로 Read Lock이라고도 하는 공유락(LS, Shared Lock)은 트랜잭션이 읽기를 할 때 사용하는 락이며, 데이터를 읽기만 하기 때문에 같은 공유락끼리는 동시에 접근이 가능합니다. 두번째로 Write Lock이라고도 하는 배타락(LX, Exclusive Lock)은 데이터를 변경할 때 사용하는 락입니다. 트랜잭션이 완료될 때까지 유지되며, 배타락이 끝나기 전까지 어떠한 접근도 허용하지 않습니다.
study 준비
참고 : https://intrepidgeeks.com/tutorial/prepare-for-the-interview-database
참고 : https://kangsu-2ji.tistory.com/159
- 데이터베이스의 정의와 특징에 대해 설명해주세요
- 트랜잭션에 대해 설명해주시고, 트랜잭션의 특징에 대해 설명해주세요.
- 트랜잭션은 작업의 완정성을 보장해줍니다. 즉, 작업들을 모두 처리하거나 처리하지 못할 경우 이전 상태로 복구하여 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능입니다. 하나의 트랜잭션은 Commit(작업완료) 되거나 Rollback(취소)됩니다.
- 트랜잭션의 특성으로는 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영속성(Durability)가 있습니다.
- 원자성이란 작업이 모두 반영되던지 아니면 전혀 반영되지 않아야한다는 의미입니다. 또한 실행이 완료되면 언제나 일관성 있는 상태를 유지해야하며 독립성은 둘 이상 트랜잭션이 동시에 실행될 경우 서로의 연산에 끼어들 수 없다는 특성입니다. 영속성은 완료된 결과는 영구적으로 반영되어야 한다는 의미입니다.
- 정규화와 비정규화에 대해 간단히 설명해주시고, 정규화의 장단점에 대해 설명해주세요.
- 정규화 장단점
- 정규화는 관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업입니다. 데이터의 중복을 줄이며 무결성을 향상시킬 수 있고 DB 저장 용량을 효율적으로 관리할 수 있습니다. 하지만 테이블의 분해로 인해 테이블 간의 JOIN 연산이 많아져서 질의에 대한 응답 시간이 느려질 수 있습니다. 이것의 해결책이 비정규화입니다.
- 비정규화 또는 반정규화는 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로, 의도적으로 정규화 원칙을 위배하는 행위입니다. 어느정도의 데이터 중복이나 그로 인해 발생하는 데이터 갱신 비용을 감수하는 대신 JOIN 횟수를 줄여 한층 효율적인 쿼리를 날릴 수 있도록 하겠다는 것 입니다. 일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 됩니다.
- 이상현상에 대해 설명해주시고 이상의 종류에 대해 설명해주세요.
- 이상현상은 테이블을 설계할 때 잘못 설계하여 데이터를 삽입, 삭제, 수정할 때 생기는 논리적 오류를 말합니다. 삽입 이상, 갱신 이상, 삭제 이상이 있습니다. 이러한 이상 현상을 예방하고 효과적인 연산을 하기 위해 데이터 정규화를 합니다.
- 삽입이상이란 자료를 삽입할 때 의도하지 않은 자료까지 삽입해야 자료를 테이블에 추가가 가능한 현상을 말합니다.
- 갱신 이상이란 중복된 데이터 중 일부만 수정되어 데이터 모순이 일어나는 현상입니다.
- 삭제 이상이란 어떤 정보를 삭제하면, 의도하지 않은 다른 정보까지 삭제되어버리는 현상입니다.
- NoSQL이 기존 DB와 어떤 점이 다른지 설명해주시고, NoSQL이 어떤 상황에서 사용되면 적합한지 설명해주세요.
- NoSQL이란? 장단점은?
-
정규화란? 제1정규화, 제2정규화, 제3정규화에 대해 설명해주세요.
- 정규화 장단점
- 제 1 정규화란 테이블의 칼럼이 원자 값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것을 말합니다.
- 제 2 정규화란 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해 하는 것을 말합니다. 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 의미합니다.
- 제 3 정규화란 제 2 정규화를 진행한 테이블에 대해 이행적 함수 종속을 없애도록 테이블을 분해하는 것입니다. 이행적 함수 종속은 A->B, B->C가 성립할 때 A->C가 성립되는 것을 의미합니다.
- BCNF 정규화란 제 3 정규화를 진행한 테이블에 대해 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키가 되도록 분해하는 것입니다.
- 트랜잭션 격리 수준이란?
- 트랜잭션의 격리 수준이란 트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준을 의미합니다.
- 격리 수준은 총 4가지로 READ UNCOMMITTED, READ COMMITED, REPEATABLE READ, SERIALIZABLE으로 나뉩니다.
- READ UNCOMMITTED 격리 수준에서는 다른 트랜잭션의 변경내용이 COMMIT이나 ROLLBACK과 상관없이 보여집니다. 데이터 정합성에 문제가 많아 사용되지 않습니다.
- READ COMMITED에서는 변경내용이 COMMIT되어야만 다른 트랜잭션에서 조회가 가능합니다. 이 경우 다른 트랜잭션 진행과정 중에 COMMIT이 발생하면 REPEATABLE-READ를 보장하지 않는다는 문제가 있습니다.
- REPEATABLE READ는 트랜잭션이 시작하기 전에 커밋된 내용만 조회할 수 있습니다. Mysql db에서 기본적으로 사용하는 격리수준입니다. 이 경우 트랜잭션 과정 중에서 새로운 데이터가 삽입되고 이에 대한 업데이트가 진행되면 일관된 데이터를 보장하지 않아 update 부정합과 phantom read가 발생합니다.
- SERIALIZABLE의 경우 트랜잭션이 진행중일 경우 다른 트랜잭션의 읽기도 허용되지 않습니다. 이러한 특성때문에 부정합은 발생하지 않으나 성능이 떨어진다는 단점이 있습니다.
- DDL, DML, DCL에 대해 설명해주세요.
- DDL(Data Definition Language)은 정의어로 데이터베이스 구조를 정의, 수정, 삭제하는 언어(alter, create, drop)를 의미합니다. 다음으로 DML(Data Manipulation Language)은 조작어로 데이터베이스 내의 자료 검색, 삽입, 갱신, 삭제를 위한 언어(select, insert, update, delete)를 말합니다. 마지막으로 DCL(Data Control Language)는 제어어 입니다. 데이터에 대해 무결성 유지, 병행 수행 제어, 보호와 관리를 위한 언어(commit, rollback, grant, revoke)입니다.
- 테이블 파티셔닝과 샤딩이란?
- 파티셔닝은 일반적으로 DB 테이블을 작은 부분으로 여러 개 나누는 것을 의미합니다. 파티셔닝은 열에 대해서 수직으로 혹은 행에 대해 수평으로 나누는 두 가지 방법이 존재합니다.
- 샤딩은 수평 파티셔닝의 특수한 형태로 shared key로 알려진 특수한 키를 기준으로 데이터를 나눕니다. 그리고 나눈 데이터들을 여러 노드에 나누어 저장하는 방식을 의미합니다. 샤딩을 하게되면 수평 파티셔닝이기 때문에 데이터 베이스 스키마가 그대로 유지됩니다.
- SQL Injection이 무엇인지 설명해주시고, SQL Injection을 방어하기 위한 방법을 설명해주세요.
- SQL Injection이란 공격자가 악의적인 의도로 SQL 구문을 삽입하여 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법입니다.
- 이를 방어하기 위해서 사용자의 입력이 쿼리에 동적으로 영향을 주는 경우 입력된 값이 개발자가 의도한 값(유효 값)인지 검증합니다. 다른 방법으로는 저장 프로시저를 사용하는 방법이 있습니다. 저장 프로시저란 사용하고자하는 Query에 미리 형식을 지정한느 것을 말합니다. 지정된 형식의 데이터가 아니면 Query가 실행되지 않기 때문에 보안성이 크게 향상됩니다.
- DB 튜닝(Tuning)이 무엇인지와 튜닝의 3단계에 대해 설명해주세요
- DB 튜닝이란 DB의 구조나, DB 자체, 운영체제 등을 조정하여 DB 시스템의 전체적인 성능을 개선하는 작업을 말합니다. 튜닝은 DB 설계 튜닝->DBMS 튜닝->SQL 튜닝 단계로 진행할 수 있습니다.
- DB 설계 튜닝
- DB에서 Index를 사용하는 이유는? 단점은 없나?
- 데이터베이스 무결성에 대해서 설명해주세요
- DB의 무결성이란 데이터의 정확성과 일관성을 유지하고 보증한는 것을 의미합니다. 무결성이 유지되어야 DB에 저장된 값과 실제의 값이 일치하는 지를 보장할 수 있습니다. 이러한 무결성에는 대표적으로 개체 무결성, 참조 무결성, 도메인 무결성이 있습니다.
- 개체 무결성은 모든 테이블이 기본 키를 가져야 하며, 기본 키로 선택된 열은 고유하여야 하며 null값은 허용되지 않음을 의미합니다.
- 참조 무결성은 외래키를 통해 참조관계에 있는 두 테이블이 항상 일관된 값을 갖도록 유지되는 것을 의미합니다.
- 도메인 무결성은 테이블에 존재하는 필드의 무결성을 보장하기 위한 것으로 필드의 타입, null값 허용 등에 대한 사항을 정의하고 올바른 데이터가 입력되었는지 확인하는 조건입니다.
- 트랜잭션의 4가지 성질에 대해서 설명해주세요.
- 데이터베이스는 무엇이고 왜 사용하나요?
- 데이터베이스란 데이터를 여러 사람이 공유하고 사용할 목적으로 통합관리되는 데이터들의 모임입니다. 데이터베이스를 사용하지 않으면, 프로그램의 종료 시점에 그 전까지 생성한 많은 데이터들이 모두 날아가게 됩니다. 이런 것을 방지하기 위해 데이터들을 데이터베이스에 넣고 보관하는 방법을 사용합니다.
- NoSQL을 SQL과 비교해서 설명해주세요
- 데이터베이스에서 트랜잭션이란 무엇이고 트랜잭션이 만족해야하는 특징(ACID)에 대해 설명해주세요.
- 인덱스란 무엇이고 왜 필요한가요?
- 기본키, 외래키, 후보키, 슈퍼키, 대체키를 비교 설명해주세요.
- 우선 key란 검색, 정렬 시 tuple을 구분할 수 있는 속성값을 의미합니다.
- 튜플이란 릴레이션을 구성한는 각각의 행, 속성의 모임으로 구성됩니다.
- 후보키(Candidate key)는 유일성과 최소성을 만족하며 tuple을 유일하게 식별하기 위해 사용될 수 있는 속성들의 부분집합을 의미합니다. 즉, 기본키가 될 수 있는 키들을 후보키라고 합니다. 모든 릴레이션은 하나 이상의 후보키를 가져야합니다.
- 기본키(Primary key)는 위의 후보키들 중 선택한 Main key로 null값이 허용되지 않고 중복 또한 허용되지 않는 속성입니다.
- 대체키(Alternate key)는 후보키들 중 기본키를 제외한 나머지 키를 말합니다. 보조키라고도 합니다.
- 슈퍼키(Super key)는 유일성은 만족하지만, 최소성은 만족하지 못하는 속성의 집합입니다. 즉, 뭉쳤을 경우 유잉ㄹ성이 생기고, 흩어지면 몇몇 속성들은 독단적으로 유일성있는 키로 사용할 수 없습니다.
- 외래키(Foreign key)는 참조되는 릴레이션의 기본키와 대응되어 릴레이션 간의 참조 관계를 표현하는데 중요한 도구로 사용됩니다. 외래키로 지정되면 참조 테이블의 기본키에 없는 값은 입력할 수 없습니다.
- 우선 key란 검색, 정렬 시 tuple을 구분할 수 있는 속성값을 의미합니다.