Если вы когда-либо планируете поиск определенных атрибутов, плохая идея сериализовать их в один столбец, так как вам придется использовать функции для каждой строки, чтобы получить информацию - это редко хорошо масштабируется.
Я бы выбрал ваш второй выбор. Иметь список атрибутов в таблице атрибутов, объекты в их собственной таблице и таблицу отношений «многие ко многим», называемые атрибутами объекта.
Например:
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)
Ваша озабоченность по поводу производительности отмечена, но, по моему опыту, разделить столбец всегда дороже, чем объединить несколько столбцов. Если выясняется, что есть проблемы с производительностью, вполне допустимо сломать 3NF по соображениям производительности.
В этом случае я бы сохранил его таким же образом, но у меня был бы столбец с необработанными сериализованными данными. При условии, что вы используете триггеры вставки / обновления для синхронизации столбчатых и комбинированных данных, у вас не возникнет никаких проблем. Но вы не должны беспокоиться об этом, пока не возникнет реальная проблема.
Используя эти триггеры, вы минимизируете требуемую работу до только при изменении данных. Пытаясь извлечь информацию о подколонке, вы выполняете ненужную работу с каждым выбором.