데이터 분석 / 백엔드 설계
데이터베이스와 API
Cloudflare D1 · Hono · 가상 구매 조건 550건
조회와 가격 등록
현재 시세와 차트는 같은 조회 데이터를 사용합니다. 가격 제출은 요청 키로 중복을 검사하고, 가격 원본과 조회 데이터를 한 트랜잭션에서 저장합니다.
부하를 줄이는 기준
첫 조회에서 조건별 최신 행을 읽습니다. 같은 Worker에서는 15초간 재사용하고 이후에는 revision이 증가한 행만 가져옵니다. 차트 기간과 판매점 정렬을 바꾸면 해당 영역만 교체합니다. 비공개 응답은 공유 캐시에 저장하지 않습니다.
테이블과 컬럼
테이블을 펼치면 실제 마이그레이션의 컬럼과 외래 키를 확인할 수 있습니다.
개통 방식 activation_kind
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
name | text | — | 필수 |
부가서비스와 월 요금 addon
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
name | text | — | 필수 |
monthly_won | integer | — | 필수 |
제조사 manufacturer
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
name | text | — | 필수 |
통신사·자급제 carrier
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
name | text | — | 필수 |
가상 데이터 초기화 기록 dataset_seed
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
created_at | integer | — | 필수 |
시군구 district
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
province_id | text | FK → province.id | 필수 |
name | text | — | 필수 |
조건별 최신 관측과 일별 조회 데이터 offer_read_model
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
terms_id | text | PK | 필수 |
revision | integer | FK → price_observation.seq | 필수 |
daily_points_json | text | — | 필수 |
판매점·기종·통신사·개통 조합 listing
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
shop_id | text | FK → shop.id | 필수 |
sku_id | text | FK → handset_sku.id | 필수 |
carrier_id | text | FK → carrier.id | 필수 |
activation_id | text | FK → activation_kind.id | 필수 |
기종과 출시월 handset_model
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
manufacturer_id | text | FK → manufacturer.id | 필수 |
name | text | — | 필수 |
release_month | text | — | 필수 |
동 neighborhood
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
district_id | text | FK → district.id | 필수 |
name | text | — | 필수 |
추가 전용 가격 관측 원본 price_observation
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
seq | integer | PK | 필수 |
terms_id | text | FK → offer_terms.id | 필수 |
observed_at | integer | — | 필수 |
device_won | integer | — | 필수 |
source_id | text | FK → price_source.id | 필수 |
request_key | text | — | 필수 |
verified_by | text | — | 필수 |
시도 province
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
name | text | — | 필수 |
판매점과 소재지 shop
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
neighborhood_id | text | FK → neighborhood.id | 필수 |
name | text | — | 필수 |
기종별 저장용량 handset_sku
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
model_id | text | FK → handset_model.id | 필수 |
storage_gb | integer | — | 필수 |
가격 출처와 데모 구분 price_source
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
name | text | — | 필수 |
is_demo | integer | — | 필수 |
통신사별 요금제와 월 요금 tariff
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
carrier_id | text | FK → carrier.id | 필수 |
name | text | — | 필수 |
monthly_won | integer | — | 필수 |
구매 조건 버전과 의무기간 offer_terms
| 컬럼 | 타입 | 키 · 참조 | 입력 |
|---|---|---|---|
id | text | PK | 필수 |
listing_id | text | FK → listing.id | 필수 |
version | integer | — | 필수 |
initial_tariff_id | text | FK → tariff.id | 필수 |
required_months | integer | — | 필수 |
later_tariff_id | text | FK → tariff.id | 필수 |
addon_id | text | FK → addon.id | 선택 |
addon_months | integer | — | 필수 |
payment_kind | text | — | 필수 |
card_required | integer | — | 필수 |