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
}
🔧 인덱스 전략
- CHUNK(doc_id, position) — 문서 내 순서 조회
- EMBEDDING — vector 컬럼에 HNSW 인덱스 (pgvector)
CREATE INDEX ... USING hnsw (vector vector_cosine_ops)
- QUERY(user_id, created_at DESC) — 사용자별 최근 질문
- RESPONSE(query_id) — 1:1 매핑, 빠른 lookup
📋 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;
⚠️ 흔한 함정:
- 인덱스 없이 검색 — 100만 row 풀스캔. HNSW/IVFFlat 필수
- dimensions 안 맞추기 — 1536 모델 쓰면서 column을 VECTOR(768)로 만들면 insert 실패
- metadata jsonb 안 쓰기 — source/author/timestamp 다 별도 컬럼 → 폭발. jsonb로 묶기
- cascade 삭제 안 설정 — document 지우면 chunk orphan.
ON DELETE CASCADE
🛠️ 옵션: pgvector(Postgres 통합), Pinecone(관리형), Qdrant(오픈소스), Weaviate(GraphQL 친화).