webForumDet fria alternativet

Smart att ha tabell för alla kategorier eller inte?

Databaser & SQL

3 svar · 2 242 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hallå!

Jag har just nu 5 olika tabeller med olika kategorier som jag hämtar in med 5 sql-satser. Jag tänker att detta borde kunna göras i en tabell och en enda fråga. Vad tror ni?

Det är två tabell-typer för de fem kategorisorterna (3 har den första och 2 den andra) och de ser ut såhär:
ID - PID - TITEL - BG_COLOR - FG_COLOR - ORDER
resp.
ID - PID - TITEL - ABBR_TITEL - ORDER

ID är auto_increment
PID tänkte jag ska vara NULL om kategorierna ska nås i alla projekt eller en kommaseparerad sträng/serialized array med projekt-id:n om de bara ska nås från vissa projekt (behövs verkligen en extra tabell för detta annars? Jag tänker mig att man hämtar ut alla kategorier jämt ändå)
TITEL är kategorinamnet
ABBR_TITEL är en förkortning av titeln och ska bara finnas till två av kategorisorterna
BG_COLOR och FG_COLOR innehåller 6 tecken långa koder för färger, ex. 0066cc och dessa två fält gäller endast tre av kateorierna
ORDER är siffror som talar om i vilken ordning de ska listas

Just nu har jag runt 50 kategorier totalt och jag kan tänka mig att det blir runt 50-100 som max, men det beror helt på vad användaren väljer att lägga in.

Tänker jag fel när jag försöker att baka ihop olika grejer såhär eller är det smart? Vissa av fälten används bara till vissa av kategorierna som sagt så det blir lite NULL-värden. Å andra sidan känns det lockande att ha ett gemensamt inmatningssystem för allt, en sql-fråga för att hämta klabbet och slippa 70 JOINS i mina frågor.

Tack för tips!

Medlem sedan mars 20146 inlägg
#2

Det här är ju ett problem med relationsdatabaser, att jobba med träd strukturer. Jag har inte implementerat det själv men gillar lösningen här http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back . Naive trees på slide 49, det kommer en lösning som dom kallar "closure table" som ser ut att verka vettig.

Medlem sedan mars 20034 471 inlägg
#3

Databaser är optimerade för att kunna göra JOINer blixtsnabbt om du har en vettig struktur på din data, och att inmatningen blir enkel för dig är inte tillnärmelsevis lika viktigt som att du har en vettig struktur på din relationsdatabas.

Jag skulle dels ha en tabell för alla kategorier, tex:
Kategorisort (ID - PID - TITEL - ABBR_TITEL - BG_COLOR - FG_COLOR - ORDER)

En del kategorier får då nullvärden på ABBR_TITEL och andra på BG_COLOR - FG_COLOR, men det är OK eftersom dessa inte är nyckelkolumner.

Sedan en kopplingstabell mellan Kategorisorten och Projektet:
ProjektKategori (ProjID, KategoriID) // En kombination per rad

Visst det blir många rader, men går betydligt fortare för databasen att hitta alla projekt som har en viss kategori, eller att utföra JOIN mellan dessa och visa all info om projekt OCH kategorisorter, än om databasen måste göra strängjämförelser i en lagrad lista.

Medlem sedan nov. 20016 480 inlägg
#4

Allright, tack! Besegrad igen!

261 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
116 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)