땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • E
  • ㅗ
  • 이것이 리눅스다 with Rocky Linux9
  • I
  • D

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원
CS

CS 면접 준비(데이터베이스)

CS 면접 준비(데이터베이스)
CS

CS 면접 준비(데이터베이스)

2022. 12. 24. 17:27

Q. 데이터베이스를 사용하는 이유는 무엇일까?

데이터의 종속성 문제와 중복성, 데이터 무결성 문제를 해결하기 위해 사용합니다.

 

Q. 데이터 종속성, 중복성, 무결성은 무엇일까요?

종속성은 프로그램의 구조와 데이터의 구조가 서로 영향을 받는다는 의미입니다.

종속성이 안지켜지면 데이터구조가 바뀔 때 프로그램 구조도 바뀌게 되어 개발과 비용이 많이 듭니다.

 

중복성은 말 그대로 중복적으로 데이터가 중복적으로 존재해서 저장공간이 낭비되는 일입니다.

 

무결성은 정확성과 일관성을 유지하고 보증하는 의미입니다

 

Q. 참조 무결성 제약조건과 개체 무결성 제약조건의 차이점은 무엇인가요?

참조 무결성 제약조건 : 외래키는 참조할 수 없는 값을 가질 수 없다

개체 무결성 제약조건 : 기본키는 null 값이 될 수 없다

 

Q. Key의 종류와 특징에 대해 간단히 설명하시오

1. Candidate Key (후보키)

Tuple을 유일하게 식별하기 위해 사용하는 속성들의 부분 집합. (기본키로 사용할 수 있는 속성들)

 

2. Primary Key (기본키)

후보키 중 선택한 Main Key

 

3. Alternate Key (대체키)

후보키 중 기본키를 제외한 나머지 키 = 보조키

 

4. Super Key (슈퍼키)

유일성은 만족하지만, 최소성은 만족하지 못하는 키

최소성 : 굳이 다른거까지 끌어드려서 낭비시키게 함

 

5. Foreign Key (외래키)

다른 릴레이션의 기본키를 그대로 참조하는 속성의 집합

 

Q . View에 대해 설명하시오

자주 쓰는 테이블에 대하여 하나의 가상 테이블을 만드는 개념입니다.

공공데이터 API를 이용한 아파트 거래 정보 사이트를 만들었을 때 수십만건의 아파트 정보들이 각각 다른 테이블에 있었는데 이를 이용하기 위해 계속 join연산을 실행하는것보다 view를 만들어서 view를 select하는 방식이 훨씬 속도가 빨랐던 경험이 있습니다.

 

Q . Index란 무엇일까? / 인덱스에 대해 설명하시요

데이터들을 책의 목차처럼 소제목을 정하는 일입니다.

공공데이터 API를 이용한 아파트 거래 정보 사이트를 만들었을 때 수십만건에 해당하는 아파트 정보들을 빠르게 불러오기 위해 인덱스를 사용해서 검색 속도를 향상 시킨 경험이 있는데 이처럼 검색 속도를 빠르게 한다는 특징이 있습니다.

 

Q . 그럼 Index를 많이 사용하면 좋을까요? / Index의 단점이 있을까요?

무분별하게 사용하면 오히려 역효과가 일어납니다.

정렬된 상태를 계속 유지시켜줘야 한다는 점이 가장 큰 문제점인데 무작위로 Index를 생성하면 DB의 저장공간 낭비 뿐만 아니라 DML 명령들이 실행될때마다 다시 정렬을 해야하는 단점이 있어서 무턱대고 사용하는건 좋지 않습니다.

따라서,  인덱스를 생성하는 것보다는 SQL문을 좀 더 효율적으로 짜는 방향으로 나가야 한다. 인덱스 생성은 마지막 수단

 

Q. 왜 index 를 생성하는데 B-Tree 를 사용하는가?

탐색시간이 제일 빠른 해시 테이블을 DB 인덱스를 사용하고 싶지만 특정 기준보다 크거나 작은 값을 찾을 수 없습니다. 실제로 우리가 알고리즘 문제를 풀면서 HashMap을 사용하려고 하면 key-value의 형태로 접근하게 되는데 이거보다 크거나 작은 값은 탐색할 수 없다는걸 알기 때문에 그 다음 밸런스 트리 중 가장 효과적인 B-Tree를 사용합니다.

 

