1192 words
6 minutes
[DW]Fact Table
Overview
팩트 테이블의 기본 유형 및 팩트의 여러 형태에 대해 알아본다
01. 팩트 테이블의 3가지 기본 유형
1. Transaction Fact Tables
개별 비즈니스 이벤트나 거래를 기록하는 가장 일반적인 팩트 테이블 유형
- 각 행은 특정 시점의 개별 Transaction을 나타냄
- 시간에 따라 지속적으로 증가
- 가장 세밀한 그레인을 가짐
-- 소매 판매 거래 팩트 테이블CREATE TABLE fact_retail_sales ( date_key INT, time_key INT, product_key INT, customer_key INT, store_key INT, promotion_key INT, sales_quantity INT, sales_amount DECIMAL(10,2), cost_amount DECIMAL(10,2));# 거래 팩트 데이터 예시transaction_fact = { "date_key": 20240115, "product_key": 12345, "customer_key": 98765, "sales_quantity": 2, "sales_amount": 299.98, "cost_amount": 180.00}2. 주기적 스냅샷 팩트 테이블 (Periodic Snapshot Fact Tables)
정기적인 간격(일별, 주별, 월별)으로 비즈니스 상태를 스냅샷으로 기록
- 반가산적(Semi-additive) 팩트가 많음
- 시간 차원에 대해서는 더할 수 없음
- 잔고, 재고 등의 수준을 추적
-- 계좌 잔고 주기적 스냅샷CREATE TABLE fact_account_balance_monthly ( month_key INT, account_key INT, customer_key INT, beginning_balance DECIMAL(12,2), ending_balance DECIMAL(12,2), average_balance DECIMAL(12,2), transaction_count INT);# 재고 스냅샷 예시inventory_snapshot = { "date_key": 20240131, # 월말 기준 "product_key": 12345, "warehouse_key": 101, "quantity_on_hand": 150, "quantity_available": 120, "inventory_value": 18000.00}3. 누적 스냅샷 팩트 테이블 (Accumulating Snapshot Fact Tables)
명확한 시작과 끝이 있는 비즈니스 프로세스의 진행 상황을 추적하기 위한 테이블
- 프로세스의 여러 마일스톤을 하나의 행에 기록
- 시간이 지나면서 행이 업데이트됨
- 지연 시간(Lag Time) 분석에 유용
-- 주문 이행 프로세스 누적 스냅샷CREATE TABLE fact_order_fulfillment ( order_key INT, customer_key INT, product_key INT, order_date_key INT, requested_ship_date_key INT, actual_ship_date_key INT, delivery_date_key INT, order_amount DECIMAL(10,2), -- 지연 시간 계산 (일 단위) order_to_ship_lag_days INT, ship_to_delivery_lag_days INT);# 누적 스냅샷 업데이트 예시# 초기 주문 시order_snapshot_initial = { "order_key": 789012, "order_date_key": 20240115, "requested_ship_date_key": 20240117, "actual_ship_date_key": None, # 아직 발송 안됨 "delivery_date_key": None # 아직 배송 안됨}
# 발송 후 업데이트# UPDATE fact_order_fulfillment# SET actual_ship_date_key = 20240116,# order_to_ship_lag_days = 1# WHERE order_key = 789012;02. 팩트 테이블 설계 시 원칙
1. 팩트의 가산성(Additivity)
# 팩트 분류fact_additivity = { "additive": [ "sales_amount", # 모든 차원에 대해 더할 수 있음 "quantity_sold", "cost_amount" ], "semi_additive": [ "account_balance", # 시간에 대해서만 더할 수 없음 "inventory_level", "head_count" ], "non_additive": [ "unit_price", # 어떤 차원에도 더할 수 없음 "profit_margin_percent", "temperature" ]}2. 널 값 처리
-- 팩트 테이블에서 널 값 처리-- 측정값이 없는 경우 0으로, 적용되지 않는 경우 NULL로INSERT INTO fact_sales VALUES ( 20240115, -- date_key 12345, -- product_key 98765, -- customer_key 0, -- discount_amount (할인 없음) NULL, -- return_amount (반품 적용 안됨) 299.98 -- sales_amount);3. 텍스트 사실의 처리
-- 텍스트는 차원 테이블로, 팩트에는 키만 저장CREATE TABLE dim_sales_reason ( sales_reason_key INT PRIMARY KEY, sales_reason_desc VARCHAR(100));
-- 팩트 테이블에는 키만 참조ALTER TABLE fact_sales ADD COLUMN sales_reason_key INT;Concept
- 트랜잭션 팩트 테이블(Transaction Fact Table) : 개별 비즈니스 이벤트를 기록하는 가장 일반적인 팩트 테이블
- 주기적 스냅샷 팩트 테이블(Periodic Snapshot Fact Table) : 정기적 간격으로 비즈니스 상태를 기록하는 팩트 테이블
- 누적 스냅샷 팩트 테이블(Accumulating Snapshot Fact Table) : 시작과 끝이 있는 프로세스의 진행상황을 추적하는 팩트 테이블. 프로세스가 끝나면 최종 진행상황을 업데이트 한다.
- 가산적 팩트(additive fact) : 모든 차원에 대해 의미있게 더할 수 있는 측정값
- 반가산적 팩트(semi_additive fact) : 반가산적 팩트는 특정 차원에 대해서만 합산할 수 있는 측정값.
주기적 스냅샷 팩트 테이블의 모든 측정값은 다른 기간에 걸쳐 합산할 수 없다.
- 매일 밤 인벤토리 항목을 샘플링하여 기간을 합산해서는 안 되지만, 매일 밤 선반에 있는 모든 인벤토리 항목의 기간을 합산할 수는 있다.
- 재고 팩트 테이블의 재고 잔량 측정값은 다른 제품에서 합산할 수 없다.
- 통화 차원 키가 있는 판매 팩트 테이블의 판매 매출은 여러 통화에 걸쳐 합산할 수 없다.
- 비가산적 팩트(none additive fact) : 어떤 차원에도 더할 수 없는 비율이나 평균값, ex)할인률 등
- Factless Fact Tables : 측정값 없이 이벤트 발생만 기록하는 팩트 테이블
- Aggregate Fact Tables : 성능 향상을 위한 사전 집계된 팩트 테이블
- Multiple Fact Tables : 여러 팩트 테이블을 연결하여 분석하는 방법
- Conformed Facts : 여러 팩트 테이블 간 일관성을 보장하는 공통 측정값