SQL Practice Logo

SQLPractice Online

PostgreSQL: Arrays & JSONB: Examples

Module: Database-Specific Features

Arrays for Product Tags (No Junction Table)

intermediate

E-commerce site needs to store product tags. Traditional approach: Junction table (products_tags) with JOIN. Problem: Slow queries (JOIN overhead). Solution: Use arrays to store tags directly (no JOIN needed).

-- Problem: Junction table approach

CREATE TABLE products_traditional (

product_id SERIAL PRIMARY KEY,

name VARCHAR(200)

);

CREATE TABLE tags (

tag_id SERIAL PRIMARY KEY,

tag_name VARCHAR(50)

);

CREATE TABLE products_tags (

product_id INTEGER REFERENCES products_traditional(product_id),

tag_id INTEGER REFERENCES tags(tag_id),

PRIMARY KEY (product_id, tag_id)

);

-- Query requires JOIN (slow)

SELECT p.product_id, p.name, array_agg(t.tag_name) as tags

FROM products_traditional p

JOIN products_tags pt ON p.product_id = pt.product_id

JOIN tags t ON pt.tag_id = t.tag_id

WHERE t.tag_name = 'electronics'

GROUP BY p.product_id, p.name;

-- Requires 2 JOINs, slower

-- Solution: Array approach

CREATE TABLE products (

product_id SERIAL PRIMARY KEY,

name VARCHAR(200),

tags TEXT[] -- Array of tags

);

-- Create GIN index for fast queries

CREATE INDEX idx_products_tags ON products USING GIN (tags);

-- Insert with array

INSERT INTO products (name, tags)

VALUES

('Laptop', ARRAY['electronics', 'computers', 'portable']),

('Phone', ARRAY['electronics', 'mobile', 'smartphone']),

('Desk', ARRAY['furniture', 'office']);

-- Query: Find products with specific tag (no JOIN)