Q . 정규화란 무엇일까? / 정규화에 대해 설명하시오

데이터의 중복을 줄이고, 무결성을 지켜서 이상 현상을 방지하고자 하는 구조화 작업입니다.

 

제1정규형: 모든 속성 값이 원자 값을 갖도록 분해한다.


제2정규형: 제1정규형을 만족하고, 완전 함수 종속을 만족하게 한다
(여기서 완전 함수 종속이란 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미한다.)


제3정규형: 제2정규형을 만족하고, 이행적 종속을 없애기 위해 테이블을 분리하는 것이다.
(여기서 이행적 종속이란 A->B->C가 성립하는 것으로, 이를 A,B와 B,C로 분해하는 것이 제3정규형이다.)


BCNF 정규형: 제3정규형을 만족하고, 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키가 되도록 분해한다.

 

Q. JOIN이란 무엇인가?

두 개 이상의 테이블이나 DB을 연결해서 검색하는 방법

 

Q. JOIN에 종류에 대해 설명하시오.

INNER JOIN은 교집합으로 서로 중복된 값들만 보여주게 되고 LEFT, RIGHT, FULL OUTER JOIN은 말그대로 대상에 더 치중되게 보여주고 CROSS JOIN은 모든 경우의 수, SELF JOIN은 자기자신과 JOIN

 

Q. SQL Injection이란?

말그대로 SQL을 주입시켜서 비정상적인 동작을 하는 행위인데, 대표적으로 2017년 '여기어떄'에서 SQL Injection으로 대규모 개인정보 유출 사건이 발생한적이 있는 만큼 큰 피해를 입을 수 있는 공격입니다.

Q. NoSQL 과 RDB 의 특징, 차이에 대해 말씀해주세요. 어느 상황에 어떤 데이터베이스를 쓰는게 좋겠습니까?

RDB는 정해진 스키마에 따라 저장해야하여 명확한 데이터 구조를 보장하지만 시스템이 커질 경우 복잡하고  JOIN문이 많은 쿼리가 만들어질 수 있어 비용이 많이 들게되고 NoSQL은 스키마가 없어 자유로운 데이터 구조를 가지는 대신 데이터 중복이나 명확한 데이터 구조를 결정하기 어려울 수 있다.

RDB는 말그대로 데이터 구조가 명확한 시스템에 사용하기 용이하고 데이터가 자주 변경되는 시스템에서 용이

NoSQL은 데이터 중복이라는 문제점 때문에 변경보다는 검색을 많이 하는 시스템에서 용이

 

Q. Big data 를 다루려면 RDBMS 보다 NoSQL 이 더 좋다는 말이 많습니다. 그렇다면 large data set 에는 항상 NoSQL 만 써야 할까요? 반드시 RDBMS 만을 이용해 large data set 을 다루려면 어떻게 해야 할까요?

사실 NoSQL과 RDBMS를  대용량 처리에 적합하다 안하다라고 구분지어서 얘기하는 시대는 조금 지났다고 생각합니다.

Greenplum같이 RDBMS를 대용량 처리에 발전 시킨 DB가 많이 나오고 있고 NewSQL이라는 개념도 생겨날 만큼 둘의 장점을 합치려는 시도가 많이 보입니다. 따라서, RDBMS를 대용량 처리에 발전시킨 DBMS로 사용하면 가능합니다.

https://koreascience.kr/article/JAKO201216735814235.pdf

Q . 정규화의 단점은 무엇인가?

릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아져서 이로 인해 질의에 대한 응답 시간이 느려질 수 있지만 

중복 속성을 제거하여 용량이 최소화되기 때문에 속도가 빨라질 수도 있고 느려질 수도 있는 특징이 있다.

 

Q . 단점에서 미루어보았을 때 어떠한 상황에서 정규화를 진행해야 하는가? 단점에 대한 대응책은?

조회를 하는 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요합니다.

 

Q. 트랜잭션이란?

트랜잭션은 작업의 완전성 을 보장해주는 것이다.

즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다. 사용자의 입장에서는 작업의 논리적 단위로 이해를 할 수 있고 시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위가 된다.

 

Q. 트랜잭션을 사용할 때 주의할 점은?

