들어가기에 앞서
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 예시. 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에선 전자를 많이 선택한다.
FD 관계를 ER로 나타냄
마무리하며
DB 디자인 패턴 - FD를 알아보았다. 다음 글에선 좋은, 나쁜 FD를 구분하는 방법과, FD를 찾는 방식에 대해 알아보자.