Cost of a Join
I love a good writeup backed up with some performance benchmarks.But I'm a little befuddled as to why the three possible solutions to putting a "status" column in your Products table were:    1. Add a status_id column to the product table and reference a new status table
    2. Add a status_id column to the product table and let the app define the mapping of what each status_id is
    3. Add a status column of type text to the product table

What about :    4. create an enum column with your possible statuses.

If you ever reach more than 65k possible statuses, you've got a different problem.Perhaps the status example is just a hypothetical example? Although the author says they would use option 1 in this case, so what gives? Seems crazy to create a join table for 'status'.