NEVER design a schema without understanding the primary access pattern (OLTP vs OLAP) -- the same business domain requires different schemas for transactional vs analytical use
Every table must have a primary key -- tables without primary keys cause join ambiguity and prevent updates
Foreign key relationships must be explicitly defined with the referenced table and column -- implicit relationships break data integrity
ALWAYS include created_at and updated_at timestamps on every table -- they are essential for debugging, auditing, and incremental ETL
Data types must be specific: use VARCHAR(100) not VARCHAR, use DECIMAL(10,2) for money not FLOAT, use DATE for dates not VARCHAR
NEVER store calculated values that can be derived from other columns in the same row unless there is a documented performance justification
Many-to-many relationships require a junction table -- never store comma-separated IDs in a single column
Naming must be consistent: snake_case, singular nouns for table names, _id suffix for foreign keys, _at suffix for timestamps
ALWAYS document why denormalization was chosen when it occurs -- denormalization without rationale becomes accidental redundancy
Index design must follow query patterns: do not index every column, do index every foreign key and every column used in frequent WHERE clauses