[eluser]jedd[/eluser]
I don't like the idea of a link from products to a specific product_image to denote which one is primary, though that is probably the neatest way .. just doesn't sit well.
You are right - your integrity could break if you have a flag in the product_image table to denote primary, but if you LIMIT 1 on selects this won't matter hugely. Alternatively just stick with the LIMIT 1 thing, and I think there's a random option for your selects - which might be an interesting feature if you want to cycle through primary product images.
A quick browse at your column names .. I'd really avoid the confusion of having 'cat_id' as the primary key for two different tables. I'm a big fan of just 'id' as the PK for every table, though a recent discussion in another thread suggests an alternative standard of tablename_ as the prefix for every column. I think having cat_ as the prefix for every column in a table called categories is an example of something else that'll confuse you in the months to come.
What does the quantity refer to in the product table?
What's cat.cat_image point to? (It sounds like the product primary image idea above.)