트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 일반적으로 데이터베이스 Connection은 개수가 제한적이다. 그런데 각 단위 프로그램이 Connection을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수는 줄어들게 되어 기다리게 되는 시간이 생길 수 있다.

 

*DB Connection : DB를 사용하기 위해 DB와 애플리케이션 간 통신을 할 수 있는 수단

 

Q. 교착상태란 무엇인가요

두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태

 

Q. 어떤 서비스의 이용자 테이블이 있다고 가정합시다. 이용자 id 를 여러 테이블에서 FK 로 참조하고 있습니다. 그런데 이용자 테이블에 환경설정, 개인정보 등 정보를 한데 저장하다보니 Column 이 40개가 넘게 있는 상태입니다. 문제를 진단해 주시고, 해결 방안도 제시해 주시기 바랍니다.

DB 스키마 설계가 잘못되었음. 이렇게 진행할 시 테이블 쿼리문의 실행 속도가 크게 늘어날 것임

Column안에 후보키에서 하나 뽑아내서 새로운 테이블을 만들고 FK로 연결하는것이 훨씬 물리적으로나 논리적으로 효율적이다

 

Q. Slow query 를 발견하고, 수정한 경험에 대해 말씀해 주세요.

select 요청이 들어올 때 마다 20만건 이상의 데이터를 가지고 있는 table을 서로 join해서 검색한 경험이 있었는데 자주 쓰는 table을 미리 view로 만들어두고 쿼리 속도를 향상 시킨 경험이 있습니다.

 

Q. 저희는 도축장에서 전달받은 원육을 소매점에 도매하는 서비스를 운영하고 있습니다. 여기서, 원육과 소매점을 어떻게 테이블로 모델링 하시겠습니까?

 

 

Q. 어플리케이션의 문자열(String) 을 데이터베이스에 저장하기 위해 고려해야 할 사항에는 어떤 점이 있을까요?

인코딩 문제

 

Q. 실 서비스의 데이터를 조작하고, 또 조회해야 하는 Admin app 을 만들어야 한다면, 어떻게 구현하시겠습니까?

 

Q. 데이터 마이그레이션 기간 동안 서비스 순단을 최소한으로 하고 싶습니다. 이런 요구사항에 맞는 테이블을 어떻게 설계하시겠습니까?

 

Q. 쿼리 속도 및 효율 향상법은 무엇일까?

 

Q.데이터베이스 샤딩 / 파티셔닝에 대해 설명해주세요.

 

Q. Optimistic Locking(낙관적 락) 과 Pessimistic Locking(비관적 락) 에 대해 설명해주세요. 각각의 락을 사용할 상황 또는 제품 사례를 말씀해주세요.

 

Q. 식별 비식별 관계란 무엇일까?

 

 

 

 

 

[ 식별/비식별 관계란?]

더보기

식별 관계

식별 관계란, 부모 테이블의 기본키 또는 유니크 키를 자식 테이블이 자신의 기본키로 사용하는 관계입니다. 부모 테이블의 키가 자신의 기본키에  포함되기 때문에 반드시 부모 테이블에 데이터가 존재해야 자식 테이블에 데이터를 입력할 수 있습니다. 즉, 부모 데이터가 없다면 자식 데이터는 생길 수 없습니다.

 

식별관계는 ERD상에서 실선으로 표시합니다. 자식 테이블에 데이터가 존재한다면 부모 데이터가 반드시 존재하는 상태가 됩니다. 바퀴는 자동차 테이블에 데이터가 존재해야 생성할 수 있습니다. 즉, 부모 테이블에 자식 테이블이 종속됩니다.

 

비식별 관계

비 식별 관계란 부모 테이블의 기본키 또는 유니크 키를 자신의 기본키로 사용하지 않고, 외래 키로 사용하는 관계입니다. 자식 데이터는 부모 데이터가 없어도 독립적으로 생성될 수 있습니다. 부모와의 의존성을 줄일 수 있기 때문에 조금 더 자유로운 데이터 생성과 수정이 가능합니다.

[ 인덱스(index)란? ]

더보기

인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는 내용을 찾는다고 하면, 책의 모든 페이지를 찾아 보는것은 오랜 시간이 걸린다. 그렇기 때문에 책의 저자들은 책의 맨 앞 또는 맨 뒤에 색인을 추가하는데, 데이터베이스의 index는 책의 색인과 같다.

