SQL Practice Logo

SQLPractice Online

Denormalization Strategies: Examples

Module: Schema Design & Advanced DDL

E-commerce Order Denormalization

advanced

Orders table with 5M rows. Order listing requires joining customers and products tables (800ms). Denormalize by adding customer_name and product_name to orders.

-- Add redundant columns

ALTER TABLE orders

ADD COLUMN customer_name VARCHAR(100),

ADD COLUMN product_name VARCHAR(200);

-- Populate existing data

UPDATE orders o

SET

customer_name = (SELECT name FROM customers c WHERE c.customer_id = o.customer_id),

product_name = (SELECT name FROM products p WHERE p.product_id = o.product_id);

-- Create trigger for consistency

CREATE TRIGGER sync_order_customer_name

AFTER UPDATE OF name ON customers

FOR EACH ROW

BEGIN

UPDATE orders SET customer_name = NEW.name WHERE customer_id = NEW.customer_id;

END;

-- Query before (with joins)

SELECT o.order_id, c.name, p.name, o.total

FROM orders o

JOIN customers c ON o.customer_id = c.customer_id

JOIN products p ON o.product_id = p.product_id

LIMIT 50;

-- Execution time: 847ms

-- Query after (no joins)

SELECT order_id, customer_name, product_name, total

FROM orders

LIMIT 50;

-- Execution time: 45ms

Query time: 847ms -> 45ms (18.8x faster)

Daily queries: 50,000

Time saved: 40,100 seconds/day (11.1 hours)

Write overhead: 4.5 seconds/day

Net benefit: 40,095 seconds/day

Denormalization eliminates 2 joins by storing customer_name and product_name directly in orders. Reads are 18x faster, writes are 10x slower, but writes happen 500x less frequently. Triggers maintain consistency when names change.

All

erDiagram

ORDERS_NORMALIZED {