join

관계형 데이터베이스에서는 데이터의 중복을 피하기 위해 정규화를 진행하는데 다시 원하는 결과를 도출하기 위해서 여러 테이블을 조합할 필요가 있음. 이때 조인을 활용하여 관련 있는 컬럼을 기준으로 행을 합쳐주는 연산.

Innerjoin: 조인 조건을 만족하는 서로 연관된 내용만 반환

Outerjoin: 조인하는 여러 테이블에서 한쪽에는 데이터가 있고 한쪽에는 없는 경우 있는 쪽 테이블의 내용을 전부 출력

Crossjoin: 카디션 프로덕트를 한 결과로 두 테이블의 곱집합을 반환

selfjoin: 자기 자신과 조인


SQL (관계형 DB)

RDBMS에서 자료를 관리 및 처리하기 위해 설계된 언어.

데이터는 정해진 데이터 스키마에 따라 테이블에 저장되고, 관계를 통해 여러 테이블에 분산

+ 데이터의 중복이 없어 무결성을 보장한다.

- 데이터간 관계를 맺고 있어 많은 조인 연산이 필요함.

- 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없음.

- 데이터 저장방식으로 인해 수직적 확장만을 지원

관계를 맺고 있는 데이터가 자주 변경되거나, 명확한 스키마가 중요할 경우 사용

NOSQL (비관계형 DB)

관계형 데이터 베이스가 아닌 다른 형태의 데이터 저장 기술

종류: Document database, key value database, graph database

+ 스키마가 없어서 유연함.

+ 데이터 읽는 속도 빠름

+ 수직적 확장, 수평적 확장 모두 가능

- 조인하고 싶을때는 컬렉션을 통해 데이터를 복제 -> 중복 위험, 데이터 수정시 모든 컬렉션 수정

- 데이터 구조 결정을 미루게 될 수 있음

정확한 데이터 구조를 알 수 없거나 읽기는 자주하지만 데이터 변경은 자주 없는 경우

수평적 확장을 해야하는 경우(막대한 양의 데이터를 다루어야하는 경우)

수직적 확장: 단순히 데이터베이스 서버의 성능을 향상 (ex. CPU 업그레이드)
수평적 확장: 더많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨 (하나의 db에서만 작동하지만 여러 호스트에서 작동)

트랜잭션

데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위

트랜잭션의 범위를 최소화 (데이터베이스 커넥션 수는 제한 -> 커넥션을 소유하는 시간이 길어진다면 여유 커넥션 줄어듬 -> 기다려야함)

특징 (ACID)

원자성(Atomicity): 트랜잭션이 DB에 모두 반영이 되거나, 전혀 반영이 되지 않아야한다.

일관성(Consistency): 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야한다.

독립성(Isolation): 각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야한다.

지속성(Durability): 트랜잭션이 성공적으로 완료되면 결과는 영구적으로 반영되어야한다.

 

Commit: 하나의 트랜잭션이 성공적으로 끝났고, db가 일관성 있는 상태일 때 알려주기 위해 사용하는 연산

Rollback: 하나의 트랜잭션 처리가 비정상적으로 종료되어 원자성이 깨진경우 last consistent state로 rollback할 수 있음.

 

교착상태

두개 이상의 트랜잭션이 특정자원(테이블, 행)의 잠금을 획득한 채 다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태

교착상태의 빈도를 낮추려면

트랜잭션 자주 commit

정해진 순서로 테이블 접근

읽기 잠금 획득의 사용을 피한다.

테이블 단위의 잠금을 획득해 갱신을 직렬화 -> 한 테이블의 복수행을 복수 연결에서 순서없이 갱신하면 교착상태 발생하기 쉬움


트랜잭션 격리수준

특정 트랜잭션에서 다른 트랜잭션이 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것

독립적인 수행을 할 수 있도록 locking을 사용하는데 무조건 locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하면 db 성능 떨어짐 -> 효율적인 locking 방법이 필요함

동시성과 데이터 무결성은 반비례 관계이며, 레벨이 높을수록, 발생비용도 높다.

레벨 0: Read Uncommited

트랜잭션에서 처리중이거나, 아직 commit 되지 않은 데이터를 읽는 것을 허용

레벨 1: Read Commited

commit이 이루어진 트랜잭션만 조회 가능

레벨 2: Repeatable Read

트랜잭션이 시작되고 종료되기 전까지 한번 조회한 값은 계속 같은 값이 조회됨.

트랜잭션 영역에 해당하는 데이터에 대한 수정 불가능

레벨 3: Serializable

트랜잭션 영역에 해당하는 데이터에 대한 수정 및 입력 불가능

 

낮은 단계 Isolation Level을 활용할 때 발생하는 현상들

Dirty read (레벨 0)

트랜잭션 작업이 완료되지 않았는데도 데이터를 읽을 수 있도록 허용할 때 발생

non-repeatable read (레벨 0,1)

한 트랜잭션에서 같은 쿼리를 두번 수행할 때 그 사이에 다른 트랜잭션이 수정/삭제 하면서 일관성이 깨지는 현상

phantom read (레벨 0,1,2)

새로운 레코드 삽입을 허용하기 때문에 나타나는 현상

 

'개발 > CS' 카테고리의 다른 글

[면접 준비] 객체 지향  (0) 2021.04.23
[Java] JVM 구조  (0) 2020.07.24
[CS] 자료구조  (0) 2020.07.23
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기