1) 참조 무결성이란
2) 외래키 역할
3) On Delete / Update
추가적으로 check 제약 조건 : 특정 컬럼의 입력 가능한 값의 범위를 지정
```
discount_rate Decimal(5,2) Defaulr 0.00 check(discount_rate Between 0.00 and 100.00)
```
Data 검증 실무 이야기
만약 ㄱ.주문 -> ㄴ. 재고수량 -> ㄷ. 처리. 이 세 단계는 서로 떨어질 수 없는 하나의 작업
- 트랜잭션이 없을 때 문제점
상황 1.
- ㄱ. 주문 생성 O
- ㄴ. 재고 수량 감소 X (에러 발생)
- ㄷ. 처리 X
결과:
- 주문은 있는데 재고는 줄지 않음
- 실제로는 팔리지 않았는데 주문만 존재하는 데이터 불일치
상황 2.
- ㄱ. 주문 생성 O
- ㄴ. 재고 수량 감소 O
- ㄷ. 처리 X (서버 다운)
결과:
- 재고는 줄었는데 주문은 처리되지 않음
- 재고 유령 감소 발생
그래서!
BEGIN(= start) TRANSACTION
ㄱ. 주문 생성
ㄴ. 재고 수량 감소
ㄷ. 주문 처리
COMMIT
ACID 속성
트랜잭션 격리 수준
Q. 완벽한 격리는 항상 좋은 가?
A. 완벽한 고립은 마치 한줄로 서서 코드가 실행되듯이 안정성은 잡을 순 있어도,
수천, 수만명이 이용시 거북이처럼 천천히 실행돼. 사용하지 않을 것이다.
그래서 마주하는 것이 "정합성" vs "동시성 / 성능"의 Trade-Off이다.
1) 격리성 수준이 낮을 때
ㄱ. 더티리드 : 한 트랜잭션이 commit되지 않은 수정중인 Data 읽기
ㄴ. 반복 불가능 읽기 : 한 트랜잭션에서 Select가 여러 번 실행. 그 사이 다른 트랜잭션이 value 수정 후 commit. 그래서 쿼리 결과가 달라짐.
ㄷ. 유령 읽기 : 한 트랜잭션 내에서 특정 범위의 Data를 두 번 읽었는 데, 첫 번째 조회에서 없던 Data가 2번째 조회에서 읽히는 것.
1) 개념적 단계(큰 밑그림)
Q. 우리가 다룰 엔터티는 무엇인가?
Q. 그 엔터티의 관계는?
Q. 더 나아가 ERD는?
2) 논리적 단계 (설계도, RDBMS에 맞게 이론적으로)
Q. 개념 모델의 각 요소들은 어떤 Table 구조로 표현할까?
Q. Data 중복을 막기 위해 어떤 정규화 규칙을 사용할까?
3) 물리적 설계 (재료들)
Q. 각 컬럼에 어떤 타입을 쓸까?
Q. 어떤 컬럼엔 어떤 인덱스를 사용하지?
1) 요구사항 분석 및 핵심 요소 식별
요구사항 속 우리가 만들어야 할 Data의 뼈대를 찾자
어떻게?
명사 -> 엔터티 ex) 회원, 아이디...
동사 -> 관계 ex) 가입하다, 수정하다...
그리고 행위(동사) vs 행위의 기록(명사)를 구분하자
2) 엔터티 분류( 기준 : 존재 형태, 생성 시점 & 역할, 존재 종속성)
실무 전략 1. 인덱스 2. Data파티셔닝 3. 아카이빙
ㄴ. 역할 및 발생 시점 : Data의 발행 순서 및 의존성을 명확히 -> 모델의 논리적 흐름을 체계화
ㄷ. 존재 종속성 : 다른 엔터티와의 관계 속 자신의 존재 여부