From b7adf49a024b40de4aa395a168d4200f21fa2f99 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Thu, 2 Oct 2025 19:03:28 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20tables.md=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=84=A4=EB=AA=85=20=EC=A0=9C=EA=B1=B0=20(376=EC=A4=84?= =?UTF-8?q?=E2=86=92350=EC=A4=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모든 테이블의 설명 컬럼에서 자명한 설명 제거 - FK 참조, 제약조건, 특수값만 유지 - 테이블 구조 및 컬럼은 모두 유지 --- 300_architecture/database/tables.md | 352 +++++++++++++--------------- 1 file changed, 163 insertions(+), 189 deletions(-) diff --git a/300_architecture/database/tables.md b/300_architecture/database/tables.md index ccde12e..e380edf 100644 --- a/300_architecture/database/tables.md +++ b/300_architecture/database/tables.md @@ -9,160 +9,134 @@ ## 1. 조직 관련 테이블 ### company -- **용도**: 회사 정보 -- **Primary Key**: id (UUID) - -| 컬럼명 | 타입 | 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 | 수정 시각 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | UUID | NO | PK | +| name | VARCHAR(255) | NO | | +| url | VARCHAR(255) | YES | | +| created_at | TIMESTAMPTZ | YES | | +| updated_at | TIMESTAMPTZ | YES | | ### team -- **용도**: 팀 정보 -- **Primary Key**: id (UUID) - -| 컬럼명 | 타입 | 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 | 수정 시각 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | UUID | NO | PK | +| company_id | UUID | NO | FK → company | +| name | VARCHAR(32) | NO | | +| created_at | TIMESTAMPTZ | YES | | +| updated_at | TIMESTAMPTZ | YES | | ### user -- **용도**: 시스템 사용자 정보 -- **Primary Key**: id (UUID) - -| 컬럼명 | 타입 | NULL | 기본값 | 설명 | -|--------|------|------|--------|------| -| id | UUID | NO | | 사용자 ID | -| team_id | UUID | NO | | 팀 ID (FK → team) | -| email | 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 | | 사용자명 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | UUID | NO | PK | +| team_id | UUID | NO | FK → team | +| email | VARCHAR(255) | NO | UNIQUE | +| name | VARCHAR(255) | YES | | +| picture | VARCHAR(500) | YES | | +| oauth_provider | VARCHAR(50) | YES | google/slack | +| oauth_id | VARCHAR(255) | YES | | +| is_active | BOOLEAN | YES | | +| last_login_at | TIMESTAMPTZ | YES | | +| created_at | TIMESTAMPTZ | YES | | +| updated_at | TIMESTAMPTZ | YES | | +| username | VARCHAR(64) | YES | | +| is_admin | BOOLEAN | NO | | ### workspace_member -- **용도**: 워크스페이스 멤버십 -- **Primary Key**: id (UUID) - -| 컬럼명 | 타입 | 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 | 수정 시각 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | UUID | NO | PK | +| user_id | UUID | NO | FK → user | +| role | user_role | NO | OWNER/MEMBER/GUEST | +| is_active | BOOLEAN | YES | | +| joined_at | TIMESTAMP | YES | | +| updated_at | TIMESTAMP | YES | | --- ## 2. 제품 및 로빙 테이블 ### product -- **용도**: 제품 정보 -- **Primary Key**: id (UUID) - -| 컬럼명 | 타입 | 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 | 수정 시각 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | UUID | NO | PK | +| name | VARCHAR(32) | NO | | +| app_id | VARCHAR(16) | YES | | +| scope | JSON | YES | | +| description | VARCHAR(256) | YES | | +| created_at | TIMESTAMPTZ | YES | | +| updated_at | TIMESTAMPTZ | YES | | ### robeing -- **용도**: 로빙 엔티티 정보 -- **Primary Key**: id (UUID) - -| 컬럼명 | 타입 | 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 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | UUID | NO | PK | +| product_id | UUID | NO | FK → product | +| team_id | UUID | NO | FK → team | +| name | VARCHAR(32) | YES | | +| level | INTEGER | YES | | +| experience | INTEGER | YES | | +| memory | INTEGER | YES | | +| compute | INTEGER | YES | | +| react | INTEGER | YES | | +| empathy | INTEGER | YES | | +| leadership | INTEGER | YES | | +| updated_at | TIMESTAMPTZ | YES | | +| created_at | TIMESTAMPTZ | YES | | +| robeing_container_id | VARCHAR(64) | YES | | +| robeing_container_url | VARCHAR(128) | YES | | --- ## 3. Slack 통합 테이블 ### slack_workspace -- **용도**: Slack 워크스페이스 정보 -- **Primary Key**: id (UUID) - -| 컬럼명 | 타입 | 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 | 생성 시각 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | UUID | NO | PK | +| team_id | UUID | NO | FK → team | +| slack_team_id | VARCHAR(32) | YES | | +| bot_token | VARCHAR(255) | YES | | +| is_enterprise_install | BOOLEAN | YES | | +| is_active | BOOLEAN | YES | | +| installed_at | TIMESTAMPTZ | YES | | +| updated_at | TIMESTAMPTZ | YES | | +| created_at | TIMESTAMPTZ | YES | | --- ## 4. 사용자 설정 및 토큰 테이블 ### user_preference -- **용도**: 사용자 개인 설정 -- **Primary Key**: id (INTEGER) - -| 컬럼명 | 타입 | 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 | 생성 시각 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | INTEGER | NO | PK | +| user_id | UUID | NO | FK → user | +| slack_user_id | VARCHAR(32) | YES | | +| news_keywords | VARCHAR(128)[] | YES | | +| email_filter | VARCHAR(128)[] | YES | | +| briefing_enabled | BOOLEAN | YES | | +| briefing_time | TIME | YES | | +| updated_at | TIMESTAMPTZ | YES | | +| created_at | TIMESTAMPTZ | YES | | ### gmail_token -- **용도**: Gmail OAuth 토큰 -- **Primary Key**: id (UUID) - -| 컬럼명 | 타입 | 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 | 수정 시각 | +| 컬럼명 | 타입 | NULL | 설명 | +|--------|------|------|------| +| id | UUID | NO | PK | +| user_id | UUID | NO | FK → user | +| token_data | JSONB | YES | | +| oauth_config | JSONB | YES | | +| scopes | JSONB | YES | | +| metadata | JSONB | YES | | +| expiry | TIMESTAMP | YES | | +| is_equipped | BOOLEAN | YES | | +| equipped_to | VARCHAR(50) | YES | | +| token_type | VARCHAR | YES | | +| expires_at | DOUBLE PRECISION | YES | | +| created_at | TIMESTAMPTZ | YES | | +| updated_at | TIMESTAMPTZ | YES | | --- @@ -174,16 +148,16 @@ | 컬럼명 | 타입 | 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 | | 채널 타입 | +| id | INTEGER | NO | | PK | +| user_id | UUID | NO | | FK → user | +| channel_id | VARCHAR(16) | YES | | | +| 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 - **용도**: 뉴스 데이터 @@ -191,11 +165,11 @@ | 컬럼명 | 타입 | 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 | 수정 시각 | +| id | UUID | NO | | PK | +| user_id | UUID | YES | | FK → user | +| data | JSONB | YES | | | +| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | | +| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | | ### rb_news - **용도**: 뉴스 발행 관리 @@ -203,15 +177,15 @@ | 컬럼명 | 타입 | NULL | 기본값 | 설명 | |--------|------|------|--------|------| -| id | UUID | NO | gen_random_uuid() | 뉴스 ID | -| title | TEXT | NO | | 뉴스 제목 | -| url | TEXT | NO | | 뉴스 URL (UNIQUE) | -| summary | TEXT | YES | | 뉴스 요약 | -| slack_message_ts | VARCHAR(100) | YES | | Slack 메시지 타임스탬프 | -| slack_channel_id | VARCHAR(100) | YES | | Slack 채널 ID | -| is_published | BOOLEAN | YES | false | 발행 상태 | -| published_at | TIMESTAMPTZ | YES | | 발행 시각 | -| created_at | TIMESTAMPTZ | YES | now() | 생성 시각 | +| id | UUID | NO | gen_random_uuid() | PK | +| title | TEXT | NO | | | +| url | TEXT | NO | | UNIQUE | +| summary | TEXT | YES | | | +| slack_message_ts | VARCHAR(100) | YES | | | +| slack_channel_id | VARCHAR(100) | YES | | | +| is_published | BOOLEAN | YES | false | | +| published_at | TIMESTAMPTZ | YES | | | +| created_at | TIMESTAMPTZ | YES | now() | | **인덱스**: - `rb_news_pkey`: PRIMARY KEY (id) @@ -226,19 +200,19 @@ | 컬럼명 | 타입 | NULL | 기본값 | 설명 | |--------|------|------|--------|------| -| id | UUID | NO | gen_random_uuid() | 문서 ID | -| team_id | UUID | NO | | 팀 ID (FK → team) | -| 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 | | 추출된 텍스트 | +| id | UUID | NO | gen_random_uuid() | PK | +| team_id | UUID | NO | | FK → team | +| filename | VARCHAR(255) | NO | | | +| file_hash | VARCHAR(64) | NO | | SHA256 | +| file_size | BIGINT | YES | | bytes | +| mime_type | VARCHAR(100) | YES | | | +| 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 | '{}' | 메타데이터 (uploaded_by, tags, summary 등) | -| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 | -| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 | +| processing_status | VARCHAR(20) | YES | 'pending' | pending/completed/failed | +| metadata | JSONB | YES | '{}' | uploaded_by, tags, summary 등 | +| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | | +| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | | **인덱스**: - `idx_team_doc_hash`: UNIQUE (team_id, file_hash) - 팀별 파일 중복 방지 @@ -253,22 +227,22 @@ | 컬럼명 | 타입 | NULL | 기본값 | 설명 | |--------|------|------|--------|------| -| id | UUID | NO | gen_random_uuid() | 토큰 ID | -| user_id | UUID | NO | | 사용자 ID (FK → user) | -| access_token | TEXT | YES | | 액세스 토큰 (개별 저장용) | -| refresh_token | TEXT | YES | | 리프레시 토큰 (개별 저장용) | -| token_type | VARCHAR(50) | YES | 'Bearer' | 토큰 타입 | -| expires_at | TIMESTAMP | YES | | 토큰 만료 시각 | -| scopes | JSONB | YES | | OAuth 스코프 목록 | -| domain_id | VARCHAR(255) | YES | | NAVER WORKS 도메인 ID | -| service_account | VARCHAR(255) | YES | | 서비스 계정 | -| metadata | JSONB | YES | | 사용자 메타데이터 | -| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 생성 시각 | -| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | 수정 시각 | -| username | VARCHAR(255) | YES | | 사용자명 | -| account_id | VARCHAR(255) | YES | | NAVER WORKS 계정 ID | -| token_data | JSONB | YES | | 토큰 데이터 (통합 저장용) | -| oauth_config | JSONB | YES | | OAuth 설정 정보 | +| id | UUID | NO | gen_random_uuid() | PK | +| user_id | UUID | NO | | FK → user | +| access_token | TEXT | YES | | 개별 저장용 | +| refresh_token | TEXT | YES | | 개별 저장용 | +| token_type | VARCHAR(50) | YES | 'Bearer' | | +| expires_at | TIMESTAMP | YES | | | +| scopes | JSONB | YES | | | +| domain_id | VARCHAR(255) | YES | | | +| service_account | VARCHAR(255) | YES | | | +| metadata | JSONB | YES | | | +| created_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | | +| updated_at | TIMESTAMPTZ | YES | CURRENT_TIMESTAMP | | +| username | VARCHAR(255) | YES | | | +| account_id | VARCHAR(255) | YES | | | +| token_data | JSONB | YES | | 통합 저장용 | +| oauth_config | JSONB | YES | | | | is_equipped | BOOLEAN | YES | false | Passport 장착 여부 | **인덱스**: @@ -315,18 +289,18 @@ | 컬럼명 | 타입 | NULL | 기본값 | 설명 | |--------|------|------|--------|------| -| created_at | TIMESTAMPTZ | NO | | 분석 시각 (파티션 키) | -| user_id | UUID | YES | | 사용자 ID (user 테이블 참조) | -| company_id | UUID | YES | | 회사 ID | -| robeing_id | VARCHAR(50) | YES | | 로빙 ID | -| emotion_type | VARCHAR(20) | YES | | 'user' 또는 'robeing' | +| created_at | TIMESTAMPTZ | NO | | 파티션 키 | +| user_id | UUID | YES | | user 테이블 참조 | +| company_id | UUID | YES | | | +| robeing_id | VARCHAR(50) | YES | | | +| emotion_type | VARCHAR(20) | YES | | user/robeing | | probs | JSONB | NO | | 7개 감정 확률 분포 | -| entropy | DOUBLE PRECISION | YES | | 감정 엔트로피 값 | -| model_version | VARCHAR(50) | YES | | 모델 버전 (예: onnx-7emotions-v1) | -| meta | JSONB | YES | | 메타데이터 (source, message_length 등) | -| text_hash | VARCHAR(64) | YES | | 텍스트 SHA256 해시 | -| top_emotions | JSONB | YES | | Top-p 복합 감정 배열 [{"label", "probability"}] | -| cumulative_p | DOUBLE PRECISION | YES | | 누적 확률 (Top-p 70%) | +| entropy | DOUBLE PRECISION | YES | | | +| model_version | VARCHAR(50) | YES | | onnx-7emotions-v1 등 | +| meta | JSONB | YES | | source, message_length 등 | +| text_hash | VARCHAR(64) | YES | | SHA256 | +| top_emotions | JSONB | YES | | [{"label", "probability"}] | +| cumulative_p | DOUBLE PRECISION | YES | | Top-p 70% | **인덱스**: - `emotion_readings_created_at_idx`: btree (created_at DESC)