8 / 10 erDiagram v0.0.1 상세

8. DB 스키마 — ER 다이어그램

PostgreSQL 같은 RDB에 저장되는 테이블 관계

PostgreSQL 같은 RDB에 저장되는 테이블 관계. 벡터는 VECTOR 타입 (pgvector) 또는 별도 Vector DB 참조.

💡 핵심 개념: 벡터는 두 가지 저장 옵션. (1) Postgres + pgvector 확장 — 한 DB로 통합, transactional 보장. (2) Pinecone/Qdrant 같은 전용 Vector DB — 성능/스케일 유리, sync 부담. 트레이드오프 있음.
erDiagram DOCUMENT ||--o{ CHUNK : contains CHUNK ||--|| EMBEDDING : has EMBEDDING }o--|| VECTOR_INDEX : stored_in USER ||--o{ QUERY : submits QUERY ||--|| RESPONSE : produces RESPONSE }o--o{ CHUNK : cites DOCUMENT { string id PK string title string source_uri datetime created_at jsonb metadata } CHUNK { string id PK string doc_id FK int position text content int token_count } EMBEDDING { string chunk_id PK,FK string model int dimensions vector vector } VECTOR_INDEX { string name PK string embedding_model int dimensions string distance_metric } USER { string id PK string email } QUERY { string id PK string user_id FK text question datetime created_at } RESPONSE { string id PK string query_id FK text answer jsonb metadata datetime generated_at }

🔧 인덱스 전략

📋 pgvector 통합 예시:
-- pgvector 활성화
CREATE EXTENSION IF NOT EXISTS vector;

-- 테이블
CREATE TABLE chunk (
  id UUID PRIMARY KEY,
  doc_id UUID REFERENCES document(id),
  position INT,
  content TEXT,
  token_count INT
);

CREATE TABLE embedding (
  chunk_id UUID PRIMARY KEY REFERENCES chunk(id),
  model VARCHAR(64),
  dimensions INT,
  vector VECTOR(1536)  -- OpenAI text-embedding-3-small
);

-- HNSW 인덱스 (코사인 유사도)
CREATE INDEX embedding_vector_idx
  ON embedding USING hnsw (vector vector_cosine_ops);

-- 검색
SELECT c.content, e.vector <=> $1 AS distance
FROM embedding e JOIN chunk c ON c.id = e.chunk_id
ORDER BY distance
LIMIT 5;
      
⚠️ 흔한 함정:
🛠️ 옵션: pgvector(Postgres 통합), Pinecone(관리형), Qdrant(오픈소스), Weaviate(GraphQL 친화).