트랜잭션 격리 수준에 따라 SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED로 나눌 수 있습니다.
1. SERIALIZABLE
가장 높은 수준의 격리로 트랜잭션을 순차적으로 진행시키는 것을 말합니다.
- 장점: Dirty Read, Non-Repeatable Read, Phantom Read를 모두 방지합니다.
- 단점: 교착 상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준입니다.
2. REPEATABLE_READ
트랜잭션이 시작된 후 읽은 데이터는 다른 트랜잭션이 변경할 수 없습니다. 트랜잭션 중에 같은 데이터를 여러 번 읽어도 항상 같은 값을 얻습니다. 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않습니다.
- 장점: Dirty Read, Non-Repeatable Read는 방지합니다.
- 단점: 새로운 데이터 삽입/삭제로 인해 Phantom Read가 발생할 수 있습니다.
3. READ_COMMITTED
트랜잭션이 커밋된 데이터만 읽을 수 있습니다. 다른 트랜잭션이 커밋하지 않은 변경 사항은 보이지 않습니다.
가장 많이 사용되는 격리 수준이며 PostgreSQL, SQL Server, Oracle에서 기본값으로 설정되어 있습니다.
- 장점: 커밋되지 않은 데이터는 읽을 수 없으므로 Dirty Read는 방지합니다.
- 단점: 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있습니다. 따라서 트랜잭션이 같은 행을 다시 읽을 때 다른 내용이 반환될 수 있습니다. 따라서, Non-Repeatable Read, Phantom Read가 발생할 수 있습니다.
4. READ_UNCOMMITTED
가장 낮은 격리 수준이며 다른 트랜잭션에서 커밋되지 않은 데이터도 읽을 수 있습니다.
- 장점: 가장 빠릅니다.
- 단점: 데이터의 신뢰성이 떨어집니다.
격리 수준
Dirty Read
Non-Repeatable Read
Phantom Read
성능
SERIALIZABLE
불가능
불가능
불가능
낮음
REPEATABLE_READ
불가능
불가능
가능
중간
READ_COMMITTED
불가능
가능
가능
중간
READ_UNCOMMITTED
가능
가능
가능
높음
2-4. 지속성 Durability
트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 반영되어야 하는 것을 의미합니다. 시스템 장애가 발생하더라도 트랜잭션의 결과는 유지되어야 합니다. 지속성을 보장하기 위해 체크섬, 저널링, 롤백 등의 기능을 사용합니다.
체크섬(Checksum)
: 데이터의 무결성을 확인하기 위한 간단한 방법입니다. 데이터의 내용을 기반으로 생성된 작은 숫자 값(체크섬)을 사용하여 데이터가 손상되거나 변조되지 않았는지 확인합니다.
- 작동방식
1. 데이터가 저장될 때, 데이터의 내용을 기반으로 체크섬 값이 계산되어 함께 저장됩니다.
2. 데이터가 읽힐 때, 다시 체크섬을 계산하여 저장된 체크섬 값과 비교합니다. 두 값이 일치하면 데이터가 무결하다고 판단합니다. 일치하지 않으면 데이터가 손상되었음을 뜻합니다.
저널링(Journaling)
트랜잭션의 변경 사항을 데이터베이스에 반영하기 전에 별도의 저널(로그) 파일에 기록하는 기법으로 시스템 장애 시 데이터베이스를 복구할 수 있게 합니다.
3. 무결성 Integrity
무결성은 데이터의 정확성, 일관성, 유효성을 유지하는 것을 의미합니다. 데이터베이스는 현실 세계를 반영해야 하므로 데이터베이스 내 데이터는 현실 세계의 규칙과 제약 조건을 준수해야 합니다. 이러한 규칙과 제약 조건을 데이터베이스에 적용하는 것을 무결성 제약 조건이라고 합니다.
정확성: 데이터베이스에 저장된 데이터가 현실 세계와 일치해야 합니다. 데이터는 오류나 누락 없이 정확하게 입력되고 유지되어야 합니다.
ex) 상품의 가격 정보가 잘못 입력되면 안됨
일관성: 데이터베이스 내의 데이터는 모순 없이 일관되게 유지되어야 합니다. 같은 정보를 나타내는 데이터는 모든 테이블에서 동일한 값을 가져야 합니다.
유효성: 데이터베이스에 저장된 데이터는 정해진 규칙이나 제약 조건을 만족해야 합니다.
ex) 숫자 형식의 필드에는 숫자값만 입력되어야 하고 필수 입력 필드에는 NULL 값이 허용되지 않아야 함
무결성은 개체 무결성, 참조 무결성, 고유 무결성, NULL 무결성 등이 있습니다.
1. 개체 무결성 (Entity Integrity)
: 기본키로 선택된 필드는 빈 값을 허용하지 않습니다.
2. 참조 무결성 (Referential Integrity)
: 외래키(foreign key)는 참조하는 테이블의 기본키 값과 일치하거나 NULL값을 가져야 합니다. 참조되는 테이블의 데이터가 없을 수도 있기 때문에 NULL값을 가질 수 있습니다.
3. 고유 무결성 (Unique Integrity)
: 특정 컬럼 또는 컬럼 조합에 중복된 값이 없어야 합니다. 기본키는 고유 무결성을 만족해야 합니다. 예를 들어 주민등록번호, 운전면허증 번호, 이메일 주소 등은 테이블 내에서 고유해야 합니다.
ERD(Entity Relationship Diagram)는 데이터베이스의 구조를 시각적으로 표현하는 다이어그램입니다.
데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, Relation 간의 관계들을 정의한 것입니다.
ERD는 시스템 요구 상황을 기반으로 작성되며 이 ERD를 기반으로 데이터베이스를 구축합니다.
https://velog.io/@kjhxxxx/DataBase-ERD%EB%9E%80
ERD는 Entity, Attribute, Relationship으로 이루어져 있습니다.
ERD를 작성할 때, 요구 사항을 분석하고 entity와 attribute를 정의하고 각 entity 간의 관계를 정의해야 합니다. 또한, 데이터 중복을 최소화하기 위해 정규화를 고려해야 합니다.
2. 정규화
정규화는 데이터 중복을 최소화하고 데이터의 일관성을 유지하기 위한 거치는 과정입니다. 릴레이션 간의 잘못된 종속 관계로 발생되는 문제를 해결하고, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정입니다.
정규화는 여러 단계로 구성되며, 각 단계는 특정 규칙을 만족해야 합니다.
정규화된 정도에 따라 제1 정규형(NF, Normal Form), 제2 정규형, 제3 정규형, 보이스/코드 정규형, 제4 정규형, 제5 정규형이 있습니다.
2-1. 제1 정규형(1NF)
테이블의 모든 속성은 원자값(더 이상 분해할 수 없는 값)을 가져야 합니다.
StudentID
Name
Course
1
홍길동
{물리, 화학}
2
이순신
{수학, 영어}
속성 값 중에서 한 개의 기본키에 대해 두 개 이상의 값을 가지는 반복 집합이 있습니다. 홍길동의 Course가 {물리, 화학}인데 이것을 제1 정규형에 따르면 이것을 나눠야 합니다.
StudentID
Name
Course
1
홍길동
물리
1
홍길동
화학
2
이순신
수학
2
이순신
영어
2-2. 제2 정규형(2NF)
제1 정규형을 만족하면서 기본 키가 아닌 속성은 기본 키에 종속되어야 합니다.(부분 종속성 제거) 쉽게 말해, 현재 테이블의 주제와 관련없는 속성을 다른 테이블로 빼는 작업입니다.
OrderID(주문번호)
CustomerID(고객ID)
Product(상품명)
Category(카테고리)
Price(가격)
1
A
책
도서
15,000원
2
A
티셔츠
의류
25,000원
3
B
컴퓨터 마우스
전자제품
10,000원
이 테이블의 기본 키는 주문번호 및 고객ID입니다.
제 2정규형을 적용하기 위해선 기본 키에 완전히 종속되지 않은 속성을 찾아야 합니다. 기본 키가 아닌 키에 종속이 되는 키를 찾는다는 의미와 같습니다.Product,Category,Price는 기본 키인 {OrderID,CustomerID}에 완전히 종속되지 않습니다. 따라서 테이블을 아래와 같이 분리합니다.
<주문 테이블>
OrderID
CustomerID
Product
1
A
책
2
A
티셔츠
3
B
컴퓨터 마우스
<상품 테이블>
Product
Category
Price
책
도서
15,000원
티셔츠
의류
25,000원
컴퓨터 마우스
전자제품
10,000원
2-3. 제3 정규형(3NF)
제2 정규형을 만족하면서 이행적 함수 종속성(transitive FD)이 없어야 합니다.
이행적 함수 종속이란 A->B, B->C 관계에서 A->C 관계가 성립하는데 이 때, C가 집합 A에 이행적으로 함수 종속이 되었다고 합니다.
다시 말해, 기본 키가 아닌 속성이 다른 키(기본키 제외)에 종속되면 안됩니다.
위 예시에서 이행적 종속 관계를 확인해봅시다.
카테고리 내 상품들은 가격이 같다고 가정하면 상품 테이블에서 Product -> Category, Category -> Price 관계가 있으므로 이행적 종속인 Product -> Price 관계가 성립합니다. 따라서 상품 테이블을 아래와 같이 분리할 수 있습니다.
<상품 테이블>
Product
Category
책
도서
티셔츠
의류
컴퓨터 마우스
전자제품
<카테고리 테이블>
Category
Price
도서
15,000원
의류
25,000원
전자제품
10,000원
2-4. 보이스/코드 정규형(Boyce-Codd Normal Form, BCNF)
보이스/코드 정규형은 제 3정규형을 만족하면서모든 결정자가 후보키여야 합니다.
결정자란 다른 속성의 값을 고유하게 결정하는 속성(또는 속성들의 집합)입니다. 간단히 말해, 결정자는 다른 속성에 대한 정보를 제공합니다.
학번(StudentID)
이름(Name)
전공(Major)
1
홍길동
경영학
2
이순신
컴퓨터공학
3
김유신
기계공학
이 테이블에서학번은이름과전공을 결정합니다. 다시 말해,학번을 알고 있다면 해당학생의이름과 전공을 알 수 있습니다. 따라서 이 테이블의 결정자는 학번입니다. 함수 종속성으로 표현하면 학번 -> 이름, 학번 -> 전공 관계가 성립합니다.
<프로젝트 할당 테이블>
직원ID
프로젝트ID
역할
프로젝트매니저
1
100
개발자
김매니저
2
101
디자이너
박매니저
3
100
테스트
김매니저
4
102
개발자
이매니저
여기서 기본 키는 (직원ID, 프로젝트ID)입니다. 이 테이블은 제 3정규형을 만족합니다. 모든 비기본 키 속성(역할,프로젝트매니저)이 기본 키 전체에 종속되기 때문입니다.
이 테이블을 보면 다음과 같은 함수 종속성이 있습니다.
1. (직원ID,프로젝트ID) ->역할,프로젝트매니저
2.프로젝트ID->프로젝트매니저
위의 두 번째 종속성을 보면프로젝트ID가프로젝트매니저를 결정하고 있습니다. 하지만프로젝트ID는 후보 키가 아닙니다.(기본 키 조합에 포함되어 있는 것이지 그 자체로 후보 키가 아님)
BCNF를 만족시키기 위해 테이블을 분리합니다.
<프로젝트 할당 테이블>
직원ID
프로젝트ID
역할
1
100
개발자
2
101
디자이너
3
100
테스트
4
102
개발자
<프로젝트 테이블>
프로젝트ID
프로젝트매니저
100
김매니저
101
박매니저
102
이매니저
이렇게 분리하면 모든 결정자(프로젝트 할당 테이블 - (직원ID, 프로젝트ID) / 프로젝트 테이블 - 프로젝트ID)가 후보 키가 되어 BCNF를 만족하게 됩니다.
정규형 과정을 거친다고 해도 성능이 무조건 좋아지는 것은 아닙니다. 경우에 따라 정규화 또는 비정규화 과정을 진행해야 합니다.
Ex) MySQL(DBMS)가 있고 그 위에 응용 프로그램에 속하는 Node.js나 php에서 해당 데이터베이스 안에 있는 데이터를 그집어내 해당 데이터 관련 로직을 구축할 수 있습니다.
2. 엔터티(Entity)
엔터티는 현실 세계에서 독립적으로 존재하며 고유하게 식별 가능한 객체나 개체를 의미합니다. 예를 들어, 학생, 책, 주문 등이 엔터티가 될 수 있습니다.
강한 Entity: 고유하게 식별할 수 있는 기본 키를 갖고 있으며 독립적으로 존재할 수 있는 entity Ex) 학생 entity는 학번을 기본 키로 가지며 다른 entity에 의존하지 않고 독립적으로 존재할 수 있습니다.
약한 Entity: 고유하게 식별할 수 있는 기본 키(Primary key)가 없고 다른 entity에 의존하여 식별하는 entity Ex1) 주문 항목 entity는 주문 entity에 의존하여 식별됩니다. 주문번호와 항목번호를 합쳐서 고유하게 식별될 수 있습니다. Ex2) 직원의 자녀 entity는 직원 entity에 의존하여 식별됩니다. 직원ID와 자녀의 이름을 합쳐서 고유하게 식별될 수 있습니다.
2. 속성(Attribute)
엔터티는 속성(Attribute)를 가집니다.속성은Entity의 특성이나 성질을 나타냅니다.
Ex) 학생이라는 Entity가 있을 때, 이름, 학번, 생년월일, 전공 등을 속성으로 가질 수 있습니다.
3. 도메인(Domain)
Domain은 속성이 가질 수 있는 값의 집합을 의미합니다.
Ex) 성별 속성이 있을 때, 이 속성이 가질 수 있는 값은 {남, 여} 집합이 됩니다.
4. 릴레이션(Relation)
Relation은 데이터베이스에서 정보를 구분하여 저장하는 기본 단위입니다. 쉽게 말해, 데이터를 표 형태로 표현한 것입니다.Entity에 관한 데이터를 데이터베이스는 relation 하나에 담아서 관리합니다.
Ex) 학생이라는 entity가 데이터베이스에서 관리할 때 아래와 같이 relation(표 형태)로 관리됩니다.