From 7b2bba49f93c691266e7e96beb6416fdbf8745f7 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Thu, 11 Sep 2025 21:31:53 +0900 Subject: [PATCH] =?UTF-8?q?main=5Fdb3=20=EB=A7=88=EC=9D=B4=EA=B7=B8?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=EA=B3=84=ED=9A=8D=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 614개 레코드 마이그레이션 계획 - 테이블 매핑 및 변환 규칙 정의 - 4단계 순차 실행 계획 - SQL 스크립트 포함 --- .../plans/250911_main_db3_migration_plan.md | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 300_architecture/plans/250911_main_db3_migration_plan.md diff --git a/300_architecture/plans/250911_main_db3_migration_plan.md b/300_architecture/plans/250911_main_db3_migration_plan.md new file mode 100644 index 0000000..c60187e --- /dev/null +++ b/300_architecture/plans/250911_main_db3_migration_plan.md @@ -0,0 +1,109 @@ +# 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로 이동 예정 +- **실행 시간**: 새벽 시간대 권장 (서비스 영향 최소화) \ No newline at end of file