Om du någonsin planerar att söka efter specifika attribut är det en dålig idé att serialisera dem i en enda kolumn, eftersom du måste använda funktioner per rad för att få ut informationen - detta skalas sällan bra.
Jag skulle välja ditt andra val. Ha en lista med attribut i en attributtabell, objekten i sin egen tabell och en många-till-många relationstabell som kallas objektattribut.
Till exempel:
objects:
object_id integer
object_name varchar(20)
primary key (object_id)
attributes:
attr_id integer
attr_name varchar(20)
primary key (attr_id)
object_attributes:
object_id integer references (objects.object_id)
attr_id integer references (attributes.attr_id)
oa_value varchar(20)
primary key (object_id,attr_id)
Din oro för prestanda noteras, men enligt min erfarenhet är det alltid dyrare att dela en kolumn än att kombinera flera kolumner. Om det visar sig att det finns prestandaproblem är det helt acceptabelt att bryta 3NF av prestandaskäl.
I så fall skulle jag lagra det på samma sätt men också ha en kolumn med den råa serialiserade datan. Förutsatt att du använder utlösare för infogning/uppdatering för att hålla kolumnära och kombinerade data synkroniserade, kommer du inte att ha några problem. Men du bör inte oroa dig för det förrän ett verkligt problem dyker upp.
Genom att använda dessa utlösare minimerar du det arbete som krävs till endast när uppgifterna ändras. Genom att försöka extrahera information från underkolumner gör du onödigt arbete på varje välj.