샘플 데이터 스키마 레퍼런스
대한카드 시나리오의 11개 테이블 상세 스키마입니다.
참고: card_crm과 card_log 카탈로그는 샘플 데이터 시딩(
make seed-demo) 시 자동 생성됩니다. 기본 설치에는 포함되지 않습니다.
카탈로그 구조
iceberg.card → transactions, fraud_labels, merchants, products
sourcedb.public → customers, accounts, credit_assessments
card_crm.public → consultations, marketing_consents, customer_segments
card_log.public → app_events
iceberg.card.transactions (거래 원장)
| 컬럼 | 타입 | PII | 설명 |
|---|---|---|---|
| txn_id | VARCHAR | 거래 PK (UUID). 레거시 seed_card_demo.py에서는 transaction_id로 정의됨 | |
| customer_id | VARCHAR | FK → customers | |
| merchant_id | VARCHAR | FK → merchants | |
| card_number | VARCHAR | 부분마스킹 | 카드번호 16자리 |
| txn_datetime | TIMESTAMP | 거래 시점 | |
| amount | DECIMAL(15,2) | 금액 (KRW) | |
| currency | VARCHAR | KRW/USD/JPY | |
| txn_type | VARCHAR | payment | |
| channel | VARCHAR | online/offline/atm/mobile | |
| status | VARCHAR | approved/declined/pending | |
| mcc_code | VARCHAR | 업종 코드 | |
| country | VARCHAR | 거래 국가 | |
| ip_address | VARCHAR | 해싱 | 온라인 거래 IP |
| device_id | VARCHAR | 모바일 디바이스 |
스케일: tiny 10K / demo 1M / perf 50M
iceberg.card.fraud_labels (사기 탐지)
| 컬럼 | 타입 | 설명 |
|---|---|---|
| fraud_id | VARCHAR | PK |
| txn_id | VARCHAR | FK → transactions |
| is_fraud | BOOLEAN | 실제 사기 여부 |
| fraud_type | VARCHAR | stolen_card/account_takeover/friendly_fraud/merchant_fraud |
| confidence_score | DOUBLE | ML 신뢰도 (0.0~1.0) |
| detected_at | TIMESTAMP | 탐지 시점 |
| reported_by | VARCHAR | system/customer/bank |
| investigation_status | VARCHAR | open/investigating/confirmed/dismissed |
iceberg.card.merchants (가맹점)
| 컬럼 | 타입 | 설명 |
|---|---|---|
| merchant_id | VARCHAR | PK |
| name | VARCHAR | 가맹점명 (한글) |
| business_number | VARCHAR | 사업자등록번호 |
| mcc_code | VARCHAR | 업종 코드 |
| category | VARCHAR | 12개 업종 분류 |
| city | VARCHAR | 소재 도시 |
| region | VARCHAR | 소재 지역 |
| registered_at | DATE | 가맹 등록일 |
| risk_score | DOUBLE | 위험 점수 (0~100) |
| is_active | BOOLEAN | 활성 여부 |
sourcedb.public.customers (고객 마스터)
| 컬럼 | 타입 | PII | 마스킹 |
|---|---|---|---|
| customer_id | VARCHAR | PK | |
| name | VARCHAR | O | hash |
| resident_number | VARCHAR | O | redact |
| phone | VARCHAR | O | partial |
| VARCHAR | O | partial | |
| address | VARCHAR | O | redact |
| birth_date | DATE | O | generalize |
| gender | VARCHAR | ||
| credit_score | INTEGER | 300~850 | |
| annual_income | BIGINT | O | range |
| customer_grade | VARCHAR | VIP/Gold/Silver/Bronze | |
| joined_at | DATE | ||
| is_active | BOOLEAN |
sourcedb.public.accounts (계좌)
| 컬럼 | 타입 | PII | 설명 |
|---|---|---|---|
| account_id | VARCHAR | PK | |
| customer_id | VARCHAR | FK → customers | |
| account_number | VARCHAR | 부분마스킹 | 계좌번호 |
| account_type | VARCHAR | checking/savings/card_payment | |
| balance | DECIMAL(15,2) | 잔액 | |
| credit_limit | DECIMAL(15,2) | 신용한도 | |
| opened_at | DATE | 개설일 | |
| status | VARCHAR | active/dormant/closed |
sourcedb.public.credit_assessments (신용 평가)
| 컬럼 | 타입 | 설명 |
|---|---|---|
| assessment_id | VARCHAR | PK |
| customer_id | VARCHAR | FK → customers |
| assessment_date | DATE | 평가일 |
| credit_score | INTEGER | 평가 점수 |
| risk_grade | VARCHAR | A/B/C/D/E |
| debt_to_income | DOUBLE | DTI 비율 |
| delinquency_count | INTEGER | 연체 횟수 |
| assessed_by | VARCHAR | system/manual |
card_crm.public.consultations (상담 이력)
| 컬럼 | 타입 | 설명 |
|---|---|---|
| consultation_id | VARCHAR | PK |
| customer_id | VARCHAR | FK → customers |
| channel | VARCHAR | call/chat/email/branch |
| category | VARCHAR | billing/fraud_report/product_inquiry/complaint/general |
| summary | TEXT | 상담 요약 (한글) |
| sentiment | VARCHAR | positive/neutral/negative |
| agent_id | VARCHAR | 상담사 ID |
| started_at | TIMESTAMP | 상담 시작 |
| duration_seconds | INTEGER | 상담 시간 |
| resolution | VARCHAR | resolved/escalated/pending |
card_crm.public.customer_segments (세그먼트)
| 컬럼 | 타입 | 설명 |
|---|---|---|
| segment_id | VARCHAR | PK |
| customer_id | VARCHAR | FK → customers |
| segment_name | VARCHAR | high_value/at_risk/new/dormant/churned |
| assigned_at | DATE | 배정일 |
| rfm_recency | INTEGER | RFM 최근성 (1~5) |
| rfm_frequency | INTEGER | RFM 빈도 (1~5) |
| rfm_monetary | INTEGER | RFM 금액 (1~5) |
card_crm.public.marketing_consents (마케팅 동의)
| 컬럼 | 타입 | 설명 |
|---|---|---|
| consent_id | VARCHAR | PK |
| customer_id | VARCHAR | FK → customers |
| consent_type | VARCHAR | sms/email/push/third_party |
| is_consented | BOOLEAN | 동의 여부 |
| consented_at | TIMESTAMP | 동의 시점 |
| expires_at | TIMESTAMP | 동의 만료 시점 |
iceberg.card.products (카드 상품)
| 컬럼 | 타입 | 설명 |
|---|---|---|
| product_id | VARCHAR | PK |
| name | VARCHAR | 상품명 |
| card_type | VARCHAR | credit/debit/prepaid |
| annual_fee | DECIMAL(15,2) | 연회비 (KRW) |
| cashback_rate | DOUBLE | 캐시백 비율 (0.0~1.0) |
| interest_rate | DOUBLE | 이자율 (0.0~1.0) |
| min_credit_score | INTEGER | 최소 신용점수 |
| launched_at | DATE | 출시일 |
| is_active | BOOLEAN | 판매 중 여부 |
card_log.public.app_events (앱 이벤트)
| 컬럼 | 타입 | 설명 |
|---|---|---|
| event_id | VARCHAR | PK |
| customer_id | VARCHAR | FK → customers |
| event_type | VARCHAR | login/page_view/txn_attempt/notification_click/logout |
| event_datetime | TIMESTAMP | 이벤트 시점 |
| device_type | VARCHAR | ios/android/web |
| app_version | VARCHAR | 앱 버전 |
| screen_name | VARCHAR | 화면명 |
| session_id | VARCHAR | 세션 ID |
| ip_address | VARCHAR | 접속 IP |
| metadata | JSON | 이벤트별 추가 데이터 |
FK 관계도
customers (PK: customer_id)
├── transactions.customer_id
├── accounts.customer_id
├── credit_assessments.customer_id
├── consultations.customer_id
├── marketing_consents.customer_id
├── customer_segments.customer_id
└── app_events.customer_id
transactions (PK: txn_id)
├── fraud_labels.txn_id
└── merchants.merchant_id (FK from transactions.merchant_id)
데이터 시딩
# 전체 데모 데이터 시딩 (2분)
make seed-demo
# CI/테스트용 최소 데이터 (10초)
make seed-demo-tiny
# 성능 벤치마크 (30분)
make seed-demo-perf