다대일 연관 관계, 외래키는 어디에 있어야할까?

    공부를 하다보니 다대일 연관관계를 가진 테이블이 있다면, 항상 FK가 '다'쪽 테이블에 있는 것이 당연하다는 이야기가 나왔다. 그런데 나는 그 부분을 이해를 잘 하지 못했다. 그래서 실제로 그림을 그리면서 한번 이해를 해봤다. 두 가지 경우로 나눠서 한번 생각을 해봤다.

    다대일 연관 관계, '다'쪽에 외래키가 있을 때


    위와 같은 관계가 있다고 가정했을 때, MEMBER와 TEAM을 JOIN하기 위해서 FK가 어떻게 동작할지를 생각해봤다. MEMBER는 항상 한 군데 팀에만 속할 수 있다. 따라서, 이 MEMBER와 연결된 TEAM을 가져오기 위해서는 MEMBER가 가지고 있는 TEAM_ID로 JOIN을 하면 정상적으로 MEMBER와 연결된 TEAM 테이블을 함께 가져올 수 있다. 

     

    다대일 연관관계, '일'쪽에 외래키가 있을 때


    반대로 '일'쪽에 외래키가 있을 때를 생각해봤다. TEAM에는 많은 MEMBER가 속할 수 있다. 따라서 TEAM에 포함된 MEMBER_ID는 1,2,3 등등이 있다고 가정할 수 있다. 이 때, TEAM에 속한 MEMBER TABLE의 정보를 불러오기 위해서는 MEBMER_ID가 1,2,3인 각각의 TEAM TABLE을 만들고, MEMBER TABLE과 JOIN하여 테이블을 불러와야한다. 

    그림으로 표시하면 이런 차이가 있을 것이다. 한번의 JOIN으로 불러오는게 정상적일텐데, TEAM에 있는 MEMBER 수만큼 테이블을 다시 만들고 JOIN 쿼리를 다시 쳐야할 것으로 예상된다. 즉, 성능이 느릴 것으로 판단된다.

     

    결론


    다대일 관계에서 외래키는 '다'쪽에서 관리해야한다.

    댓글

    Designed by JB FACTORY