데이터 모델링 :: 4. 제 1 정규화 (중복 컬럼 해소)
4. 제 1 정규화 (중복 컬럼 해소)
앞 장에서 중복 데이터를 따로 빼서 테이블을 새로 정의한 후, 관계를 맺어주는 것을 해봤다.
그러나 제 1 정규화는 그게 끝이 아니라는 점.
테이블 안에 중복되는 컬럼들이 있으면 이놈들도 해결해줘야 한다.
1. 테이블에서 중복되는 컬럼들을 뽑아 별도의 테이블로 분리한다.
이 테이블에서는 사진1, 사진2, ... 사진5 컬럼들은 모두 사진을 담는 컬럼이다.
교실마다 같은 사진을 가지고 있는 것도 아닌데 왜 중복된다는 건지..? 라고 생각할 수 있겠으나.
어떤 교실은 사진을 2장 가지고 있고, 또 어떤 교실은 5장 모두, 또 어떤 교실은 아예 사진이 없을 수도 있다.
마지막의 경우에는 컬럼이 낭비되는 셈이다.
예를 들면.
교실번호 | 교실명 | 사진1 | 사진2 | 사진3 |
C01 | 강동원교실 |
| ||
C02 | 다니엘헤니교실 |
대략 이렇게 교실 테이블이 만들어질텐데, 강동원교실에는 사진이 1개밖에 없다.
때문에 사진2, 사진3 컬럼은 필요없는 컬럼인 셈이다.
이런 경우에도 중복되는 컬럼들만 빼서 별도의 테이블로 정의한다.
2. 새로 만든 테이블에서도 PK(주키)를 선정한다.
사진1 ~ 사진5 컬럼을 따로 빼서 '교실사진' 테이블을 만들었다.
그리고 '교실번호' 컬럼도 만들어줬는데, 얘는 해당 사진이 대체 어느 교실에 대한 사진인지 알아야하기 때문에 이렇게 만들어줬다.
이렇게 만들어주면 저기 위의 테이블이 이렇게 만들어질 것이다.
교실번호 | 사진 |
C01 |
|
C02 | |
C02 |
|
C02 |
|
이렇게 만들어진 테이블에는 더이상 낭비되는 컬럼따윈 없다.
그런데 각 행을 대표하는 식별자가 없어서 '교실사진번호' 라는 컬럼을 새로 만들어 주키로 선정해주었다.
(사진을 주키로 삼으면 안되는 이유는 저기저기 앞에 있는 포스트에서..)
교실사진번호 | 교실번호 | 사진 |
CP01 | C01 |
|
CP02 | C02 | |
CP03 | C02 |
|
CP04 | C02 |
|
3. 새로만든 테이블과 기존 테이블간에 부모-자식 관계를 맺어준다.
교실사진 테이블에 '교실번호' 라는 컬럼이 새로 생긴걸 확인할 수 있다.
이 컬럼이 두 테이블이 관계를 맺고 있다는 사실을 알려주는 외래키(FK)이다.
(두 테이블 간 관계를 맺는 자세한 내용은 앞의 포스트를 확인할 것!)