This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: postgres-17-json-table-relational-projection

Postgres 17 JSON_TABLE In-Engine Relational Projection

Mandates the use of PostgreSQL 17 SQL/JSON standard JSON_TABLE projections for semi-structured document ingestion and querying. Prohibits transferring unparsed JSON payloads to middle-tier application runtimes for manual deserialization, flattening, and relational transformation, which degrades throughput and introduces compute engine memory pressure.

Prohibited Anti-Pattern: Middle-Tier JSON Hydration and In-Memory Normalization Anti-Pattern

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Postgres 17 JSON_TABLE In-Engine Relational Projection - Mandates the use of PostgreSQL 17 SQL/JSON standard JSON_TABLE projections for semi-structured document ingestion and querying. Prohibits transferring unparsed JSON payloads to middle-tier application runtimes for manual deserialization, flattening, and relational transformation, which degrades throughput and introduces compute engine memory pressure.
globs: src/repositories/**/*.ts, src/services/**/*.ts, src/db/**/*.ts, migrations/**/*.sql
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/postgres-17-json-table-relational-projection"
---

# Postgres 17 JSON_TABLE In-Engine Relational Projection

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Middle-Tier JSON Hydration and In-Memory Normalization Anti-Pattern

## System Constraints
You are a Principal Database Architect and Infrastructure Engineer enforcing the Postgres 17 JSON_TABLE standard. You reject any pattern that streams raw JSON/JSONB blobs into Node.js/Go/Python services for in-memory iteration, schema parsing, or relation-building. You ensure all semi-structured array unpacking and column extraction leverage PostgreSQL 17's native SQL:2023 JSON_TABLE construct with deterministic types and strict error handling clauses.

## Strict Guidelines
- Engineers MUST ALWAYS project nested JSON document arrays directly into relational tabular formats using Postgres 17 native JSON_TABLE in SQL queries.
- Engineers MUST NOT transfer multi-megabyte JSON/JSONB payloads over wire protocols to deserialize via JSON.parse or ORM wrappers for middle-tier transformation.
- Queries utilizing JSON_TABLE MUST explicitly define column data types and error boundaries using standard error handling clauses (e.g., 'ERROR ON ERROR', 'DEFAULT NULL ON EMPTY').
- Services MUST execute batch ingestion and bulk inserts of semi-structured document payloads by passing the raw payload as a single query parameter to an INSERT ... SELECT FROM JSON_TABLE pipeline.
- Legacy set-returning functions such as jsonb_array_elements or jsonb_to_recordset SHOULD be replaced with JSON_TABLE to ensure ANSI SQL:2023 compliance and query planner optimization.

## Bad vs Good Implementations
### Ingesting and Normalizing Document Line Items

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Deserializing deep or large JSON payloads in the Node.js runtime causes massive V8 garbage collection pauses, risks Out-Of-Memory (OOM) crashes on high concurrency, and forces multiple redundant database round-trips.
```typescript
import { db } from '../db';

interface IngestionPayload {
  batchId: string;
  records: Array<{ sku: string; quantity: number; unitPrice: number }>;
}

export async function ingestOrderItems(rawPayload: string): Promise<void> {
  // Anti-pattern: Deserializing JSON in middle-tier memory causing V8 heap spikes
  const parsed: IngestionPayload = JSON.parse(rawPayload);
  
  // Anti-pattern: High-overhead round-trips or manual chunking for relational insertion
  for (const item of parsed.records) {
    await db.query(
      `INSERT INTO order_items (batch_id, sku, quantity, unit_price)
       VALUES ($1, $2, $3, $4)`,
      [parsed.batchId, item.sku, item.quantity, item.unitPrice]
    );
  }
}
```