데이터베이스에서도 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있도록 돕고 있다.

만약 Index를 적용하지 않은 컬럼을 조회한다면, 전체를 탐색하는 Full Scan이 수행된다. Full Scan은 전체를 비교하여 탐색하기 때문에 처리 속도가 떨어진다.

 

 

[ 인덱스의 자료구조 ]

그렇다면 DBMS 는 인덱스를 어떻게 관리하고 있는가

B Tree 인덱스 알고리즘

일반적으로 사용되는 인덱스 알고리즘은 B+-Tree 알고리즘이다. B+-Tree 인덱스는 칼럼의 값을 변형하지 않고(사실 값의 앞부분만 잘라서 관리한다.), 원래의 값을 이용해 인덱싱하는 알고리즘이다.

Hash 인덱스 알고리즘

칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원한다. 하지만 값을 변형해서 인덱싱하므로, 특정 문자로 시작하는 값으로 검색을 하는 전방 일치와 같이 값의 일부만으로 검색하고자 할 때는 해시 인덱스를 사용할 수 없다. 주로 메모리 기반의 데이터베이스에서 많이 사용한다.

왜 index 를 생성하는데 b-tree 를 사용하는가?

데이터에 접근하는 시간복잡도가 O(1)인 hash table 이 더 효율적일 것 같은데? SELECT 질의의 조건에는 부등호(<>) 연산도 포함이 된다. hash table 을 사용하게 된다면 등호(=) 연산이 아닌 부등호 연산의 경우에 문제가 발생한다. 동등 연산(=)에 특화된 hashtable은 데이터베이스의 자료구조로 적합하지 않다.

 

 양쪽 자식의 밸런스를 유지하는 Balanced Tree 중 RedBlack-Tree, B-Tree 가 있는데 B-Tree가 참조 포인터 접근에 더 용이하기 때문이다.

 

그럼 참조 포인터가 없는 Array이나 LinkedList를 쓰면 되는거 아닌가?

1. 배열은 삽입,삭제,수정이 일어나게 되면 한칸씩 밀리게 되는 구조니까 O(N)이라는 시간이 들어서 비효율

2. 참조 포인터로만 이루어져 있는 LinkedList에서 탐색을 하기엔 부적절

 

[ DB 정규화 ]

더보기
  1. 제1정규형: 모든 속성 값이 원자 값을 갖도록 분해한다.

  2. 제2정규형: 제1정규형을 만족하고, 기본키가 아닌 속성이 기본키에 완전 함수 종속이도록 분해한다.
    (여기서 완전 함수 종속이란 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미한다.)

  3. 제3정규형: 제2정규형을 만족하고, 기본키가 아닌 속성이 기본키에 직접 종속(비이행적 종속)하도록 분해한다.
    (여기서 이행적 종속이란 A->B->C가 성립하는 것으로, 이를 A,B와 B,C로 분해하는 것이 제3정규형이다.)

  4. BCNF 정규형: 제3정규형을 만족하고, 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키가 되도록 분해한다.

[ 이상 현상이란? ]

더보기
  • 데이터들이 중복되어 발생하는 불일치 현상
  • 삭제 이상: 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
  • 삽입 이상: 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
  • 수정 이상: 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상

[ 트랜잭션(Transaction)이란? ]

더보기

트랜잭션은 작업의 완전성 을 보장해주는 것이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다. 사용자의 입장에서는 작업의 논리적 단위로 이해를 할 수 있고 시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위가 된다.

 

[ 트랜잭션의 ACID란? ]

  • 원자성(Atomicity): 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않아야 한다.
  • 일관성(Consistency): 트랜잭션을 수행하기 전이나 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
  • 고립성(Isolation): 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경중인 데이터 값을 훼손하지 않아야한다.
  • 지속성(Durability): 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다

[ DB 락의 종류 ]

더보기

DB 락은 여러 개의 트랜잭션들이 하나의 데이터로 동시에 접근하려고 할 때 이를 제어해주는 도구이다.

  • 공유락(LS, Shared Lock): 트랜잭션이 읽기를 할 때 사용하는 락, 데이터를 읽을 수 있지만 쓸 수 없음
  • 베타락(LX, Exclusive Lock): 트랜잭션이 읽고 쓰기를 할 때 사용하는 락, 데이터를 읽고 쓸 수 있음

