What is it?
Application data for an AI product — accounts, conversation threads, message bodies, document metadata — fits naturally in PostgreSQL. Your app server uses parameterised SQL. The model API stays separate. pgvector (a Postgres extension) can store embeddings later if you want similarity search without a second product.
Why it matters
"How do I use PostgreSQL with my app?" usually means: where do chats and documents live, how do I query safely, and do I need a vector database immediately? Most teams should get relational storage right first, then measure whether in-database vectors or an external vector database is justified (Vector Database vs Traditional Database).
How to do it
- Provision Postgres; create schemas for
appdata. - From Node/Python, connect with a pool; set a statement timeout.
- Insert/select with bound parameters (
$1,%s) only. - Store messages with
conversation_id,role,content,created_at. - Enforce tenant checks in SQL (
WHERE org_id = $1). - Call the model from the app after reads; write the assistant message in the same transaction when you need consistency.
- Optional later: enable pgvector, add an embedding column on chunks, index with HNSW/IVF as docs recommend.
- Back up Postgres like any production database — AI features do not change that duty.
Example
CREATE TABLE conversations (
id UUID PRIMARY KEY,
org_id UUID NOT NULL,
title TEXT,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE messages (
id UUID PRIMARY KEY,
conversation_id UUID REFERENCES conversations(id),
role TEXT CHECK (role IN ('user','assistant','system')),
content TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT now()
);
-- app code binds org and conversation ids; never concatenates model text into SQL
SELECT role, content FROM messages
WHERE conversation_id = $1
ORDER BY created_at ASC
LIMIT 100;
Embeddings for RAG can live in another table once you need them; until then, Postgres still earns its keep as the system of record.
When to use it
Use PostgreSQL when you need a reliable relational store for an AI-enabled product. Defer pgvector until a prototype shows retrieval quality needs an index inside Postgres. Consider a dedicated vector store only after scale or feature needs appear.
Practical notes
Connection hygiene matters under AI load: chat apps create bursts of writes. Size the pool for your web workers, use timeouts, and avoid opening a new connection per token stream event. For analytics, copy eval scores into a warehouse rather than running heavy reports on the primary. If you add pgvector, put embeddings in a dedicated table keyed by 'chunk_id' and include 'model_id' so you can rebuild when the embedding model changes. Take migrations seriously — additive columns first. Grant the app role only the tables it needs; do not connect as a superuser from the API. Together with Databases for AI Applications, this is enough to answer how Postgres fits an AI-enabled product without a separate MySQL or Mongo guide.
Common mistakes
- Building SQL strings from model output.
- Skipping org-scoped queries.
- Assuming you must install pgvector before storing a single chat.
- Storing API keys in Postgres in plaintext — use a secret manager; reference ids if needed.