My tips (as a DB architect amongst other things):
- Get your business requirements as detailed & complete as possible before you begin.
- Break down your requirements into nouns, which will be entities, and adjectives/properties/descriptives, which will be your columns. Write a list of each. E.g., 'Sale' is a noun, 'Sale Date' is a property of a Sale. Repeat for every requirement. Make a big list.
- Entities NORMALLY but not always become tables. Likewise properties. Find out about strong and weak entities. Look for properties shared between entities, entities that are properties of other entities. Consider using weak entities to map things together, i.e. Appointment only exists if Customer, Branch and FinancialProduct exist. Avoid circular relationships.
- Look through your list for non-trivial dependencies. These are hierarchies, e.g. Branch -> Department -> Manager -> Employee, or transient dependencies e.g. Postcode -> Address -> Person, or in fact any non-direct relationship between one thing and another. Consider how you will map these out - as a series of parent-child tables? Some recursive structure?
- Decide on whether you want a fully normalised model, a partially-normalised model or a denormalised model. Normalised models scale well but without good index and partition management perform like shit. Denormalised models will fly, but good luck updating data and maintaining consistency.
- Build your ERDs before you write any code. You want a conceptual model, then a logical model, and then a physical model, in that order. Your conceptual model links your concepts and establishes your cross-dependencies; the logical model is the formal ERD of the same and your physical model should be homogenous (that is to say, directly mappable) to the SQL DDL which will create your schema. This depends on the product you're deploying to.
- Find out about 1-1, 1-N, M-N relationships. Find out about fan and chasm traps. Find out about datatypes. Avoid direct M-N relationships and structure out your schema with solid foundations. Choose your datatypes well and fit them well to the data. Nobody needs NVARCHAR(MAX)es on every column. The query optimiser will not thank you.
- Prototype your schema - deploy it somewhere. Now insert, update, delete data from it. Query it. What hurts? Can your requirements be met without a pile of abstractions? Make changes and retry.
- How will you handle abstractions? Direct queries? Views? Stored procedures? Indexed views (materialised views)? Will there be some crappy ORM layered on top? What will you feed it on, direct queries or views?
- Make any changes you need, repeat and rinse, repeat and rinse.
- Write a Crayola summary with lots of colourful diagrams and smiley-face stickers and present it back to the business analysts for feedback. Do not use long words.
There is quite a bit more to it than this but these I feel are the essentials.