DB 스키마 명세¶
- MySQL 인스턴스: 192.168.56.104:13306
- Database:
trend_collector - 문자셋: utf8mb4 / utf8mb4_unicode_ci
ERD¶
테이블 상세¶
trend_sources¶
수집 소스 마스터 테이블. 소스를 추가할 때 자동으로 레코드가 생성된다.
| 컬럼 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | |
| name | VARCHAR(50) | UNIQUE, NOT NULL | 소스 식별자 (DAUM, NAVER, ...) |
| base_url | VARCHAR(255) | NOT NULL | 스크래핑 대상 URL |
| collect_interval_minutes | INT | NOT NULL, DEFAULT 60 | 수집 주기 (분) |
| is_active | BOOLEAN | NOT NULL, DEFAULT 1 | 활성 여부 (0=수집 중단) |
| created_at | DATETIME(tz) | NOT NULL, DEFAULT NOW() | |
| updated_at | DATETIME(tz) | NOT NULL, DEFAULT NOW() |
trend_snapshots¶
수집 시점별 스냅샷. 매 수집마다 소스당 1개씩 생성된다.
| 컬럼 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | |
| source_id | BIGINT | FK → trend_sources.id, NOT NULL | |
| collected_at | DATETIME(tz) | NOT NULL | 수집 시각 (KST) |
| raw_path | VARCHAR(500) | NULLABLE | RustFS Bronze 저장 경로 |
| status | VARCHAR(20) | NOT NULL | SUCCESS / EMPTY / FAILED |
| error_message | TEXT | NULLABLE | 실패 시 에러 메시지 |
| created_at | DATETIME(tz) | NOT NULL, DEFAULT NOW() | |
| updated_at | DATETIME(tz) | NOT NULL, DEFAULT NOW() |
인덱스:
- idx_snapshot_source_time — (source_id, collected_at): 소스별 시간순 조회
status 값:
- SUCCESS: 정상 수집 (1개 이상 키워드)
- EMPTY: 수집은 성공했으나 키워드 0건 (새벽 시간 등)
- FAILED: 수집 실패 (네트워크 에러, 사이트 장애 등)
trend_keywords¶
스냅샷별 트렌드 키워드 목록. 스냅샷당 최대 10개.
| 컬럼 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | |
| snapshot_id | BIGINT | FK → trend_snapshots.id, NOT NULL | |
| rank_position | INT | NOT NULL | 순위 (1~10) |
| keyword | VARCHAR(200) | NOT NULL | 트렌드 키워드 |
| status | VARCHAR(20) | NULLABLE | 신규 / 상승 / 하락 |
| created_at | DATETIME(tz) | NOT NULL, DEFAULT NOW() | |
| updated_at | DATETIME(tz) | NOT NULL, DEFAULT NOW() |
인덱스:
- idx_keyword_text — (keyword): 키워드 검색
- idx_keyword_snapshot — (snapshot_id, rank_position): 스냅샷별 순위 조회
RustFS Bronze 스키마¶
경로 규칙¶
data/bronze/trend/source={소스명}/{yyyyMMdd}/{HHmmss}/raw.html
data/bronze/trend/source={소스명}/{yyyyMMdd}/{HHmmss}/parsed.json
parsed.json 스키마¶
{
"source": "DAUM",
"collected_at": "2026-04-07T13:44:55+00:00",
"keywords": [
{
"rank": 1,
"keyword": "김부자 가수",
"status": "상승"
}
]
}
| 필드 | 타입 | 설명 |
|---|---|---|
| source | string | 소스 식별자 |
| collected_at | string (ISO 8601) | 수집 시각 (UTC) |
| keywords | array | 키워드 목록 |
| keywords[].rank | int | 순위 |
| keywords[].keyword | string | 키워드 |
| keywords[].status | string | null | 변동 상태 |
스키마 변경 이력¶
| 버전 | 날짜 | 변경 내용 |
|---|---|---|
| v1 | 2026-04-06 | 초기 스키마 생성 (trend_sources, trend_snapshots, trend_keywords) |
| v2 | 2026-04-08 | trend_sources에 collect_interval_minutes, is_active 컬럼 추가 (DB 기반 스케줄링) |