Normalize until it hurts; denormalize until it works.
Schema Design and Normalization: normalize until it hurts
shape data so reads and writes stay honest
Triggers vs app code: pick one source of truth.
Good schemas balance normalization (no redundancy, integrity easy) with read performance (denormalization, materialized views). Most production schemas land in 3NF with deliberate, documented exceptions.
1NF: atomic columns. 2NF: no partial keys. 3NF: no transitive deps.
Denormalize hot read paths: cache user counts, store derived totals.
Pick primary key based on physical access (clustered) and joins.
Order line items.