Ако някога Планирайте търсенето на конкретни атрибути, лоша идея е да ги сериализирате в една колона, тъй като ще трябва да използвате функции за всеки ред, за да извлечете информацията – това рядко се мащабира добре.
Бих избрал вашия втори избор. Имайте списък с атрибути в таблица с атрибути, обектите в тяхната собствена таблица и таблица на отношенията много към много, наречена атрибути на обекти.
Например:
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 поради съображения за производителност.
В този случай бих го съхранил по същия начин, но също така ще имам колона с необработените сериализирани данни. При условие, че използвате тригери за вмъкване/актуализация, за да поддържате колонните и комбинираните данни в синхрон, няма да имате проблеми. Но не бива да се тревожите за това, докато не се появи действителен проблем.
Използвайки тези тригери, вие свеждате до минимум работата, която се изисква до само когато данните се променят. Опитвайки се да извлечете информация от подколона, вие вършите ненужна работа на всяка изберете.