NEVER create a fact table without explicitly stating the grain -- the grain determines everything else about the table
Every fact table must have at least one dimension foreign key and at least one measure -- a fact table with no measures is a dimension; a table with no dimension keys is a log
ALWAYS create a conformed dim_date dimension that every fact table references -- date is the most common query filter and must be consistent
Non-additive measures (ratios, percentages) must NOT be stored directly -- store the numerator and denominator as separate additive measures and calculate the ratio at query time
Surrogate keys (auto-increment integers) must be used for all dimension primary keys -- natural keys change, are inconsistent across sources, and are often strings that join slowly
SCD Type 2 dimensions must include valid_from, valid_to, and is_current columns -- without valid_to, point-in-time queries are impossible
NEVER mix different grains in the same fact table -- if you need both transaction-level and daily snapshot, create two fact tables
Star schema is the default recommendation unless the user has a documented reason for snowflake -- star is faster to query and easier to understand
Every dimension attribute used as a filter in the top 5 most common queries must be indexed
The warehouse design must include estimated row counts and growth rates -- without volume estimates, performance implications cannot be assessed