qualitum logo
Hur fungera relations tabeller?

PHPportalen Forum Index » Databaser
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
lucaswelander



Medlem i: 728 dagar
Från: Märsta, Stockholm
Status: Offline



#710530
Inlägg Skrivet: 2011-07-21 00:13      Ämne: Hur fungera relations tabeller? Citera

Hejsan, sitter här med ett litet projekt och har snubblat över relationstabeller och jag undrar nu lite hur det fungerar, tillsammans med mysql då. Ska jag köra relationer mellan tabellerna eller ska jag ha en tredje tabell som förenar två tabeller med deras id:n? Jag har försökt att googla men hittar inge som riktigt tar upp hur det fungerar.

Är det någon här som kan antingen ge en crash course i hur relations tabeller i mysql fungerar eller länka till en vettig sida där det står utformat väl hur man gör eller enbart bra information om hur man använder relations tabeller alt. relationer i mysql.

tack på förhand Smile
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
marabou
Moderator



Medlem i: 3178 dagar
Från: Sveriges framsida
Status: Offline



#710559
Inlägg Skrivet: 2011-07-21 10:57      Ämne: Citera

Det finns tre typer av relationstabeller:
- One to One (en till en)
- One to Many (en till många)
- Many to Many (många till många)

De funkar på (ungefär) följande sätt:
One to One:
Tänk dig en tabell med kunder, där du kan lagra all information om kunden som egna kolumner i tabellen. En helt normal tabell (inga relationer). Men om vi nu tänker oss att det finns information om denna kund som man inte använder så ofta, som t.ex. styrelsens säte eller vd:ns födelsedag så kan vi lägga det i en separat tabell för att minska storleken på kundtabellen.
I själva kundtabellen har vi nu endast den viktiga informationen som vi använder ofta, t.ex. Kundnr, namn, adress osv. Vi skapar en nu tabell: KundInfo som innehåller övrig info. Exempel:
KOD:
1:
 
2:
Kunder:
3:
KundNr   Namn                Adress            Ort         Epost
4:
101      Nisses Svets        Testgatan         Testbyn     nisse@svets.se
5:
102      Akamea Productions  Kungsgatan        Stockholm   info@akamea.se
6:
103      Adam o Eva Eden     Edens lustgård    Lustgård    adamoeva@eden.se
7:
 
8:
KundInfo:
9:
KundNr   Styrelsens säte     VD:s födelsedag   Registreringsdatum
10:
101      Testbyn             20/3              2010-04-02
11:
102      Uppsala             12/5              2010-09-22
12:
103      Eden                1/1               2011-06-30

Hä r ligger relationen på KundNr, och det finns en rad för varje kundnummer i varje tabell. Här är alltså en en-till-en-relation (en radi Kunder motsvaras av en rad i KundInfo)

One-to-Many
Exempel på en "One-to-many"-relation är en ordertabell. Där kan man koppla flera ordrar till samma kund (en rad i kundtabellen har flera rader i ordertabellen)

Exempel:
KOD:
1:
Kunder:
2:
KundNr   Namn                Adress            Ort         Epost
3:
101      Nisses Svets        Testgatan         Testbyn     nisse@svets.se
4:
102      Akamea Productions  Kungsgatan        Stockholm   info@akamea.se
5:
103      Adam o Eva Eden     Edens lustgård    Lustgård    adamoeva@eden.se
6:
 
7:
Ordrar:
8:
OrderNr    KundNr    Totalbelopp    Betald         Beställningsdatum
9:
123        101       10000          2011-07-07     2011-06-30
10:
124        101       6000                          2011-07-20
11:
125        103       2500                          2011-07-21
12:
 

Här ser du att två ordrar är relaterade till en kund, därav "en till många"-relationen (eller kanske "många-till-en" beroende på hur man ser det)

Many to Many:
I en många till många-relation har man två tabeller med information där flera rader ena tabellen kan höra ihop med flera tabeller i den andra tabellen.
Vi utökar vår order-tabell med en många-till-många-relation för att kunna veta vad kunden beställt. För detta behöver vi en tabell med artiklar:
KOD:
1:
ArtikelNr   Namn      Pris
2:
1           Stol      500
3:
2           Matta     250
4:
3           Soffa     3500
5:
4           Fåtölj    2700


