• I love all the other answers. I'm going to repeat a few for emphasis and a couple of extra points. Almost everything I write has exceptions. However, exceptions should be exceptional.

    * You should have a clustered index on every single table.
    * Clustered indexes should be, as much as possible, unique
    * Every table should have a primary key
    * Every foreign key must be enforced through the use of WITH CHECK
    * 2016 and greater, Clustered Columnstore for analysis focused data instead of clustered index
    * The primary key should be on data that never changes
    * For all your nonclustered indexes, it's better if your clustered index never changes too.
    * The clustered index should be on the most frequently used path to the data, this may not be a PK or AK
    * Because the PK should never change, GUID or IDENTITY are usually the best bets
    * You should have an alternate key (AK) because your PK should be generated, see above, so that it never changes (cascading updates and deletes are from satan).
    * Data types are so important. Strings are strings. Dates are dates. Integers are integers, etc. Don't mix them, ever. It just leads to pain.

    Most of all, don't get overly obsessed with all these suggestions. You're going to have compromises. We all do. Go into them with your eyes open so you understand what the choices you make will mean to the behavior of the system.

    "The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood"
    - Theodore Roosevelt

    Author of:
    SQL Server Execution Plans
    SQL Server Query Performance Tuning