# main_db3 → main_db 마이그레이션 계획 ## 작성일: 2025-09-11 ## 목적: main_db3 데이터를 main_db로 통합 --- ## 1. 현황 분석 ### main_db3 (삭제 예정) - 총 13개 테이블, 614개 레코드 - 주요 데이터: users(17), companies(4), conversation_logs(555) - Slack/Gmail 연동 데이터 보유 ### main_db (운영 DB) - 총 11개 테이블, 대부분 비어있음 - 기존 데이터: company(2), team(2) --- ## 2. 테이블 매핑 | main_db3 | main_db | 비고 | |----------|---------|------| | companies | company | 2개 중복 확인 필요 | | users | user | team_id 필수 추가 | | workspaces | team | 구조 변환 필요 | | workspace_members | workspace_member | user_id 매핑 | | slack_workspaces | slack_workspace | team_id 매핑 | | user_preferences | user_preference | slack_user_id 제거됨 | | conversation_logs | conversation_log | robeing_id 컬럼 없음 | | gmail_tokens | gmail_token | 구조 동일 | | robeing_stats | robeing | product_id, team_id 추가 | | slack_user_mapping | - | workspace_member로 통합 | --- ## 3. 마이그레이션 순서 ### Phase 1: 조직 구조 (필수 선행) ```sql -- 1. companies → company (중복 제외) INSERT INTO company (id, name, url, created_at, updated_at) SELECT id, name, domain, created_at, updated_at FROM main_db3.companies WHERE id NOT IN ('28f17b47-33f8-47ac-b1ae-100e77b37edb', '99d22d6b-d327-4fa4-bd2f-d228c11056e2'); -- 2. workspaces → team 변환 INSERT INTO team (id, company_id, name, created_at, updated_at) SELECT id, company_id, name, created_at, updated_at FROM main_db3.workspaces; ``` ### Phase 2: 사용자 데이터 ```sql -- 3. users → user (기본 team_id 할당) INSERT INTO "user" (id, team_id, email, name, username, oauth_provider, oauth_id, is_active) SELECT u.id, COALESCE(wm.workspace_id, '38bdc27d-cb01-4960-867e-41733d2f3529'), -- 기본 팀 u.email, u.name, u.username, u.oauth_provider, u.oauth_id, u.is_active FROM main_db3.users u LEFT JOIN main_db3.workspace_members wm ON u.id = wm.user_id; -- 4. workspace_members → workspace_member (slack_user_id 추가 예정) INSERT INTO workspace_member (id, user_id, role, is_active, joined_at) SELECT id, user_id, role::user_role, is_active, joined_at FROM main_db3.workspace_members; ``` ### Phase 3: 통합 데이터 ```sql -- 5. slack_workspaces → slack_workspace INSERT INTO slack_workspace (id, team_id, slack_team_id, bot_token, is_active) SELECT id, workspace_id, team_id, bot_token, is_active FROM main_db3.slack_workspaces; -- 6. user_preferences → user_preference (slack_user_id 제거) INSERT INTO user_preference (user_id, news_keywords, email_filter, briefing_enabled) SELECT user_id, news_keywords, email_filter, briefing_enabled FROM main_db3.user_preferences; -- 7. gmail_tokens → gmail_token INSERT INTO gmail_token SELECT * FROM main_db3.gmail_tokens; ``` ### Phase 4: 대화 기록 ```sql -- 8. conversation_logs → conversation_log (컬럼 매핑 주의) INSERT INTO conversation_log (user_id, channel_id, message, response, intent, confidence, timestamp) SELECT user_id, channel_id, message, response, intent, confidence, timestamp FROM main_db3.conversation_logs WHERE user_id IS NOT NULL; ``` --- ## 4. 검증 및 롤백 ### 검증 - 레코드 수 대조 - 외래키 무결성 확인 - 주요 사용자 데이터 샘플 검증 ### 롤백 계획 - 마이그레이션 전 main_db 백업 - 실패 시 TRUNCATE 후 백업 복원 --- ## 5. 주의사항 - **team_id 필수**: user 테이블 INSERT 시 NOT NULL - **UUID 타입**: 모든 ID는 UUID 타입 유지 - **slack_user_id**: workspace_member로 이동 예정 - **실행 시간**: 새벽 시간대 권장 (서비스 영향 최소화)