## Clinic Registry - data/clinic-registry/clinic_registry_working.csv — 91개 병원 채널 마스터 DB - data/clinic-registry/INFINITH_Outbound_List.csv — BD팀 아웃바운드 리스트 (17컬럼) - data/clinic-registry/update_csv.py — 안전 CSV 업데이트 스크립트 (빈 필드만 채움) - data/clinic-registry/extract_place_ids.py — 네이버 플레이스 ID 추출기 - scripts/import-registry.ts — CSV → Supabase clinic_registry 테이블 임포트 - supabase/migrations/20260406_clinic_registry.sql — clinic_registry 테이블 스키마 ## Pipeline P0 Bug Fixes (전수 감사 후) - fix(collect-channel-data): 강남언니 rating 0-10 스케일 오변환 제거 - 기존: rating ≤ 5이면 ×2 → 4.8/10을 9.6/10으로 잘못 변환 - 수정: Firecrawl 프롬프트가 이미 0-10 지시 → rawValue 직접 신뢰 - fix(generate-report): Perplexity 단일 fetch → fetchWithRetry 교체 - maxRetries:2, backoffMs:[5000,15000], timeoutMs:90s - 기존: 타임아웃/429 시 리포트 생성 전체 실패 - 수정: 자동 재시도로 일시적 API 오류 극복 ## Docs - docs/PIPELINE_IMPROVEMENT_PLAN.md — Sprint 0/1/2 완료 표시 + 전수 감사 결과 추가 - docs/REGISTRY_FUNCTIONAL_SPECS.md, DB_SCHEMA_V3.md 외 기획 문서 다수 추가 ## New Components & Features - supabase/functions/generate-content-plan, adjust-strategy — 콘텐츠 플랜/전략 조정 - src/components/plan/EditEntryModal, StrategyAdjustmentSection — 플랜 편집 UI - supabase/functions/_shared/dataQuality, foundingYearExtractor, urlClassifier — 데이터 품질 유틸 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
62 lines
2.7 KiB
SQL
62 lines
2.7 KiB
SQL
-- ═══════════════════════════════════════════════════════════════
|
|
-- Clinic Registry: Pre-verified channel database
|
|
-- ═══════════════════════════════════════════════════════════════
|
|
-- 사전 검증된 병원 채널 DB. discover-channels에서 API 검색 전에
|
|
-- domain으로 조회하여 검증된 채널을 즉시 반환.
|
|
-- 미등록 도메인은 기존 API 기반 discovery fallback 사용.
|
|
|
|
CREATE TABLE IF NOT EXISTS clinic_registry (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
|
|
-- 병원 식별
|
|
name TEXT NOT NULL, -- 한국어 병원명 (ex: "아이디병원")
|
|
name_aliases TEXT[] DEFAULT '{}', -- 별칭 (ex: {"아이디성형외과", "ID Hospital"})
|
|
domain TEXT UNIQUE NOT NULL, -- 도메인 (www 제외, lookup key)
|
|
website_url TEXT NOT NULL, -- 전체 URL
|
|
|
|
-- 기본 정보
|
|
brand_group TEXT, -- 그룹/카테고리 (ex: "프리미엄/하이타깃 후보")
|
|
district TEXT, -- 지역구 (ex: "강남", "서초")
|
|
branches TEXT, -- 분점 정보
|
|
founded_year INT, -- 개원 연도
|
|
|
|
-- 영문 사이트
|
|
website_en TEXT,
|
|
|
|
-- 소셜 채널 (사전 검증 완료)
|
|
youtube_url TEXT,
|
|
instagram_url TEXT,
|
|
instagram_en_url TEXT,
|
|
facebook_url TEXT,
|
|
tiktok_url TEXT,
|
|
naver_blog_url TEXT,
|
|
naver_place_url TEXT,
|
|
gangnam_unni_url TEXT,
|
|
google_maps_url TEXT,
|
|
|
|
-- 메타
|
|
verified_by TEXT DEFAULT 'scrape', -- 'manual' | 'scrape' | 'llm'
|
|
verified_at TIMESTAMPTZ DEFAULT now(),
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMPTZ DEFAULT now(),
|
|
updated_at TIMESTAMPTZ DEFAULT now()
|
|
);
|
|
|
|
-- 인덱스: domain lookup (primary query path)
|
|
CREATE INDEX IF NOT EXISTS idx_clinic_registry_domain ON clinic_registry (domain);
|
|
-- GIN 인덱스: 별칭 검색
|
|
CREATE INDEX IF NOT EXISTS idx_clinic_registry_aliases ON clinic_registry USING gin (name_aliases);
|
|
-- 지역 필터
|
|
CREATE INDEX IF NOT EXISTS idx_clinic_registry_district ON clinic_registry (district);
|
|
|
|
-- RLS (서비스 키로만 접근, 프론트엔드에서는 Edge Function 통해서만)
|
|
ALTER TABLE clinic_registry ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- 서비스 역할만 CRUD 가능
|
|
CREATE POLICY "service_role_full_access" ON clinic_registry
|
|
FOR ALL USING (auth.role() = 'service_role');
|
|
|
|
-- anon/authenticated는 읽기만
|
|
CREATE POLICY "public_read_registry" ON clinic_registry
|
|
FOR SELECT USING (true);
|