데이터베이스 공부

2021. 7. 2. 12:11

SQL 명령어 종류

DDL

  • CREATE, DTOP, ALTER, TRUNCATE

DML

  • SELECT, INSERT, UPDATE, DELETE, CALL, ...

DCL

  • COMMIT, ROLLBACK, GRANT, REVOKE

 

키는 데이터베이스에 서 조건에 만족하는 튜플을 찾고나 순서대로 정렬할 때 다른 튜플들과 구별할 수 있는 유일한 기준이 되는 속성이다.

키의 종류

후보키

튜플을 유일하게 식별할 수 있는 속성들의 부분 집합

기본키

후보키 중에서 선택한 키

대체키

후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키

슈퍼키

유일하게 구분이 가능한 부분 집합이지만 최소성을 만족하지 않은 키

외래키

관계를 맺고 있는 키

데이터 무결성

무결성이란 결함이 없다는 특징으로, 데이터 무결성은 데이터베이스가 데이터를 결함 없는 상태로 유지하는 특성을 말한다. 그러한 결함 없는 데이터를 유지하기 위한 조건으로 무결성 제약조건을 지켜야 한다.

무결성 제약조건

개체 무결성 제약조건

기본키를 통한 데이터 각각을 하나의 개체로써 구분되어야 한다.

참조 무결성 제약조건

외래키는 참조할 수 없는 값을 가져야 한다.

도메인 무결성 제약조건

허용하는 데이터의 범위안에서만 값을 가져야 한다.

키 무결성 제약조건

릴레이션은 반드시 하나의 키 이상을 가져야 한다.

고유 무결성 제약조건

특정 속성 값에 대해 고유한 값을 가지도록 조건이 주어진 경우, 그 속성값은 모두 달라야 한다.

널(NULL) 무결성 제약조건

특정 속성 값에 대해 NULL을 허용하지 않는 경우, 그 속성값은 NULL을 가질수 없다.

인덱스

인덱스란 특정 데이터에 빠르게 접근하기 위해서 따로 관리하고 있는 데이터들의 위치 모음집이다.

인덱스에는 해쉬 인덱스, 트리 인덱스로 구분되어 지며 각각의 특성은 아래와 같다.

  장점 단점
해쉬인덱스 데이터에 접근할때 두번의 엑세스를 통해서 빠르게 접근이 가능하다. 범위 검색, 정렬 등의 기능을 구현하기 어렵다.
트리인덱스 범위 검색, 정렬 등의 기능을 쉽게 구현가능하다.  트리의 높이 만큼 엑세스가 증가된다.

트랜젝션

트랜젝션이란 데이터베이스의 상태를 변화하기 위한 논리적 작업 단위이다.

트랜젝션의 특성 - ACID

Atomicity(원자성)

트랜젝션의 모든 명령어에 대한 결과가 모두 적용되거나 혹은 모두 적용이 되지 않아야 한다는 것이다. 이는 장애가 발생하더라도 데이터의 무결성을 지킬수 있는 수단이 된다.

Consistency(일관성)

트랜잭션을 수행하더라도 데이터베이스의 무결성 제약조건이 변경되지 않는다는 것이다.

Isolation(고립성)

트랜젝션 사이에 간섭이 일어날 수 없다는 것이다.

Durability(지속성)

트랜젝션의 성공인 경우, 결과는 영구적으로 적용되어야 한다라는 것이다.

 

트랜젝션 고립수준

트랜젝션끼리의 일관성 없는 데이터를 얼마나 허용할 것인가에 대한 수준이다.

트랜젝션 수행중 다른 트랜젝션과의 데이터를 얼마큼 공유할 것인지에 대한 정도를 결정해둔 것.

고립 수준이 높을 수록 데이터의 일관성은 보장되며, 동시성은 낮아진다.

고립수준의 단계

  • 0 단계 - Read uncommited
    가장 낮은 단계의 고립 수준이다. 
    Dirty read, Non repeatable read, Phantom read 현상이 발생할 수 있다.
    트랜젝션 수행 중이거나 하직 commit되지 않은 데이터를 다른 트랜젝션에서 Read하는 것을 허용하는 단계
    SELECT문을 수행하는 경우 해당 데이터에 공유락을 걸지 않는 Level
    배타락은 갱신 손실문제로 걸어 줌
  • 1 단계 - Read commited
    Non repeatable read, Phantom read 현상이 발생할 수 있다.
    트랜잭션 수행이 완료되고 commit 된 데이터만 다른 트랜젝션에서 Read하도록 허용
    조회하는 데이터가 다른 트랜젝션에 의해 업데이트 되었다면 해당 트랜젝션이 COMMIT 될 때까지 대기
    다른 트랜젝션에서 Commit되지 않은 삽입은 조회 되지 않는다. 해당 트랜셕이 COMMIT 이후에 조회 됨
    자신의 데이터를 읽은 동안 공유락을 걸지만 트랜잭션이 끝나기 전에 해지 가능.
    공유락을 걸고 있는 순간에는 배타락을 걸 수 없음.
    다른 트랜젝션이 공유락, 배타락을 모두 걸지 않았을 경우에만 베타락 걸수있음.
  • 2 단계 - Repeatable read
    Phantom read 현상이 발생할 수 있다.
    트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 Read하도록 허용
    (Undo 영역의 백업된 데이터를 읽음)
    공유락을 걸고 트랜젝션 끝까지 유지.
  • 3 단계 - Serializable
    모든 이상현상이 발생하지 않는다.
    특정 트랜잭션에서 읽고 있는 데이터는 다른 트랜젝션에서 수정/삭제/삽입 모두 불가능하다.
    인덱스에 공유락을 설정하여 insert 문이 금지됨.

이상현상 종류

  • Dirty read
    커밋되지 않은 데이터 읽음.
    트랜젝션1의 commit 되지 않은 값을 트랜젝션2가 읽고 트랜젝션 1이 롤백 되면서 문제 발생. 
  • Non repeatable read
    Select를 두번 실행시 동일한 결과가 아닌 값이 달라지거나 삭제된 결과 조회.
    트랜젝션2가 읽고 트랜잭션 1이 2가 읽은 것에 대해서 수정/삭제를 했을 때 문제 발생.
  • Phantom read
    Select를 두번 실행시 기존의 값의 결과는 동일한데 없던 데이터가 추가된 결과 조회.
    트랜젝션2가 읽고 트랜잭션 1이 새로운 값을 추가 했을 때 문제 발생.

정규화

 

이상현상

 

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

 

1정규화

2정규화

3정규화

BCNF