In addition to normalization to 3NF or BCNF (more about that in this question), I have found the following to be useful:
- Name tables as plural nouns
- Name columns as sigular
So a "People" table has a "PersonID" column.
- There is nothing wrong with composite keys, so long as the rules of 3NF or BCNF still hold. In many cases (such as the "many-to-many" case) this is entirely desirable.
- Avoid repeating the table name in the column names. peoplePersonID is better written as table.column anyway, and much more readable and therefore self-documenting. People.PersonID is better, to me at least.
- ON DELETE CASCADE should be used very carefully.
- Remember that NULL means one of two things: Either it's unknown or it's not applicable.
- Remember also that NULLs have interesting affects on joins, so practice your LEFT, RIGHT, and FULL outer joins.