webForumDet fria alternativet

Flexibilitet och mysql

PHPur PHP

3 svar · 304 visningar · startad av KillenK

Medlem sedan jan. 200512 inlägg
Frågan#1

Lite svårt att förklara, men hur ska man tänka om jag vill skapa ett system där man kan lägga till val som en slutanvändare ska kunna välja och allt sparas som enskilda element i databas?

T.ex. i en kontrollpanel lägger jag till följande poster i tabellen "val":

id - parentid - färg
1 - 0 - favoritfärg
2 - 1 - röd
3 - 1 - grön
4 - 1 - blå

Sedan kan jag ju enkelt skapa ett formulär där besökaren får välja sin favoritfärg och skicka resultatet. MEN...

Hur ska jag på bästa sätt spara besökarens val i en databas?
Låt säga att jag i stället hade skapat 100 val i min kontrollpanel, hur kan jag spara besökarens 100 val separat? Att bara lägga ihop allt och spara i ett fält i databasen är inga problem, men inte vad jag är ute efter. Inte heller att skapa 100 fält i databasen utifall det skulle komma att behövas. Det känns inte heller aktuellt att lägga till fält med kod när man lägger till ett nytt val.

Hur ska man tänka? Skapa en tabell där alla besökarens val sparas som enskilda poster med besökar-id och val-id till varje post?

Hur brukar man göra, för detta är väl en ganska vanlig situation?

Medlem sedan aug. 20039 342 inlägg
#2

Jag skulle lagra kategorierna och valen i olika tabeller. Sedan en relationstabell för att knyta val till en användare. Typ:

val_kategori
kat_id - kat_namn
0 - Favoritfärg
1 - Favorithusdjur

val_alternativ
alt_id - kat_id - alt_namn
0 - 0 - Röd
1 - 0 - Grön
2 - 1 - Groda
3 - 0 - Rosa
4 - 1 - Hund

val_rel
rel_id - user_id - alt_id
0 - 5 - 2
1 - 5 - 3

Understrukna fältnamn är primärnycklar. Val_kategori lagrar ett unikt id för varje kategori samt namnet på kategorin. Val_alternativ lagrar ett unikt id för varje valalternativ, vilken kategori alternativet tillhör samt en sträng med alternativet. Val_rel lagrar relationen och innehåller användarens id samt ett valalternativ. Du behöver inte lagra kategori-id't här, det kan du joina in.
I exemplet ovan gillar användare 5 rosa och grodor.
Det kan du få ut med en fråga som:

SELECT u.namn AS namn, k.kat_namn AS kat, a.alt_namn AS alt, u.user_id AS user_id
FROM users u
LEFT JOIN val_rel r ON r.user_id = u.user_id
INNER JOIN val_alternativ a ON a.alt_id = r.alt_id
INNER JOIN val_kategori k ON k.kat_id = a.kat_id
WHERE u.user_id = 5;

Då skulle du få ut följande från exemplet ovan...

[B]namn	kat		alt		user_id[/B]
Petter	Favorithusdjur	Rosa		5
Petter	Favoritfärg	Groda		5

Om du ändrar användare-id't till 6 så kanske det ser ut så här: (Användare 6 har inte valt några favoriter alls)

[B]namn	kat	alt		user_id[/B]
Amina	null	null		6

Då får du ut null för kat och alt, då det inte finnas något att hämta där. Detta pga att den första joinen är en left join. Hade man satt en inner join hade du fått ut ett resulset med 0 rader för användare 6.

Medlem sedan jan. 200512 inlägg
#3

Åh, tack. Men det är alltså dumt att ha både kategori och alternativ i samma tabell?

Medlem sedan aug. 20039 342 inlägg
#4

Det finns åtminstone ingen fördel med det.

140 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)