Nu när vi skapar en order så lägger vi ju självklart in en rad i Order-tabellen, men vi måste ha en relationstabell som kopplar artiklar till ordern. I dess enklaste utseende kan den tabellen se ut så här:
KOD:
1:
OrderArtiklar
2:
OrderNr    ArtikelNr
3:
123        1
4:
123        4
5:
124        1
6:
124        1
7:
124        3
8:
124        4
9:
125        2
10:
125        2
11:
125        2

Här ser vi flera rader per ordernummer och flera rader per artikelnummer. Här har vi en many-to-many-relation.
Vill man så kan man ju utöka den lite. Som ni ser så har ju order 24 beställt två stolar, men de ligger på varsin rad. Om vi lägger till ett antal-fält så blir tabellen så här istället:
KOD:
1:
OrderArtiklar
2:
OrderNr    ArtikelNr  Antal
3:
123        1          1
4:
123        4          1
5:
124        1          2
6:
124        3          1
7:
124        4          1
8:
125        2          3


Hur hämtar man informationen från databasen då???
Nu börjar vi prata JOIN, det finns många bra guider om detta, bland annat här på portalen så jag skall inte gå in så djupt, bara ge några exempel:

Hämta basinfo om alla kunder:
KOD:
1:
SELECT * FROM Kunder

Nu får du en rad per kund (totalt tre rader enligt tabellerna ovan)

Hämta en "one-to-one"-relation (Hämta basinfo om kunder tillsammans med extrainfon):
KOD:
1:
SELECT Kunder.*, KundInfo.* FROM Kunder JOIN KundInfo ON KundInfo.KundNr = Kunder.KundNr

Nu får du en rad per kund

Hämta en one-to-many-relation (hämta ordrar för alla kunder)
KOD:
1:
SELECT Kunder.*, Ordrar.* FROM Kunder JOIN Ordrar ON Ordrar.KundNr = Kunder.KundNr

Nu får du en rad per order och kund. Det kommer alltså två rader för kund 101 eftersom han har två ordrar.

Hämta en many-to-many
KOD:
1:
SELECT Order.*, Artiklar.* FROM Order JOIN OrderArtiklar ON OrderArtiklar.OrderNr= Order.OrderNr LEFT JOIN Artiklar ON Artiklar.ArtikelNr = OrderArtiklar.ArtikelNr

Nu får du en rad per order och artikel. Du får alltså totalt 6 rader om du har antal-kolumnen, annars 9 rader utan antal-kolumnen.

Hämta beställda artiklar för en specifik order:
KOD:
1:
SELECT * FROM OrderArtiklar LEFT JOIN Artiklar ON Artiklar.ArtikelNr = OrderArtiklar.ArtikelNr WHERE OrderArtiklar.OrderNr = 123


Hämta ordrar för en viss kund:
KOD:
1:
SELECT * FROM Ordrar WHERE KundNr = 101



Hoppas det rätade ut några frågetecken!
 

_________________
"Never argue with stupid people. They will bring you down to their level and beat you with experience."
- Mark Twain
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
lucaswelander



Medlem i: 728 dagar
Från: Märsta, Stockholm
Status: Offline



#710576
Inlägg Skrivet: 2011-07-21 13:44      Ämne: Citera

Grymt!
Tack att du orkade skriva allt det här och nu har jag och även andra en grym post att gå tillbaka å kolla ifall jag behöver läsa på mer. Tack än en gång!
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Azreal
Administratör



Medlem i: 2814 dagar
Från: Uppsala, bor i Göteborg
Status: Online



#710579
Inlägg Skrivet: 2011-07-21 13:54      Ämne: Citera

Snyggt Storken, riktigt fint inlägg.
 

_________________
Konsultation via PM, inte gratis.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
mmmmm



Medlem i: 3386 dagar

Status: Offline



#710875
Inlägg Skrivet: 2011-07-27 15:33      Ämne: Citera

Bra inlägg Storken!
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » Databaser
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic
qualitum logo