ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Database] 데이터 정리하기 (1:N)
    카테고리 없음 2020. 3. 22. 21:21

    by Hajime Kasai

     

    최근에 본 영화들을 정리해보기로 했다. 어떤 기준으로 정리해해야 좋을까?

    일단 제일 중요한 정보는 영화 제목이다. 영화 제목만으로 정리하는 것은 조금 심심하니까 영화를 만든 감독 이름도 함께 정리해보았다. 이를 표로 나타내면 아래와 같다. 

    1. full_table
    id(PK) movie director
    1 기생충 봉준호
    2 아메리칸 허슬 데이비드 러셀
    3 괴물 봉준호
    4 어라이벌 드니 빌뇌브
    5 옥자 봉준호
    6 라라랜드 데미언 셔젤
    7 조조 래빗 타이카 와이티티
    8 실버라이닝 플레이북 데이비드 러셀
    9 위플래쉬 데미언 셔젤
    10 문라이트 베리 젠킨스

     

    나쁘지 않다. 그런데 좀 비효율적이라는 생각이 든다. 이유를 생각해보니 director 컬럼에 들어가는 내용이 중복이 되고 있음을 알 수 있다. 조금 더 나은 방식은 없을까?

     

    * 1 : N

    테이블을 잘 정리하기 위해서는 요소 간의 관계를 정리하는 것이 중요하다. '영화'와 '감독' 간의 관계를 생각해보자. 한 감독은 여러 개의 영화를 찍을 수 있다. 하지만 한 영화는 하나의 감독만을 가질 수 있다(공동감독은 없다고 전제한다). 말하자면 1대 N 관계가 성립되는 것이다. 이 경우, N을 기준으로 테이블을 만들어볼 수 있다. (*물론 1을 기준으로 만들 수도 있지만, 대개 검색 효율이 떨어지는 문제가 있다)

    위 표에서는 '감독' 이 중복 요소가 되므로 감독 테이블을 아래와 같이 별도로 만들어 각 감독별로 아이디를 부여했다. 

    director_table
    director_id(PK) director
    1 봉준호
    2 타이카 와이티티
    3 데미언 셔젤
    4 데이비드 러셀
    5 드니 빌뇌브
    6 베리 젠킨스

    각 감독은 고유의 아이디(director_id)를 가지게 된다. 봉준호는 1번, 타이카 와이티티는 2번 같은 식이다. 이를 기존 테이블의 '감독' 부분을 감독 아이디(director_id)로 대체하면 아래와 같다. 

    1. full_table_2
    id(PK) movie director_id (FK)
    1 기생충 1
    2 아메리칸 허슬 4
    3 괴물 1
    4 어라이벌 5
    5 옥자 1
    6 라라랜드 3
    7 조조 래빗 2
    8 실버라이닝 플레이북 4
    9 위플래쉬 3
    10 문라이트 6

     

    첫 테이블과 달리 감독 정보가 문자열이 아닌 'director_id' 라는 외래키(FK)로 대체되었다. 정보를 하나하나 입력하지 않고 director_table의 정보를 참조해오는 방식이다. 문자가 사라져 일단 깔끔해 보이긴 한다. 자료를 이러한 방식으로 저장되었을 때 얻을 수 있는 장점이 무엇일까?

    예를 들어 <아메리칸 허슬>, <실버라이닝 플레이북>의 감독명이 '데이비드 러셀'이 아니라 '데이비드 O. 러셀' 이라는 것을 뒤늦게 깨닫고 수정하는 상황을 생각해보자.

    기존의 표라면 director 컬럼 내에서 '데이비드 러셀' 이라는 데이터를 하나하나 찾아 바꿔야 했을 것이다. 하지만, 위와 같이 외래키를 이용하는 방식을 사용했다면, director_table에서 한 번만 감독명을 수정해주면 나머지는 바꿀 필요가 없어진다. full_table_2는 director_table의 수정된 정보를 참조하고 있기 때문이다. 

    데이터 사이의 관계를 파악해서 중복되는 부분을 별도의 표로 관리해줌으로서 효율적인 데이터 관리가 가능해졌음을 알 수 있다.

    댓글