데이터베이스 이상 (Anomaly)
관계형 데이터베이스의 잘못된 설계에서 발생하는 데이터 중복으로 인해 발생하는 부작용을 이상(Anomaly)이라 한다.
이상 현상의 종류를 회원의 정보를 저장하는 예시 테이블을 보며 알아보자.
ID | NAME | ORDER_ID | SHIPMENT_ID | MEMBERSHIP |
0001 | Lee | 18254382 | 46257892 | True |
0002 | Kim | 18254383 | 37282462 | False |
0003 | Park | 18254384 | 24235423 | False |
0003 | Park | 18254385 | 68872151 | False |
0003 | Park | 18254386 | 68753212 | False |
0004 | Choi | 18254387 | 78951231 | True |
위 테이블의 기본 키는 ID + ORDER_ID 이다.
삽입 이상 (Insert)
만약 아직 아무 주문도 하지 않은 회원을 테이블에 추가하려 할 때, 삽입 이상이 발생한다.
위 테이블의 기본 키는 ID와 ORDER_ID의 복합 키이므로, ORDER_ID가 NULL이 될 수 없기 때문이다.
이런 회원을 추가하기 위해서는 미주문을 의미하는 ORDER_ID를 따로 지정하는 등의 비효율이 발생한다.
갱신 이상 (Update)
배송 무료 서비스를 받기 위해 ID = 0003인 Park 회원이 멤버쉽에 가입했다.
이제 Park 회원의 MEMBERSHIP 데이터를 True로 바꿔줘야 하는데, 총 3개의 행을 수정해야 한다.
만약 0003번 회원의 모든 행을 변경해주지 않는다면 데이터 간의 불일치가 발생하게 된다. 이를 갱신 이상이라 한다.
삭제 이상 (Delete)
ID = 0002인 Kim 회원이 현재 주문 18254383번을 취소했다.
주문 취소를 반영하기 위해 해당 행을 삭제한다면, 위 테이블은 더 이상 Kim에 대한 정보를 담지 못한다.
이처럼 튜플을 삭제할 때 데이터 손실이 발생하는 경우를 삭제 이상이라 한다.
함수적 종속성 (Functional Dependency)
함수적 종속성은 일반적으로 다음과 같이 표현한다.
X → Y
X를 결정자, Y를 종속자라 하며, 위 관계에서 Y는 X에 함수적 종속되었다고 한다. 반대로, X가 Y를 결정한다고 한다.
PRODUCT_ID | PRODUCT_NAME | COMPANY | CATEGORY | PRICE |
4453215 | KBD-142 | ABC.Corp | KEYBOARD | 150000 |
5532482 | MS-1523 | ABC.Corp | MOUSE | 30000 |
7865428 | WKBD-51 | DEF.Corp | KEYBOARD | 200000 |
2211542 | SPK-35 | DEF.Corp | SPEAKER | 30000 |
- 우리는 제품의 ID(PRODUCT_ID)를 알면, 해당 제품의 이름, 제조사, 제품유형, 가격 모두를 알 수 있다. 즉, 제품의 ID가 나머지 요소를 결정한다. (PRODUCT_ID가 기본 키이기 때문에 당연히 성립)
PRODUCT_ID → (PRODUCT_NAME, COMPANY, CATEGORY, PRICE)
- 위는 곧, PRODUCT_NAME ~ PRICE는 PRODUCT_ID에 종속된다는 것과 같은 말이다.
- 동일 회사에서 동일한 모델명을 가진 다른 제품이 존재하지 않는다고 가정하자. 이 경우에는 제품명과 제조사를 안다면 반드시 그 제품의 유형과 가격을 알 수 있다. (PRODUCT_ID도 알 수 있지만, 여기서는 제외한다.)
(PRODUCT_NAME, COMPANY) → (CATEGORY, PRICE)
주의할 점은 함수적 종속을 값이 아닌 개념으로 판단해야 한다는 것이다.
예를 들어, 위 테이블에는 PRICE = 150000인 제품이 하나밖에 없다. 그렇다고 PRICE가 PRODUCT_NAME을 결정한다고 말할 수 있을까? 제품의 가격을 안다고 해서 그 제품의 이름을 알 수 있을까?
그렇지 않다. 가격이 150000인 제품은 언제든 추가될 수 있기 때문이다. 이처럼, 값이 아닌 개념적으로 함수적 종속성을 판단해야 한다.
'데이터베이스' 카테고리의 다른 글
[데이터베이스] 정규화 : 1NF, 2NF, 3NF, BCNF (1) | 2021.03.25 |
---|---|
[데이터베이스] 트랜잭션 (Transaction) (0) | 2021.03.19 |