Simon,
I'm happy to yield to your experience in this area - particularly as you have contributed much more to W3T that I probably ever will []/w3timages/icons/smile.gif[/].
However, one final observation. In the example you give of joining the user table to the posts table, the join you have shown is valid. However, the performance hit of doing the join the other way (from posts to users) could be much more significant - as a match has to be made from the users table against every row in the posts table.
Even with only "tens of thousands" of records (the 20GB system had less than 100,000 records in the tables in question), you need to watch those types of joins very carefully.
I guess my parting thought is that joins should be used where they make sense and do not impact performance - but that they should not be used just because it makes the programming easier - without thinking about what we are actually doing on the underlying database.
Dave.