[ RDBMS와 NoSQL 차이 ]

더보기
  • RDBMS
    • 2차원의 행과 열로 데이터의 관계를 관리하는 데이터베이스 
    • 장점: 스키마에 맞추어 데이터를 관리하기 때문에 데이터의 정합성을 보장할 수 있다.
    • 단점: 시스템이 커질 수록 쿼리가 복잡해지고 성능이 저하되며, 수평적 확장이 어렵다.
  • NoSQL
    • RDBMS가 비대해짐에 따라 관계가 복잡해져, 이를 극복하기 위해 등장하게 된 데이터베이스
    • 장점: NOSQL은 스키마 없이 Key-Value 형태로 데이터를 관리하여 좀 더 자유롭게 데이터를 관리할 수 있다.
    • 단점: 중복된 데이터가 추가 가능하여, 이에 대한 관리가 필요하다.

[ 힌트(Hint)란? ]

더보기

힌트란 SQL을 튜닝하기 위한 지시구문입니다. 옵티마이저가 최적의 계획으로 SQL문을 처리하지 못하는 경우에 개발자가 직접 최적의 실행 계획을 제공하는 것입니다. 힌트는 아래와 같이 SELECT 다음에 작성할 수 있으며, INDEX, PARALLEL 등 다양한 힌트절이 있습니다.

# 사용가능한 힌트절: PARALLE, INDEX, FULL ...
SELECT /*+ [힌트절] */ 

[ 클러스터링 vs 리플리케이션 ]

더보기
  • 리플리케이션
    • 여러 개의 DB를 권한에 따라 수직적인 구조(Master-Slave)로 구축하는 방식이다.
    • 비동기 방식으로 노드들 간의 데이터를 동기화한다.
    • 장점: 비동기 방식으로 데이터가 동기화되어 지연 시간이 거의 없다.
    • 단점: 노드들 간의 데이터가 동기화되지 않아 일관성있는 데이터를 얻지 못할 수 있다.
  • 클러스터링
    • 여러 개의 DB를 수평적인 구조로 구축하여 Fail Over한 시스템을 구축하는 방식이다.
    • 동기 방식으로 노드들 간의 데이터를 동기화한다.
    • 장점: 1개의 노드가 죽어도 다른 노드가 살아 있어 시스템을 장애없이 운영할 수 있다.
    • 단점: 여러 노드들 간의 데이터를 동기화하는 시간이 필요하므로 Replciation에 비해 쓰기 성능이 떨어진다.

[ 데이터베이스 튜닝과 방법 ]

더보기

DB 튜닝은 테이터베이스의 구조나 데이터베이스 자체, 운영체제 등을 조정하여 데이터베이스 시스템의 성능을 향상시키는 작업을 의미합니다. 튜닝은 DB 설계 튜닝 -> DBMS 튜닝 > SQL 튜닝의 단계로 진행할 수 있습니다.

[정규화 단계]

더보기

제 1 정규형

애트리뷰트의 도메인이 오직 원자값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다. 즉, 복합 애트리뷰트, 다중값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태를 말한다.

제 2 정규형

모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속이면 제 2 정규형을 만족한다고 볼 수 있다. 완전 함수적 종속이란 X -> Y 라고 가정했을 때, X 의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말한다. 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말한다.

제 3 정규형

어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X - >Y, Y -> Z의 경우에 의해서 추론될 수 있는 X -> Z의 종속관계를 말한다. 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태를 말한다.

BCNF(Boyce-Codd) 정규형

여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용이다. 복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 제 3 정규형을 보완하는데 의미가 있다. 비주요 애트리뷰트가 후보키의 일부를 결정하는 분해하는 과정을 말한다.

각 정규형은 그의 선행 정규형보다 더 엄격한 조건을 갖는다.

  • 모든 제 2 정규형 릴레이션은 제 1 정규형을 갖는다.
  • 모든 제 3 정규형 릴레이션은 제 2 정규형을 갖는다.
  • 모든 BCNF 정규형 릴레이션은 제 3 정규형을 갖는다.

수많은 정규형이 있지만 관계 데이터베이스 설계의 목표는 각 릴레이션이 3NF(or BCNF)를 갖게 하는 것이다.