#### Production Standard (Correct)
> **Standard**: Using Postgres 17's JSON_TABLE eliminates middle-tier JSON decoding and transfers zero intermediate objects across the network. Type casting, nested path traversal, and constraint handling happen natively in C inside PostgreSQL.
```typescript
import { db } from '../db';

export async function ingestOrderItems(rawJsonPayload: string): Promise<void> {
  // Compliant: Postgres 17 JSON_TABLE evaluates path expressions inside database kernel
  const query = `
    INSERT INTO order_items (batch_id, sku, quantity, unit_price)
    SELECT 
      jt.batch_id,
      jt.sku,
      jt.quantity,
      jt.unit_price
    FROM JSON_TABLE(
      $1::jsonb, '$'
      COLUMNS (
        batch_id UUID PATH '$.batchId' ERROR ON ERROR,
        NESTED PATH '$.records[*]' COLUMNS (
          sku TEXT PATH '$.sku' ERROR ON ERROR,
          quantity INTEGER PATH '$.quantity' ERROR ON ERROR,
          unit_price NUMERIC(10, 2) PATH '$.unitPrice' DEFAULT '0.00' ON EMPTY ERROR ON ERROR
        )
      )
    ) AS jt;
  `;

  await db.query(query, [rawJsonPayload]);
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Postgres 17 JSON_TABLE In-Engine Relational Projection

Postgres 17 JSON_TABLE In-Engine Relational Projection defines an industrial-grade behavioral standard for backend engineering. Mandates the use of PostgreSQL 17 SQL/JSON standard JSON_TABLE projections for semi-structured document ingestion and querying. Prohibits transferring unparsed JSON payloads to middle-tier application runtimes for manual deserialization, flattening, and relational transformation, which degrades throughput and introduces compute engine memory pressure. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Middle-Tier JSON Hydration and In-Memory Normalization Anti-Pattern Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftMiddle-Tier JSON Hydration and In-Memory Normalization Anti-PatternCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS project nested JSON document arrays directly into relational tabular formats using Postgres 17 native JSON_TABLE in SQL queries.

Engineers MUST ALWAYS project nested JSON document arrays directly into relational tabular formats using Postgres 17 native JSON_TABLE in SQL queries.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT transfer multi-megabyte JSON/JSONB payloads over wire protocols to deserialize via JSON.parse or ORM wrappers for middle-tier transformation.

Engineers MUST NOT transfer multi-megabyte JSON/JSONB payloads over wire protocols to deserialize via JSON.parse or ORM wrappers for middle-tier transformation.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Queries utilizing JSON_TABLE MUST explicitly define column data types and error boundaries using standard error handling clauses (e.g., 'ERROR ON ERROR', 'DEFAULT NULL ON EMPTY').

Queries utilizing JSON_TABLE MUST explicitly define column data types and error boundaries using standard error handling clauses (e.g., 'ERROR ON ERROR', 'DEFAULT NULL ON EMPTY').

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Services MUST execute batch ingestion and bulk inserts of semi-structured document payloads by passing the raw payload as a single query parameter to an INSERT ... SELECT FROM JSON_TABLE pipeline.

Services MUST execute batch ingestion and bulk inserts of semi-structured document payloads by passing the raw payload as a single query parameter to an INSERT ... SELECT FROM JSON_TABLE pipeline.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Legacy set-returning functions such as jsonb_array_elements or jsonb_to_recordset SHOULD be replaced with JSON_TABLE to ensure ANSI SQL

Legacy set-returning functions such as jsonb_array_elements or jsonb_to_recordset SHOULD be replaced with JSON_TABLE to ensure ANSI SQL:2023 compliance and query planner optimization.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is Postgres 17 JSON_TABLE In-Engine Relational Projection critical for AI coding assistants?

Mandates the use of PostgreSQL 17 SQL/JSON standard JSON_TABLE projections for semi-structured document ingestion and querying. Prohibits transferring unparsed JSON payloads to middle-tier application runtimes for manual deserialization, flattening, and relational transformation, which degrades throughput and introduces compute engine memory pressure. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Middle-Tier JSON Hydration and In-Memory Normalization Anti-Pattern) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

Postgres