Als je ooit Als u van plan bent om naar specifieke attributen te zoeken, is het een slecht idee om ze in een enkele kolom te rangschikken, aangezien u functies per rij moet gebruiken om de informatie eruit te krijgen - dit schaalt zelden goed.
Ik zou voor je tweede keus kiezen. Zorg voor een lijst met attributen in een attributentabel, de objecten in hun eigen tabel en een veel-op-veel-relatietabel genaamd objectattributen.
Bijvoorbeeld:
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)
Uw bezorgdheid over de prestaties wordt opgemerkt, maar in mijn ervaring is het altijd duurder om een kolom te splitsen dan om meerdere kolommen te combineren. Als blijkt dat er prestatieproblemen zijn, is het volkomen acceptabel om 3NF te breken om prestatieredenen.
In dat geval zou ik het op dezelfde manier opslaan, maar ook een kolom hebben met de onbewerkte geserialiseerde gegevens. Op voorwaarde dat u triggers voor invoegen/bijwerken gebruikt om de kolom- en gecombineerde gegevens synchroon te houden, zult u geen problemen ondervinden. Maar u hoeft zich daar geen zorgen over te maken totdat een echt probleem zich voordoet.
Door deze triggers te gebruiken, minimaliseert u het benodigde werk tot alleen wanneer de gegevens veranderen. Door te proberen subkolominformatie te extraheren, doet u onnodig werk op elke selecteer.