Kom ihåg mig?
Home Menu

Menu


Databasstruktur?

 
Ämnesverktyg Visningsalternativ
Oläst 2004-11-09, 18:35 #1
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Hej!
Jag bygger just nu ett register med poster som ska vara indelade i kategorier.
Var post ska vara kunna tillhöra en eller flera kategorier.

De olika kategorierna ska kunna ändras, läggas till eller tas bort,
och ligga i en egen tabell.

Jag funderar därför hur man snyggast gör dessa realationer!


Detta är ett sätt, men jag gillar inte det riktigt:

Kod:
kategori-tabell:
id          beskrivning
1           "kat 1"
2           "kat 2"
3           "kat 3"


register-tabell:
id          post          kat
1           "reg1"         "1,2,"
2           "reg2"         "2,"
3           "reg3"         "1,2,3,"
Sökfråga för att söka kategori blir då i stil med:
Kod:
SELECT * FROM register-tabell WHERE kat LIKE '%".$katid.",%' ORDER BY ...
Att ta bort en kategeri får då göras med:
Kod:
DELETE FROM kategori-tabell WHERE id=".$katid." LIMIT 1;
UPDATE register-tabell SET kat = REPLACE(kat, '".$katid.",', '') WHERE 1
Att tilldelea en register post en registerpost får göras med:
Kod:
UPDATE register-tabell SET kat = CONCAT(kat, '".$katid.",') WHERE id = ...
Koden som den ser ut här fungerar ju dock inte, för finns en post med id 11 kommer en sökning på 1 hitta den. Detta går visserligen att komma runt med att fixa till koden lite, men det är lite på grund av detta som jag inte gillar strukturen.

Har någon förslag på ett bättre sätt?
/ Lasse
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 19:28 #2
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
Du bör ha en post->kategori-tabell som ser ut nåt i stil med

post_id kategori_id

Det gör att du slipper spara relationerna som strängar.
grazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 19:54 #3
mypay mypay är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Aug 2004
Inlägg: 528
mypay mypay är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Aug 2004
Inlägg: 528
jag har i helgen satt upp ett system för en webbutik

där har jag

- produkter - här lagrar jag alla produkterna - utan någon info
[id] [produktnummer] [produktnamn] [kategori]

- produktattribut - här lagrar jag en lista på alla olika attribut.. storlek, pris, längd, mängd, vikt, tillverkare - whatever
[id] [namn]

- attribut - här lagras sen en hel jättelista med produkter (från -produkter-) och attribut (-produktattribut) och sen vilket värde dom har
[id] [produktID] [attributID] [värde]

nu kan jag alltså väldigt lätt skapa nya attribut för mina produkter utan att designa om databasen
mypay är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 20:10 #4
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tack för två snabba bra svar!

Citat:
Originally posted by mypay@Nov 9 2004, 20:54
- attribut - här lagras sen en hel jättelista med produkter (från -produkter-) och attribut (-produktattribut) och sen vilket värde dom har
[id] [produktID] [attributID] [värde]

nu kan jag alltså väldigt lätt skapa nya attribut för mina produkter utan att designa om databasen
En fråga: Hur gör du med datatypen på [värde]?
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 20:22 #5
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
Kod:
kategori-tabell:
id * * * * * * * * * *beskrivning
1 * * * * * * * * * * *"kat 1"
2 * * * * * * * * * * *"kat 2"
3 * * * * * * * * * * *"kat 3"

kategori-koppling-tabell:
id * * * * register-id * * * *kategori-id
1 * * * * * 1 * * * * * * * * * * *1
2 * * * * * 1 * * * * * * * * * * *2
3 * * * * * 2 * * * * * * * * * * *2
4 * * * * * 3 * * * * * * * * * * *1
5 * * * * * 3 * * * * * * * * * * *2
6 * * * * * 3 * * * * * * * * * * *3

