What normalisation buys

One place to change each fact. Duplicated data drifts, and drifted data produces reports nobody trusts.

When denormalising is right

Read-heavy paths where the join is genuinely expensive and the duplicated value rarely changes. Order totals and counters are the classic examples.

The obligation you take on

Every denormalised value needs a defined update path and a way to detect drift. Add both at the same time, or the shortcut becomes a bug.