[반정규화(De-normalization, 비정규화)]

더보기

반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다. 디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나, 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다. 일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

무엇이 반정규화의 대상이 되는가?

  1. 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
  2. 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
  3. 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

반정규화 과정에서 주의할 점은?

반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다. 또한 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다.

[트랜잭션과 Lock]

더보기

잠금(Lock)과 트랜잭션은 서로 비슷한 개념 같지만 사실 잠금은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다. 잠금은 여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할을 한다. 여기서 자원은 레코드나 테이블을 말한다. 이와는 조금 다르게 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합되었을 때만 의미있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋 중 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용되거나 아무것도 적용되지 않아야 함을 보장하는 것이다. 예를 들면 HW 에러 또는 SW 에러와 같은 문제로 인해 작업에 실패가 있을 경우, 특별한 대책이 필요하게 되는데 이러한 문제를 해결하는 것이다.

[교착상태]

더보기

교착상태란 무엇인가

복수의 트랜잭션을 사용하다보면 교착상태가 일어날수 있다. 교착상태란 두 개 이상의 트랜잭션이 특정 자원(테이블 또는 행)의 잠금(Lock)을 획득한 채 다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태가 되는데, 이를 교착상태라고 한다.

교착상태의 예(MySQL)

MySQL MVCC에 따른 특성 때문에 트랜잭션에서 갱신 연산(Insert, Update, Delete)를 실행하면 잠금을 획득한다. (기본은 행에 대한 잠금)

트랜잭션 1이 테이블 B의 첫번째 행의 잠금을 얻고 트랜잭션 2도 테이블 A의 첫번째 행의 잠금을 얻었다고 하자.

Transaction 1> create table B (i1 int not null primary key) engine = innodb;
Transaction 2> create table A (i1 int not null primary key) engine = innodb;

Transaction 1> start transaction; insert into B values(1);
Transaction 2> start transaction; insert into A values(1);

트랜잭션을 commit 하지 않은채 서로의 첫번째 행에 대한 잠금을 요청하면

Transaction 1> insert into A values(1);
Transaction 2> insert into B values(1);
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

Deadlock 이 발생한다. 일반적인 DBMS는 교착상태를 독자적으로 검출해 보고한다.

교착 상태의 빈도를 낮추는 방법

  • 트랜잭션을 자주 커밋한다.
  • 정해진 순서로 테이블에 접근한다. 위에서 트랜잭션 1 이 테이블 B -> A 의 순으로 접근했고, 트랜잭션 2 는 테이블 A -> B의 순으로 접근했다. 트랜잭션들이 동일한 테이블 순으로 접근하게 한다.
  • 읽기 잠금 획득 (SELECT ~ FOR UPDATE)의 사용을 피한다.
  • 한 테이블의 복수 행을 복수의 연결에서 순서 없이 갱신하면 교착상태가 발생하기 쉽다, 이 경우에는 테이블 단위의 잠금을 획득해 갱신을 직렬화 하면 동시성은 떨어지지만 교착상태를 회피할 수 있다.

[NoSQL]

더보기

정의

관계형 데이터 모델을 지양 하며 대량의 분산된 데이터를 저장하고 조회하는 데 특화되었으며 스키마 없이 사용 가능하거나 느슨한 스키마를 제공하는 저장소를 말한다.

종류마다 쓰기/읽기 성능 특화, 2 차 인덱스 지원, 오토 샤딩 지원 같은 고유한 특징을 가진다. 대량의 데이터를 빠르게 처리하기 위해 메모리에 임시 저장하고 응답하는 등의 방법을 사용한다. 동적인 스케일 아웃을 지원하기도 하며, 가용성을 위하여 데이터 복제 등의 방법으로 관계형 데이터베이스가 제공하지 못하는 성능과 특징을 제공한다.

 

저장 방식에 따른 NoSQL 분류

Key-Value Model, Document Model, Column Model, Graph Model로 분류할 수 있다.

1. Key-Value Model

