As a horse_with_no_name suggested, I would also go with hstore if you are using PostgreSQL becuase I think its the easiest to morph back to regular table structure if you decide you need that.
There are a couple of features that make hstore pretty nice for your problem:
Indexing is pretty fast
You can query hstore column with something like
SELECT p.product_name, properties->'color' As color, properties->'size'::numeric As size FROM products;
So makes it good for reporting simply by wrapping your different product lines in a view
- The main downside with hstore is keeping track of properties specific to a particular product type, however you can easily compensate for this with PostgreSQL type system
as demonstrated here: http://stackoverflow.com/questions/16092890/how-can-i-translate-a-postgresql-hstore-column-into-a-rowhttps://stackoverflow.com/questions/16092890/how-can-i-translate-a-postgresql-hstore-column-into-a-row
So you can define say a properties type for shoes called CREATE TYPE shoe_properties(color text, size numeric);
or just use a lookup table of property types and their corresponding data types for editing purposes. Then if you decide later you really want to go with the separate table for properties approach, your job would be simple by just creating a typed table from your type and using popular_record to morph your hstore into a row for insert into table.