I would suggest you base your design on the one on which the web tag is based.
Let me explain to you:
You will need 4 more tables for your main table of objects.
First: the name tag table, this is the base identifier of the table | name that will store the attribute of the object: "author", "size", "weight"; anything an object can describe
tag_table id varchar(36) tag varchar(36)
Second: this table will match the value with the tag names stored in the tag_table value. It has the same design.
value_table id varchar(36) value varchar(36)
Third: determine which value is a tag.
tag_value id_pair varchar(36) id_tag varchar(36) id_value varchar(36)
Fourth: joins the object with its data, which shorten it
object_tag_value id_object varchar(36) id_pair varchar(36)
And finally, your table of objects.
Hierarchical system implementation :
For the one-to-many or many-to-many hierarchy, an additional table is implemented that links two objects:
object_relation id_parent varchar(36) id_son varchar(36)
For many-to-one (Employee table with manager_id, for example) just add id_parent as a member of your object.
With this scheme, you will be very scalable, and the object can now have an infinite characteristic that you are no longer limited to. In addition, you avoid data redundancy because the tag name is unique.
I hope I was clear enough and helped you,