Database Antipatterns
Overview
Section titled “Overview”Database antipatterns lead to poor performance, data integrity issues, and security vulnerabilities.
Common Problems
Section titled “Common Problems”1. God Table
Section titled “1. God Table”A single table with hundreds of columns trying to store everything.
2. SQL Injection
Section titled “2. SQL Injection”Building queries by concatenating user input.
3. N+1 Queries
Section titled “3. N+1 Queries”Fetching related data in loops instead of joins.
Articles in This Section
Section titled “Articles in This Section”- God Table - One table to rule them all
- SQL Injection - The most dangerous vulnerability
Quick Comparison
Section titled “Quick Comparison”| Antipattern | Problem | Solution |
|---|---|---|
| God Table | Unmaintainable, sparse data | Proper normalization |
| SQL Injection | Data breach, data loss | Parameterized queries |
| N+1 Queries | Performance disaster | Eager loading, joins |
Key Principles
Section titled “Key Principles”1. Normalize Your Data
Section titled “1. Normalize Your Data”-- Bad: Everything in one tableCREATE TABLE everything ( user_id INT, user_name VARCHAR, order_id INT, order_date DATE, product_id INT, product_name VARCHAR, -- 200 more columns...)
-- Good: Separate, related tablesCREATE TABLE users (id, name, email)CREATE TABLE orders (id, user_id, date)CREATE TABLE products (id, name, price)CREATE TABLE order_items (order_id, product_id, quantity)2. Always Use Parameterized Queries
Section titled “2. Always Use Parameterized Queries”// Bad - SQL injectionconst sql = `SELECT * FROM users WHERE id = ${userId}`
// Good - parameterizedconst sql = `SELECT * FROM users WHERE id = ?`db.query(sql, [userId])3. Optimize Fetching Patterns
Section titled “3. Optimize Fetching Patterns”// Bad - N+1 queriesconst users = await db.query('SELECT * FROM users')for (const user of users) { user.orders = await db.query( 'SELECT * FROM orders WHERE user_id = ?', [user.id] )}
// Good - single query with joinconst users = await db.query(` SELECT u.*, o.* FROM users u LEFT JOIN orders o ON o.user_id = u.id`)