우리가 하나의 테이블을 만들기 위해 아래와 같은 조인문을 쓴다고 생각해보자.
(딱봐도 복잡하다.)
DROP TABLE IF EXISTS adhoc.hyunwoo_session_summary;
CREATE TABLE adhoc.hyunwoo_session_summary AS
SELECT
LEFT(B.ts, 7) AS month,
A.channel as channel,
COUNT(DISTINCT A.userid) AS uniqueUsers,
COUNT(DISTINCT CASE WHEN C.amount>0 THEN C.sessionid END) AS paidUsers,
ROUND(paidUsers*100.0/NULLIF(uniqueUsers, 0), 2) AS conversionRate,
SUM(C.amount) AS grossRevenue,
SUM(CASE WHEN C.refunded=True then C.amount ELSE 0 END) AS netRevenue
FROM raw_data.user_session_channel A
LEFT JOIN raw_data.session_timestamp B ON A.sessionid = B.sessionid
LEFT JOIN raw_data.session_transaction C ON A.sessionid = C.sessionid
GROUP BY 1, 2
ORDER BY 1, 2;
그냥 생각없이 쿼리를 짠다고 생각하면, 위와 같은 쿼리를 짤 수 있을까?
아니 불가능하다. 하나의 테이블을 만들 때는 우리가 살리고 싶은 피쳐들이 각기 존재한다.
이럴 때 테이블의 성격을 고려하지 않으면 우리가 원하는 피쳐가 담긴 테이블을 만들 수 없다.
이럴 때 테이블의 속성을 먼저 고려하는 것이 중요하다.
완전한 1:1 대응이 되는 테이블과 한쪽이 크기가 더작아 한쪽의 부분집합이 되는 1:1 테이블
한쪽의 크기가 월등히 커서 테이블 증폭 문제가 발생
1:1로 바꾸거나 1:다수로 바꿔줘야 함