Pokud někdy plánujete hledat konkrétní atributy, je špatný nápad je serializovat do jednoho sloupce, protože k získání informací budete muset použít funkce pro jednotlivé řádky – to se málokdy dobře škáluje.
Rozhodl bych se pro vaši druhou volbu. Mít seznam atributů v tabulce atributů, objekty v jejich vlastní tabulce a tabulku vztahů mnoho k mnoha nazývanou atributy objektů.
Například:
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)
Vaše obavy o výkon jsou zaznamenány, ale podle mých zkušeností je vždy nákladnější rozdělit sloupec než kombinovat více sloupců. Pokud se ukáže, že existují problémy s výkonem, je naprosto přijatelné rozbít 3NF z výkonnostních důvodů.
V takovém případě bych to uložil stejným způsobem, ale měl bych také sloupec s nezpracovanými serializovanými daty. Pokud použijete triggery pro vložení/aktualizaci k synchronizaci sloupcových a kombinovaných dat, nebudete mít žádné problémy. Ale neměli byste si s tím dělat starosti, dokud se nevynoří skutečný problém.
Použitím těchto spouštěčů minimalizujete práci potřebnou pouze když se údaje změní. Tím, že se snažíte extrahovat informace z podsloupců, děláte zbytečnou práci na každém vyberte.