Några fler svar på dina frågor:
1) Du är ganska i mål för någon som närmar sig ett problem som detta för första gången. Jag tror att tipsen från andra om denna fråga hittills täcker den ganska mycket. Bra jobbat!
2 &3) Den prestandaträff du kommer att få kommer till stor del att vara beroende av att ha och optimera rätt index för just dina frågor/procedurer och ännu viktigare mängden poster. Såvida du inte talar om långt över en miljon poster i dina huvudtabeller verkar du vara på väg att ha en tillräckligt vanlig design för att prestanda inte kommer att vara ett problem på rimlig hårdvara.
Som sagt, och det här relaterar till din fråga 3, med den start du har borde du förmodligen inte vara alltför orolig för prestation eller överkänslighet för normaliseringsortodoxi här. Det här är en rapporteringsserver du bygger, inte en transaktionsbaserad applikationsbackend, som skulle ha en mycket annorlunda profil med avseende på vikten av prestanda eller normalisering. En databas som stödjer ett liveregistrerings- och schemaläggningsprogram måste vara uppmärksam på frågor som tar sekunder att returnera data. En rapportserverfunktion har inte bara mer tolerans för komplexa och långa frågor, utan strategierna för att förbättra prestandan är mycket olika.
Till exempel, i en transaktionsbaserad applikationsmiljö kan dina prestandaförbättringsalternativ inkludera att omstrukturera dina lagrade procedurer och tabellstrukturer till den n:e graden, eller att utveckla en cachningsstrategi för små mängder vanligen begärd data. I en rapportmiljö kan du säkert göra detta men du kan ha en ännu större inverkan på prestandan genom att introducera en ögonblicksbildsmekanism där en schemalagd process körs och lagrar förkonfigurerade rapporter och dina användare får tillgång till ögonblicksbildsdata utan stress på din db-nivå på per begäran.
Allt detta är ett långrandigt gnäll för att illustrera att vilka designprinciper och trick du använder kan skilja sig åt beroende på vilken roll den db du skapar. Jag hoppas att det är till hjälp.