Walter,
Normalization optimizes for insert and update activities at the cost on the retrieval side of things. I denormalize when retrieval is more important than update and insert. I also
NEVER denormalize before having reached a fully normalized design. Denormalizing is an active not passive process and one cannot actively denormalize something that was never normalized in the first place.
Just as aside, I have seen a number of data designs that were fully normalized where the developer insisted that there was redundant data. A full analysis showed that what was thought to be redundant was, in fact, not redundant at all.
It is not necessary to comment everytime I talk about the logical; arguments in favor of surrogate keys. I know you don't agree, just like a lot of other people didn't agree until they found out it is the easiest way to handle things. Even I thought it was strange until I adopted it, and a good deal of problems disappeared.