- RAG 파일 시스템용 team_document 테이블 스키마 추가 - 팀별 문서 저장/관리 구조 - ChromaDB 연동을 위한 chunk_count, text_content 컬럼 - 파일 중복 방지를 위한 file_hash 인덱스 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
9.9 KiB
9.9 KiB
PostgreSQL 테이블 구조
작성일: 2025-08-20
최종 수정일: 2025-09-15
데이터베이스: main_db
1. 조직 관련 테이블
company
- 용도: 회사 정보
- Primary Key: id (UUID)
- 레코드: 2개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 회사 ID | |
| name | VARCHAR(255) | NO | 회사명 | |
| url | VARCHAR(255) | YES | 회사 URL | |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
team
- 용도: 팀 정보
- Primary Key: id (UUID)
- 레코드: 2개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 팀 ID | |
| company_id | UUID | NO | 회사 ID (FK → company) | |
| name | VARCHAR(32) | NO | 팀 이름 | |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
user
- 용도: 시스템 사용자 정보
- Primary Key: id (UUID)
- 레코드: 1개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 사용자 ID | |
| team_id | UUID | NO | 팀 ID (FK → team) | |
| VARCHAR(255) | NO | 이메일 (UNIQUE) | ||
| name | VARCHAR(255) | YES | 사용자명 | |
| picture | VARCHAR(500) | YES | 프로필 이미지 | |
| oauth_provider | VARCHAR(50) | YES | OAuth 제공자 | |
| oauth_id | VARCHAR(255) | YES | OAuth ID | |
| is_active | BOOLEAN | YES | 활성 상태 | |
| last_login_at | TIMESTAMPTZ | YES | 마지막 로그인 | |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
| username | VARCHAR(64) | YES | 사용자명 |
workspace_member
- 용도: 워크스페이스 멤버십
- Primary Key: id (UUID)
- 레코드: 0개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 멤버십 ID | |
| user_id | UUID | NO | 사용자 ID (FK → user) | |
| role | user_role | NO | GUEST | 역할 (OWNER/MEMBER/GUEST) |
| is_active | BOOLEAN | YES | 활성 상태 | |
| joined_at | TIMESTAMP | YES | CURRENT_TIMESTAMP | 가입 시각 |
| updated_at | TIMESTAMP | YES | CURRENT_TIMESTAMP | 수정 시각 |
2. 제품 및 로빙 테이블
product
- 용도: 제품 정보
- Primary Key: id (UUID)
- 레코드: 1개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 제품 ID | |
| name | VARCHAR(32) | NO | 제품명 | |
| app_id | VARCHAR(16) | YES | 앱 ID | |
| scope | JSON | YES | 권한 범위 | |
| description | VARCHAR(256) | YES | 설명 | |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
robeing
- 용도: 로빙 엔티티 정보
- Primary Key: id (UUID)
- 레코드: 2개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 로빙 ID | |
| product_id | UUID | NO | 제품 ID (FK → product) | |
| team_id | UUID | NO | 팀 ID (FK → team) | |
| name | VARCHAR(32) | YES | 로빙 이름 | |
| level | INTEGER | YES | 1 | 레벨 |
| experience | INTEGER | YES | 0 | 경험치 |
| memory | INTEGER | YES | 10 | 메모리 스탯 |
| compute | INTEGER | YES | 10 | 연산 스탯 |
| react | INTEGER | YES | 10 | 반응 스탯 |
| empathy | INTEGER | YES | 10 | 공감 스탯 |
| leadership | INTEGER | YES | 10 | 리더십 스탯 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
| robeing_container_id | VARCHAR(64) | YES | 컨테이너 ID | |
| robeing_container_url | VARCHAR(128) | YES | 컨테이너 URL |
3. Slack 통합 테이블
slack_workspace
- 용도: Slack 워크스페이스 정보
- Primary Key: id (UUID)
- 레코드: 2개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 워크스페이스 ID | |
| team_id | UUID | NO | 팀 ID (FK → team) | |
| slack_team_id | VARCHAR(32) | YES | Slack 팀 ID | |
| bot_token | VARCHAR(255) | YES | 봇 토큰 | |
| is_enterprise_install | BOOLEAN | YES | 엔터프라이즈 설치 | |
| is_active | BOOLEAN | YES | 활성 상태 | |
| installed_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 설치 시각 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
4. 사용자 설정 및 토큰 테이블
user_preference
- 용도: 사용자 개인 설정
- Primary Key: id (INTEGER)
- 레코드: 0개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | INTEGER | NO | 설정 ID | |
| user_id | UUID | NO | 사용자 ID (FK → user) | |
| slack_user_id | VARCHAR(32) | YES | Slack 사용자 ID | |
| news_keywords | VARCHAR(128)[] | YES | 뉴스 키워드 | |
| email_filter | VARCHAR(128)[] | YES | 이메일 필터 | |
| briefing_enabled | BOOLEAN | YES | true | 브리핑 활성화 |
| briefing_time | TIME | YES | 09:00:00 | 브리핑 시간 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
gmail_token
- 용도: Gmail OAuth 토큰
- Primary Key: id (UUID)
- 레코드: 0개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 토큰 ID | |
| user_id | UUID | NO | 사용자 ID (FK → user) | |
| token_data | JSONB | YES | 토큰 데이터 | |
| oauth_config | JSONB | YES | OAuth 설정 | |
| scopes | JSONB | YES | 권한 범위 | |
| metadata | JSONB | YES | 메타데이터 | |
| expiry | TIMESTAMP | YES | 만료 시각 | |
| is_equipped | BOOLEAN | YES | false | 장착 상태 |
| equipped_to | VARCHAR(50) | YES | 장착 대상 | |
| token_type | VARCHAR | YES | Bearer | 토큰 타입 |
| expires_at | DOUBLE PRECISION | YES | 만료 시간 | |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
5. 로그 및 데이터 테이블
conversation_log
- 용도: 대화 기록
- Primary Key: id (INTEGER)
- 레코드: 0개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | INTEGER | NO | 로그 ID | |
| user_id | UUID | NO | 사용자 ID (FK → user) | |
| channel_id | VARCHAR(16) | YES | 채널 ID | |
| message | VARCHAR | YES | 사용자 메시지 | |
| response | VARCHAR | YES | 응답 메시지 | |
| intent | VARCHAR(256) | YES | 의도 분석 | |
| confidence | DOUBLE PRECISION | YES | 신뢰도 | |
| thread_ts | VARCHAR(128) | YES | 스레드 타임스탬프 | |
| timestamp | TIMESTAMPTZ | YES | 대화 시각 | |
| channel_type | VARCHAR(32) | YES | 채널 타입 |
news
- 용도: 뉴스 데이터
- Primary Key: id (UUID)
- 레코드: 0개
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | 뉴스 ID | |
| user_id | UUID | YES | 사용자 ID (FK → user) | |
| data | JSONB | YES | 뉴스 데이터 | |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
team_document
- 용도: 팀 문서 RAG 시스템
- Primary Key: id (UUID)
- 레코드: 0개
- 생성일: 2025-09-15
| 컬럼명 | 타입 | NULL | 기본값 | 설명 |
|---|---|---|---|---|
| id | UUID | NO | gen_random_uuid() | 문서 ID |
| team_id | UUID | NO | 팀 ID (FK → team) | |
| uploaded_by | UUID | YES | 업로드 사용자 (FK → user) | |
| filename | VARCHAR(255) | NO | 파일명 | |
| file_hash | VARCHAR(64) | NO | SHA256 해시 | |
| file_size | BIGINT | YES | 파일 크기 (bytes) | |
| mime_type | VARCHAR(100) | YES | MIME 타입 | |
| storage_path | TEXT | NO | 저장 경로 (/mnt/hdd/uploads/{team_id}/) | |
| text_content | TEXT | YES | 추출된 텍스트 | |
| chunk_count | INTEGER | YES | 0 | ChromaDB 청크 수 |
| processing_status | VARCHAR(20) | YES | 'pending' | 처리 상태 (pending/completed/failed) |
| metadata | JSONB | YES | '{}' | 메타데이터 (tags, summary 등) |
| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 |
| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 |
인덱스:
idx_team_doc_hash: UNIQUE (team_id, file_hash) - 팀별 파일 중복 방지
6. 기타 정보
Custom Types
- user_role: ENUM (OWNER, MEMBER, GUEST)
Functions
- update_column_updated_at: 모든 테이블의 updated_at 자동 갱신 트리거
외래키 관계
| 테이블 | 컬럼 | 참조 테이블 | 참조 컬럼 |
|---|---|---|---|
| team | company_id | company | id |
| user | team_id | team | id |
| robeing | product_id | product | id |
| robeing | team_id | team | id |
| slack_workspace | team_id | team | id |
| workspace_member | user_id | user | id |
| conversation_log | user_id | user | id |
| gmail_token | user_id | user | id |
| news | user_id | user | id |
| user_preference | user_id | user | id |
| team_document | team_id | team | id |
| team_document | uploaded_by | user | id |
주의사항
데이터베이스 정보
- 소유자: 모든 테이블 robeings 소유
- 타임스탬프: TIMESTAMPTZ 사용 (WITH TIME ZONE)
- 자동 갱신: update_column_updated_at 트리거로 updated_at 자동 관리
- UUID 기반: 주요 테이블 모두 UUID 사용
현재 데이터 상태 (2025-09-11)
- company: 2개
- team: 2개
- user: 1개
- product: 1개
- robeing: 2개
- slack_workspace: 2개
- 나머지 테이블: 비어있음
문서 끝