I’ve read the odd article on this site now and then, but still not come decided whether Attwood is writing ironically, or if he is actually incompetent.
Firstly, the sample schema is not normalised. The member_count field in the Affiliation table is a derived value (SELECT COUNT(*) FROM UserAffiliation WHERE affiliation_id = ?). The religious_views and political_views columns in the User table smell badly of multi-values. The purpose of the UserWorkHistory table is unclear, but looks unnormalised.
Secondly, the SELECT example given should user outer joins.
Thirdly, using SELECT * is a no-no. What happens if the order of the columns change? If you’re not using integer indices, then performance suffers. If you are using integer indices, then column order is significant. What if someone adds more columns that your code doesn’t need? You’ll still be pulling that data back.
Oh well, I’m going to add your example schema to our pre-interview exam (commonly known as the idiot filter) - and if anyone suggests your denormalised table as an improvement I’ll know to export them out the building uninterviewed.