ERD에 관계선이 없다면?


안타깝게도 일부 개발 현장에는 ERD 자체가 없거나 ERD가 있어도 관계선이 그려지지 않은 경우가 많다. 데이터를 제대로 활용하려면 ERD 부터 제대로 체계를 갖고 관리할 필요가 있다. 어쨋든 ERD는 있으나 관계선이 없다면, 한 테이블의 PK 컬럼이 다른 테이블에서 어떻게 사용되는지 관찰해 조인 컬럼을 유추해야 한다.

아래 ERD는 가상의 넷플릭스 데이터베이스를 설계해 본 것이다. ERD를 보고 조인 가능한 관계들을 찾아보자. 빨간색은 단독 컬럼으로 PK가 만들어진 경우, 파란색은 두 개 이상의 컬럼이 PK를 구성한 경우다.

Untitled

이와 같은 추측은 경우에 따라 틀릴 수 있다. ERD에 관계선도 없고 업무에 대한 지식도 부족한 상태에서 100% 정확하게 관계를 파악하는 것은 불가능하다. 다만, 관계선과 업무 지식이 없는 상황에서는 최선의 방법일 수 있으면 이 방법을 시작으로 테이블 간의 관계를 하나씩 파악해 나가면 된다.

ERD 조차 없다면?


가끔 “ERD가 없는데 어떻게 하면 좋을까요?” 라는 질문을 받는다. 이때 한결같은 대답은 “직접 그려 보세요. 생각보다 어렵지 않습니다.” 이다. 개인차에 따라 힘들수도 있으며, 그리기에 부담될만큼 너무 많은 테이블이 있을 수도 있다. 그렇다면 중요 테이블 몇 개만 우선 그려보기 바란다. 테이블 간의 관계 파악도 어렵다면, PK만이라도 그려보기 바란다. ERD를 만들어가다 보면 생각보다 쉽게 테이블 간의 조인 컬럼을 찾아 낼 수 있다.

조인 조건에는 어느 한쪽 테이블의 PK가 참여


앞에서 “일반적으로 조인은 관계가 있는 테이블 간에, 관계 컬럼(PK/FK)을 통해 이루어진다. “라고 설명했다. 이 말은 두 테이블이 조인할 때, **“조인 조건에는 어느 한쪽 테이블의 PK가 반드시 참여”**한다는 뜻이기도 하다. STARTDB의 테이블 간 조인 SQL을 간단하게 살펴보자. 조인 조건에 사용되는 컬럼이 어느 한쪽의 PK라는 것을 알 수 있다.

-- [SQL-7-4-1]
-- Shop의 PK인 ShopId가 조인 조건으로 사용
-- Ord에서 ShopId는 FK(Foreing Key)
SELECT  T1.* ,T2.*
FROM    startdb.Shop T1 
        INNER JOIN startdb.Ord T2
           ON (T1.ShopId = T2.ShopId)
LIMIT 10; 

-- [SQL-7-4-2]
-- Member의 PK인 MemberId가 조인 조건으로 사용
-- Ord에서 MemberId는 FK
SELECT  T1.* ,T2.*
FROM    startdb.Member T1 
        INNER JOIN startdb.Ord T2
           ON (T1.MemberId = T2.MemberId)
LIMIT 10;

-- [SQL-7-4-3]
-- Ord의 PK인 OrdNo가 조인 조건으로 사용
-- OrdDet에서 OrdNo는 FK이면서 PK(OrdNo,OrdDetNo)의 일부
SELECT  T1.* ,T2.*
FROM    startdb.Ord T1 
        INNER JOIN startdb.OrdDet T2
           ON (T1.OrdNo = T2.OrdNo)
LIMIT 10;

-- [SQL-7-4-4]
-- Item의 PK인 ItemId가 조인 조건으로 사용
-- OrdDet에서 ItemId는 FK
SELECT  T1.* ,T2.*
FROM    startdb.OrdDet T1 
        INNER JOIN startdb.Item T2
           ON (T1.ItemId = T2.ItemId)
LIMIT 10;