sql >> Database >  >> RDS >> Mysql

Hoe gegevens met dynamisch aantal attributen in een database op te slaan

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.



  1. C# MySQL-verbinding pooling

  2. MySQL - Bestelquery en toon een willekeurige rij bovenaan

  3. Wat gebruikt LISTAGG met ORDER BY NULL eigenlijk als bestelcriterium?

  4. Winnaarskiezer van PHP Lottery Ticket