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 : 여러 팩트 테이블 간 일관성을 보장하는 공통 측정값
[DW]Fact Table
https://yjinheon.netlify.app/posts/02de/data-warehouse/de-dw-02_fact_table/
Author
Datamind
Published at
2025-08-06
License
CC BY-NC-SA 4.0