sql >> Database teknologi >  >> RDS >> Mysql

Sådan gemmer du data med dynamisk antal attributter i en database

Hvis du nogensinde planlægger at søge efter specifikke attributter, er det en dårlig idé at serialisere dem i en enkelt kolonne, da du bliver nødt til at bruge funktioner pr. række for at få oplysningerne ud - dette skaleres sjældent godt.

Jeg ville vælge dit andet valg. Har en liste over attributter i en attributtabel, objekterne i deres egen tabel og en mange-til-mange relationstabel kaldet objektattributter.

For eksempel:

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)

Din bekymring for ydeevne er noteret, men efter min erfaring er det altid dyrere at opdele en kolonne end at kombinere flere kolonner. Hvis det viser sig, at der er præstationsproblemer, er det helt acceptabelt at bryde 3NF af præstationsmæssige årsager.

I så fald ville jeg gemme det på samme måde, men også have en kolonne med de rå serialiserede data. Forudsat at du bruger insert/update triggers til at holde de søjleformede og kombinerede data synkroniseret, vil du ikke have nogen problemer. Men det skal du ikke bekymre dig om, før et reelt problem dukker op.

Ved at bruge disse udløsere minimerer du det krævede arbejde til kun når data ændres. Ved at forsøge at udtrække underkolonneoplysninger udfører du unødvendigt arbejde på hver vælg.



  1. Java - Hentning af data fra MySQL-database

  2. Lagring af filer i SQL-database ved hjælp af FILESTREAM – Del 2

  3. liste alle tabeller i en database med MySQLi

  4. Kan ikke oprette forbindelse til MySQL-server på (ip eller domænenavn)