조인
- 관계를 맺는다
=> 부모의 식별자를 자식의 일반속성 || 식별자로 상속하는 것이다.
조인 (Join)
- 부모에게 상속받은 속성을 매핑키로 활용하여 데이터를 결합해 보는 것이다.
계층형 데이터 모델
- 관계는 자기 자신에게도 발생할 수 있다.
- 이 엔터티는 계층형 데이터 모델에 해당한다.
- 계층형 데이터 모델이란? 말 그대로 계층구조를 가진 데이터이다.
- MGR 속성은 각 사원 관리자의 사원번호를 의미한다.
- 내가 다니는 회사로 생각해보겠다.
- 나는 사원이고 소속된 팀이 있다. 나의 관리자는 팀장님이다. 우리 팀은 센터에 소속되어 있다. 팀장님의 관리자는 센터장님이시다. 각 사원들의 관리자를 찾기 위해선? 이 EMP 에 대해 셀프 조인 (Self-Join) 을 해야 관리자의 데이터를 가져올 수 있는 것이다.
- 속성명만 다를뿐 MGR 또한 사원번호다. 이를 매핑키로 활용할 수 있는 것이다.
- 즉 계층형 데이터 모델은 데이터 간의 계층이 존재할 때 발생하는 모델이다.
상호배타적 관계
- 위의 모델은 개인, 법인고객이 존재하는 모델에서 주문과의 상호배타적 관계를 표현하고 있다.
- 주문 엔터티는 개인과 법인 고객 중 하나만 상속될 수 있다.
- [고객구분코드]를 통해 개인인지 법인인지를 구분할 수 있다.
모델이 표현하는 트랜잭션의 이해
트랜잭션
- 트랜잭션은 데이터베이스의 논리적 연산단위다.
- ex) 계좌이체
1. 돈을 보내는 사람의 계좌에서 이체금액을 차감
2. 돈을 받는 사람의 계좌에 이체금액 가산 - 데이터 정합성을 위해 위의 과정을 하나의 업무단위로 묶어서 처리해야 하고, 전부 실행되던가 전부 최소되든지 해야하한다.
- 이러한 하나의 업무 단위로 묶어 처리하는 업무단위를 트랜잭션이라고 한다.
모델에도 트랜잭션이 발생할 수 있다는 것은 무엇일까?
- 고객이 상품을 주문하면, 주문이 발생하고, 하나의 주문은 여러개의 상품을 구매할 수 있다.
- 그렇다면, 주문과 주문 상세의 데이터는 함께 발생되는지? 독립적으로 발생되는지? 를 생각해 보아야한다.
- IE 표기법에서 O가 없는 경우는 필수적인(Mandatory) 관계인 경우다. 바커표기법에선 실선으로 나타난다.
- 즉, 주문이 발생하면 주문상세 데이터도 함께 발생한다는 의미이다.
- 그렇다면 하나의 트랜잭션으로 묶여야 한다는 것이고, 커밋의 단위를 하나로 묶어햐 한다.
코드의 재사용성을 위해, 하나로 처리해야 하는 트랜잭션을 낱개로 뜯어내는 경우들이 있다.
주문과 주문상세의 INSERT문은 따로 개발되어서는 안 되는 것이다.
만약, 각각 개발되었다면?
- 주문 도중 배터리 방전
- 앱을 실수로 종료
- 장애 발생
과 같은 문제가 생긴다면, 주문과 주문상세에 잘못된 데이터가 발생할 수 있다.
모델에서 표현하는 트랜잭션은 어차피 따로 수행될일 자체가 없어 재사용성의 이점도 얻을 수 없다고 봐야한다.
- 모델이 표현하는 트랜잭션은 태생 자체가 함께 발생하는 데이터이므로, 재사용성의 이점이 없으니
'반드시' 하나의 트랜잭션으로 처리해야한다. - 그렇지 않을 경우 데이터 정합성 문제, 데이터 품질 문제가 발생할 수 있다.
Null 속성의 이해
IE 표기법에선 NULL 허용 여부를 알 수 없지만, 바커 표기법에서 O 표현은 NULL 허용 속성임을 의미한다.
Null 값의 연산은 언제나 Null 이다.
- NULL은 공백 또는 숫자 0과는 전혀 다른 의미한다.
- 아직 정의되지 않은 '미지의 값' 또는 현재 데이터를 입력하지 못하는 경우를 의미한다.
=> '존재하지 않음' 을 의미한다. - 그래서 NULL 값으로 연산을 진행하면 무조건 NULL이 결과로 반환된다.
- 그러한 결과를 원하는 것이 아니라면, IS NULL / IS NOT NULL / NVL() 과 같은 연산을 해야한다.
집계함수는 NULL 값을 제외하고 처리한다.
- SUM(), AVG()과 같은 집계함수를 사용할 때, NULL 값은 제외하고 처리된다.
- 만약 데이터가 모두 NULL 이라면? 결과도 NULL 이 나온다.
- NULL을 허용할 경우 이러한 부분들을 모두 고려해야한다.
- 그렇지 않다면 관리비용이 증가할 수 있다.
본질식별자 vs. 인조식별자
- 본질식별자 : 업무에 의해 만들어진 식별자
- 인조식별자 : 업무적으로 만들어지지 않은, 본질식별자가 복잡한 구성을 갖고 있어 인위적으로 만든 식별자
인조식별자 남용의 부작용
- p.113
1. 중복 데이터로 인한 품질문제
- 외부 식별자를 사용하면, 중복 데이터를 막을 수 없다.
- 기본키의 제약을 활용한다면, 중복 데이터를 원천차단할 수 있지만, 기본키를 인위적으로 생성한 속성으로 정의했기 때문이다.
주문상세번호 |
주문번호(FK) 상품번호 상품명 배송지 |
- 이러한 엔터티가 존재할 때, 주문 상세번호에 SEQUENCE를 사용해 값이 들어간다고 생각해보자.
- 한 주문에 대해 여러 번의 INSERT가 발생해도 막을 수 없다.
- 그러므로 최대한 본질 식별자를 지향해야한다.
2. 불필요한 인덱스 생성
- 본질식별자로 구성하면, PK 인덱스를 활용할 수 있다.
- 그러나 인조식별자로 구성한다면, 인ㄷ넥스를 추가로 생성해주어야 한다.
- 추가로 생성한 인덱스는 용량과 DML 성능에 영향을 줄 수 있음을 염두에 두어야 한다.
==> 인조식별자를 무조건 사용하지 말라는 것이 아닌, 장단점을 잘 따져보고 사용해야한다는 것이다.
'학교 > SQLD' 카테고리의 다른 글
[SQLD] 2.2.1~3 SQL 활용 (0) | 2024.12.23 |
---|---|
[SQLD] 2.1 SQL 기본 (1) | 2024.12.19 |
[SQLD] 1.2.1 정규화 (3) | 2024.12.18 |
[SQLD] 1.1.4. 관계 / 1.1.5. 식별자 (0) | 2022.03.09 |
[SQLD] 1.1.2. 엔터티 / 1.1.3. 속성 (0) | 2022.01.10 |