register-tabell:
id * * * * * * * * * *post * * * * * * * * * 
1 * * * * * * * * * * *"reg1" 
2 * * * * * * * * * * *"reg2"
3 * * * * * * * * * * *"reg3"
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 20:49 #6
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Jag kör på:
Kod:
kategori-koppling-tabell:
id * * * * register-id * * * *kategori-id
Nästa fråga blir då hur man skriver en SQL-fråga för att lista
alla registerposter och vilka kategorier de har?
Måste man köra en sub-fråga till varje register post?

Typ enligt denna principskissen:
Kod:
SELECT * FROM register-tabell;

Loop (register-tabell) {
 *SELECT kategori_id FROM kategori-koppling-tabell WHERE register-id = ".[register-tabell.id]
 *// Output info...
}
Eller kan man göra det med en JOIN-funktion i första SQL-frågan?
Alltså inte:
Kod:
SELECT * FROM register-tabell LEFT JOIN kategori-koppling-tabell ON register-tabell.id = kategori-koppling-tabell.register-id
för det ger mer än en rad per registerpost...
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 21:32 #7
Susannes avatar
Susanne Susanne är inte uppkopplad
Medlem
 
Reg.datum: Jan 2004
Inlägg: 89
Susanne Susanne är inte uppkopplad
Medlem
Susannes avatar
 
Reg.datum: Jan 2004
Inlägg: 89
Nej. Du bör nog läsa på lite om SQL, bara ett tips.

Om jag fattat vad du är ute efter rätt bör det bli så här:

Kod:
SELECT kategori, register FROM kategori-tabell, register-tabell, kategori-koppling-register-tabell WHERE kategori_id = kategori.id AND register_id = register.id
Susanne är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 22:09 #8
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Citat:
Ursprungligen postat av susja
Nej. Du bör nog läsa på lite om SQL, bara ett tips. *
Tja... då får även du ta fram boken...
(Principskissen var principskiss för skripet jag kör (PHP i mitt fall) med frågor till SQL och inte ren SQL om det misstolkades... :unsure: )

Citat:
Ursprungligen postat av susja
Kod:
SELECT kategori, register FROM kategori-tabell, register-tabell, kategori-koppling-register-tabell WHERE kategori_id = kategori.id AND register_id = register.id
Hjälper inte mig med problemmet, tvärtom "LEFT JOIN" måste anvädas för att få fram de poster som helt saknar kategori!
(Det är inte heller kategori-namn-hämtning som behövs, utan kategori.id räcker!)

Det jag vill göra är att lista alla registerposter, och där även skriva ut vilka kategorier de tillhör.
Både min princip-skiss med att köra en extra SQL-fråga för var post och att köra med "LEFT JOIN" funkar!

Det blir bara så mycket frågor fram och tillbaks med första lösningen.

Andra lösningen skickar var registerpost lika många ggr som antalet kategorier den är med i. (Dock minst en!)
Naturligvis onödig data, samt det måste detekteras i skriptet hur många rader som var post har!

Det jag vill ha är en JOIN-funktion som bygger på med fler kolumner om det finns flera kategorier, istället för med nya rader!
Jag är dock tveksam om det finns en sån funktion!


(Jag kör MySQL)
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 22:22 #9
heyday heyday är inte uppkopplad
Medlem
 
Reg.datum: Jun 2004
Inlägg: 60
heyday heyday är inte uppkopplad
Medlem
 
Reg.datum: Jun 2004
Inlägg: 60
om tanken är att varje registerrad ska kunna förekomma en gång i en kategori så är id kolumnen i "kategori-koppling-tabell" överflödig, såvida inte just den relationen ska användas på något annat ställe (vilket inte är troligt i det här fallet). Sätt en unik begränsning på de två kvarvarande istället.

Ett tips.
heyday är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-11-09, 22:39 #10
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
Citat:
Originally posted by heyday@Nov 9 2004, 23:22
om tanken är att varje registerrad ska kunna förekomma en gång i en kategori så är id kolumnen i "kategori-koppling-tabell" överflödig, såvida inte just den relationen ska användas på något annat ställe (vilket inte är troligt i det här fallet). Sätt en unik begränsning på de två kvarvarande istället.

Ett tips.
Jag tyckte mig läsa att han ville ha ett 1-till-många förhållande.
Robert är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 14:47.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017