Internet Home

Stay hungry, stay foolish

[DB] DB 디자인 이론에 대해 알아보자.

조회 :
Posted on By 건호 김

들어가기에 앞서

DB 디자인 이론에 대해 알아보자.

DB 디자인 이론

좋은 Database schema를 만들기 위해 DB 디자인 이론을 공부해야 한다. 이를 위해 함수 종속성 (Functional dependencies, FD)를 알아야 한다. 또한 FD를 사용해서 schema를 decomposition(분해)한다. 이러한 과정을 정규화(Normalization)이라고 한다. 정규화의 예시로는 BCNF, 3NF가 있다.

Bad Schema

Bad Schema는 중복되는 데이터를 저장하거나, 수정/삽입/삭제 시 일관성이 보장되지 않는 schema를 일컫는다.

예시로, 아래와 같은 테이블을 생각해보자. 제약 조건으로 A가 같으면 B,C가 같다고 가정한다.

A B C D
A1 B1 C1 D1
A1 B1 C1 D2
A1 B1 C1 D3
A1 B1 C1 D4

중복 데이터를 저장하는 테이블

위 테이블은 A1, B1, C1 tuple이 중복이 된 채로 존재한다. 이는 중복되는 데이터를 저장하고 있는 것이다. 이를 방지하기 위해서 아래와 같이 두 테이블로 나눌 수 있다.

A B C
A1 B1 C1
<테이블 1>    

A D
A1 D1
A1 D2
A1 D3
A1 D4
<테이블 2>  

비정상적인 데이터 수정

만약 첫 번째 row의 C column을 강제로 Cupdate로 고쳐버린다면 어떻게 될까? 기존의 데이터 일관성을 잃을 것이다.

비정상적인 데이터 삽입

만약 A1, B1, Cnew, Dany라는 데이터를 삽입하면 어떻게 될까? 이 또한 데이터 일관성을 잃을 것이다.

비정상적인 데이터 삭제

원래 테이블에서 마지막 row를 삭제하면 어떻게 될까? 더 이상 D4에 대한 정보를 알 수 없다.

이러한 문제점이 존재하기 때문에, 우리는 table을 잘 만들어야 한다. Bad schema가 존재하더라도, 최대한 문제점이 없게 Decomposition(분해)해야 한다. 성공적인 테이블 작성을 하기에 앞서, FD를 알아보자.

FD(Functional Dependencies)

함수 종속성이라고 한다. 이는 제약 조건을 나타내는데, A -> B와 같은 형태로 나타낼 수 있다. A와 B는 column의 set이다. 이는 여러 column에 대해서도 적용된다는 의미이다.

y=f(x)라는 함수에서, x를 독립변수, y를 종속변수라고 한다. FD도 이와 같다. A -> B라는 FD가 존재한다면 이는, 두 row에서 A가 같다면 B도 똑같을 것이다를 의미한다. 수식으로 나타내보면, 두 tuple t1, t2에 대해, t1[A] = t2[A]라면 t1[B] = t2[B]임을 의미한다는 것이다. A는 x(독립변수), B는 y(종속변수)에 대응한다. 즉, 다차원 함수를 관계 대수적으로 옮긴 것 뿐이다.

FD

FD 예시. A = { A1, .. Am}, B = {A1, .. An}라 하면 ti[A] = tj[A]라면 ti[B] = tj[B]이다.

FD는 상황에 따라 다르다. 단순히 table에 있는 row를 보고 FD를 판단할 수 없다. 왜냐하면 이는 Domain 지식이 필요한 영역이기 때문이다. 즉, 지금 당장은 유효하게 보이더라도, 실제로는 유효하지 않을 수 있다.

FD와 연관관계

A와 B라는 서로 다른 column set이 존재한다고 하자.

FD - 1:1 관계

이는 양방향 FD가 성립한다. 즉, A->B, B->A가 성립한다는 의미이다.

FD - 1:N 관계, N:1 관계

A:B가 1:N 관계라고 하면 A->B는 성립하지 않는다. 하지만 B->A는 성립한다. 왜냐하면 독립변수 B에 대해 A는 하나만 존재하기 때문이다.

FD - N:M 관계

N, M이 모두 2 이상이라고 하면 아무런 FD를 찾을 수 없다. 만약 여기서 FD를 찾고 싶으면, 중간 테이블을 두어 N:1, 1:M 문제로 바꾸고(새로운 단일 primary key + 외래 키 참조, 새로운 복합키를 만드는 방식), 중간 테이블과 원래 테이블과의 FD는 찾을 수 있다. 보통 JPA에선 전자를 많이 선택한다.

ER and FD

FD 관계를 ER로 나타냄

마무리하며

DB 디자인 패턴 - FD를 알아보았다. 다음 글에선 좋은, 나쁜 FD를 구분하는 방법과, FD를 찾는 방식에 대해 알아보자.