가장 기본적인 형태의 NoSQL 이며 키 하나로 데이터 하나를 저장하고 조회할 수 있는 단일 키-값 구조를 갖는다. 단순한 저장구조로 인하여 복잡한 조회 연산을 지원하지 않는다. 또한 고속 읽기와 쓰기에 최적화된 경우가 많다. 사용자의 프로필 정보, 웹 서버 클러스터를 위한 세션 정보, 장바구니 정보, URL 단축 정보 저장 등에 사용한다. 하나의 서비스 요청에 다수의 데이터 조회 및 수정 연산이 발생하면 트랜잭션 처리가 불가능하여 데이터 정합성을 보장할 수 없다. ex) Redis

2. Document Model

키-값 모델을 개념적으로 확장한 구조로 하나의 키에 하나의 구조화된 문서를 저장하고 조회한다. 논리적인 데이터 저장과 조회 방법이 관계형 데이터베이스와 유사하다. 키는 문서에 대한 ID 로 표현된다. 또한 저장된 문서를 컬렉션으로 관리하며 문서 저장과 동시에 문서 ID 에 대한 인덱스를 생성한다. 문서 ID 에 대한 인덱스를 사용하여 O(1) 시간 안에 문서를 조회할 수 있다.

대부분의 문서 모델 NoSQL 은 B 트리 인덱스를 사용하여 2 차 인덱스를 생성한다. B 트리는 크기가 커지면 커질수록 새로운 데이터를 입력하거나 삭제할 때 성능이 떨어지게 된다. 그렇기 때문에 읽기와 쓰기의 비율이 7:3 정도일 때 가장 좋은 성능을 보인다. 중앙 집중식 로그 저장, 타임라인 저장, 통계 정보 저장 등에 사용된다. ex) MongoDB

3. Column Model

하나의 키에 여러 개의 컬럼 이름과 컬럼 값의 쌍으로 이루어진 데이터를 저장하고 조회한다. 모든 컬럼은 항상 타임 스탬프 값과 함께 저장된다.

구글의 빅테이블이 대표적인 예로 차후 컬럼형 NoSQL 은 빅테이블의 영향을 받았다. 이러한 이유로 Row key, Column Key, Column Family 같은 빅테이블 개념이 공통적으로 사용된다. 저장의 기본 단위는 컬럼으로 컬럼은 컬럼 이름과 컬럼 값, 타임스탬프로 구성된다. 이러한 컬럼들의 집합이 로우(Row)이며, 로우키(Row key)는 각 로우를 유일하게 식별하는 값이다. 이러한 로우들의 집합은 키 스페이스(Key Space)가 된다.

대부분의 컬럼 모델 NoSQL 은 쓰기와 읽기 중에 쓰기에 더 특화되어 있다. 데이터를 먼저 커밋로그와 메모리에 저장한 후 응답하기 때문에 빠른 응답속도를 제공한다. 그렇기 때문에 읽기 연산 대비 쓰기 연산이 많은 서비스나 빠른 시간 안에 대량의 데이터를 입력하고 조회하는 서비스를 구현할 때 가장 좋은 성능을 보인다. 채팅 내용 저장, 실시간 분석을 위한 데이터 저장소 등의 서비스 구현에 적합하다.

 

'CS' 카테고리의 다른 글

DevOps란?  (0) 2022.12.26
GitHub, GitLab의 차이점  (0) 2022.12.26
CS핵심이론(소프트웨어 공학, 프로그래밍, 빅데이터, 운영체제)  (0) 2022.12.12
MVC 패턴  (0) 2022.09.19
Web Architecture에 대해  (0) 2022.09.15
  • [ 식별/비식별 관계란?]
  • [ 인덱스(index)란? ]
  • [ DB 정규화 ]
  • [ 이상 현상이란? ]
  • [ 트랜잭션(Transaction)이란? ]
  • [ DB 락의 종류 ]
  • [ RDBMS와 NoSQL 차이 ]
  • [ 힌트(Hint)란? ]
  • [ 클러스터링 vs 리플리케이션 ]
  • [ 데이터베이스 튜닝과 방법 ]
  • [정규화 단계]
  • [반정규화(De-normalization, 비정규화)]
  • [트랜잭션과 Lock]
  • [교착상태]
  • [NoSQL]
'CS' 카테고리의 다른 글
  • DevOps란?
  • GitHub, GitLab의 차이점
  • CS핵심이론(소프트웨어 공학, 프로그래밍, 빅데이터, 운영체제)
  • MVC 패턴
땅지원
땅지원
신입 개발자의 우당탕탕 기술 블로그

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.