sql >> Databasteknik >  >> RDS >> Mysql

Hur man lagrar data med dynamiskt antal attribut i en databas

Om du någonsin planerar att söka efter specifika attribut är det en dålig idé att serialisera dem i en enda kolumn, eftersom du måste använda funktioner per rad för att få ut informationen - detta skalas sällan bra.

Jag skulle välja ditt andra val. Ha en lista med attribut i en attributtabell, objekten i sin egen tabell och en många-till-många relationstabell som kallas objektattribut.

Till exempel:

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 oro för prestanda noteras, men enligt min erfarenhet är det alltid dyrare att dela en kolumn än att kombinera flera kolumner. Om det visar sig att det finns prestandaproblem är det helt acceptabelt att bryta 3NF av prestandaskäl.

I så fall skulle jag lagra det på samma sätt men också ha en kolumn med den råa serialiserade datan. Förutsatt att du använder utlösare för infogning/uppdatering för att hålla kolumnära och kombinerade data synkroniserade, kommer du inte att ha några problem. Men du bör inte oroa dig för det förrän ett verkligt problem dyker upp.

Genom att använda dessa utlösare minimerar du det arbete som krävs till endast när uppgifterna ändras. Genom att försöka extrahera information från underkolumner gör du onödigt arbete på varje välj.



  1. MySQL:FULL OUTER JOIN - Hur slår jag samman en kolumn?

  2. MySQL Performance:Introduktion till JOINs i SQL

  3. Hur SQLite Lower() fungerar

  4. Kontrollera om databasen redan finns