DOCS/plans/250911_main_db3_migration_plan.md
happybell80 97e0888ce0 Fix more incorrect table names in documentation
- users → user in SQL contexts (94 occurrences)
- robeings → robeing in SQL contexts
- user_preferences → user_preference (14 files)
- slack_workspaces → slack_workspace in SQL contexts (17 files)

All table names now correctly match PostgreSQL schema
2025-09-26 00:52:15 +09:00

3.9 KiB

main_db3 → main_db 마이그레이션 계획

작성일: 2025-09-11

목적: main_db3 데이터를 main_db로 통합


1. 현황 분석

main_db3 (삭제 예정)

  • 총 13개 테이블, 614개 레코드
  • 주요 데이터: users(17), company(4), conversation_log(555)
  • Slack/Gmail 연동 데이터 보유

main_db (운영 DB)

  • 총 11개 테이블, 대부분 비어있음
  • 기존 데이터: company(2), team(2)

2. 테이블 매핑

main_db3 main_db 비고
company company 2개 중복 확인 필요
users user team_id 필수 추가
workspaces team 구조 변환 필요
workspace_member workspace_member user_id 매핑
slack_workspaces slack_workspace team_id 매핑
user_preference user_preference slack_user_id 제거됨
conversation_log conversation_log robeing_id 컬럼 없음
gmail_token gmail_token 구조 동일
robeing_stats robeing product_id, team_id 추가
slack_user_mapping - workspace_member로 통합

3. 마이그레이션 순서

Phase 1: 조직 구조 (필수 선행)

-- 1. company → company (중복 제외)
INSERT INTO company (id, name, url, created_at, updated_at)
SELECT id, name, domain, created_at, updated_at 
FROM main_db3.company 
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: 사용자 데이터

-- 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_member wm ON u.id = wm.user_id;

-- 4. workspace_member → 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_member;

Phase 3: 통합 데이터

-- 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_preference → 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_preference;

-- 7. gmail_token → gmail_token
INSERT INTO gmail_token SELECT * FROM main_db3.gmail_token;

Phase 4: 대화 기록

-- 8. conversation_log → 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_log 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로 이동 예정
  • 실행 시간: 새벽 시간대 권장 (서비스 영향 최소화)

6. 실행 결과 (2025-09-11)

User 테이블 마이그레이션 완료