- 지역 이야기(가요·인물·연표·엽서·퀴즈) 생성 경로: story_service · grounding/story · section_prompts. 지금까지 만들 자리가 없어 시안에만 손으로 넣은 3만 자였다 - 발행본 섹션: ItinerarySection · Carousel 레일 자동재생(use-rail-autoplay) · Festival · LocalGuide · Weather · Gallery · Header/Footer - 목업 payload 를 payloads-mockup/ 으로 분리 — 발행 대상과 섞이지 않게 - DB 새 구조 후속: site_payload · local_content_crud 조인 정리 · 테스트 - 마이그레이션 주석 축약: 9개 파일 합계 주석 비율 48% → 25%. 실측과 밟은 함정만 남기고 논증은 커밋 메시지로 옮겼다 검증: site·frontend 빌드 통과 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
39 lines
3.1 KiB
SQL
39 lines
3.1 KiB
SQL
-- 0009 · init.sql 과 어긋난 것을 맞춘다
|
|
--
|
|
-- init.sql 은 새 DB 만, migrations 는 기존 DB 만 본다. 둘이 갈리면 새로 세운 DB 가
|
|
-- 옛 구조로 선다 — 그래서 여기서 한 번 맞춘다.
|
|
|
|
-- ── 1. 없는 인덱스 (실사용에 영향) ──────────────────────────────────────
|
|
-- 0003 이 기존 DB 에 site_contents 를 만들 때 유니크(uq_site_contents_section)만 걸고
|
|
-- place 조회용 인덱스를 빠뜨렸다. init.sql 에는 처음부터 있었으므로 **새 DB 에만 있고
|
|
-- 기존 DB 에는 없는** 상태였다 — 사이트 하나의 섹션을 읽을 때마다 시퀀셜 스캔이다.
|
|
CREATE INDEX IF NOT EXISTS idx_site_contents_site ON public.site_sections (site_id);
|
|
|
|
-- ── 2. 컬럼 폭 (ORM 과 불일치) ──────────────────────────────────────────
|
|
-- ORM 은 String(64) 인데 DB 는 VARCHAR(32) 였다. 지금 쓰는 카카오 place id 는 8~10자라
|
|
-- 아직 안 터졌지만, 다른 출처(네이버·TourAPI)의 id 를 넣는 날 잘려 들어간다 —
|
|
-- 잘린 id 는 "동일 업소 판정" 을 조용히 틀리게 만드는 종류다.
|
|
ALTER TABLE public.places ALTER COLUMN external_place_id TYPE VARCHAR(64);
|
|
|
|
-- ── 3. 옛 이름이 남은 PK 제약 ───────────────────────────────────────────
|
|
-- `ALTER TABLE ... RENAME TO` 는 제약 이름을 따라 바꾸지 않는다. 그래서 0005 이후로
|
|
-- `place_facts` 의 PK 가 `facts_pkey` 로 남아 있었다. 동작에는 영향이 없지만,
|
|
-- 스키마를 덤프해 비교할 때마다 "새 DB 와 기존 DB 가 다르다" 로 보인다 —
|
|
-- 진짜 차이를 찾는 눈을 가리는 잡음이라 지금 맞춰 둔다.
|
|
ALTER INDEX IF EXISTS public.facts_pkey RENAME TO place_facts_pkey;
|
|
ALTER INDEX IF EXISTS public.faqs_pkey RENAME TO place_faqs_pkey;
|
|
ALTER INDEX IF EXISTS public.media_pkey RENAME TO place_photos_pkey;
|
|
ALTER INDEX IF EXISTS public.units_pkey RENAME TO place_units_pkey;
|
|
ALTER INDEX IF EXISTS public.place_links_pkey RENAME TO place_channels_pkey;
|
|
ALTER INDEX IF EXISTS public.local_contents_pkey RENAME TO area_contents_pkey;
|
|
ALTER INDEX IF EXISTS public.place_contents_pkey RENAME TO place_area_refs_pkey;
|
|
ALTER INDEX IF EXISTS public.site_contents_pkey RENAME TO site_sections_pkey;
|
|
ALTER INDEX IF EXISTS public.publish_logs_pkey RENAME TO site_publish_logs_pkey;
|
|
-- 0004 가 place_contents 를 새로 만들면서 붙은 번호(_pkey1). 위 이름이 이미 비어 있으면
|
|
-- 이쪽이 진짜 PK 다.
|
|
ALTER INDEX IF EXISTS public.place_contents_pkey1 RENAME TO place_area_refs_pkey;
|
|
|
|
-- ★ 인덱스 이름은 바꾸지 않는다(idx_facts_place · uq_place_links_place_url …).
|
|
-- ORM 의 __table_args__ 가 그 이름을 들고 있어서, 여기서 바꾸면 ORM 도 같이 고쳐야 하고
|
|
-- 그 사이에 같은 인덱스가 두 벌 생긴다. 제약 이름과 달리 이건 코드가 참조한다.
|