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

Come archiviare dati con numero dinamico di attributi in un database

Se mai pianificare la ricerca di attributi specifici, è una cattiva idea serializzarli in un'unica colonna, dal momento che dovrai utilizzare le funzioni per riga per ottenere le informazioni, che raramente si adattano bene.

Io opterei per la tua seconda scelta. Avere un elenco di attributi in una tabella degli attributi, gli oggetti nella loro tabella e una tabella di relazione molti-a-molti chiamata attributi degli oggetti.

Ad esempio:

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)

La tua preoccupazione per le prestazioni è nota ma, secondo la mia esperienza, è sempre più costoso dividere una colonna che combinare più colonne. Se si scopre che ci sono problemi di prestazioni, è perfettamente accettabile rompere 3NF per motivi di prestazioni.

In tal caso lo memorizzerei allo stesso modo ma avrei anche una colonna con i dati serializzati grezzi. A condizione che utilizzi i trigger di inserimento/aggiornamento per mantenere sincronizzati i dati colonnari e combinati, non avrai problemi. Ma non dovresti preoccuparti di questo fino a quando non emerge un problema reale.

Utilizzando questi attivatori, riduci al minimo il lavoro richiesto a solo quando i dati cambiano. Tentando di estrarre informazioni dalle sottocolonne, esegui lavori non necessari su ogni seleziona.