| 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
|
Skrivet: 2011-07-21 00:13
Ämne: Hur fungera relations tabeller?
|
|
|
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  |
|
|
|
| Till toppen på sidan |
|
marabou


Medlem i: 3178 dagar Från: Sveriges framsida
Status: Offline
#710559
|
Skrivet: 2011-07-21 10:57
Ämne:
|
|
|
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:
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: 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:
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: 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:
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:
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:
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:
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):
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)
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
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:
1: SELECT * FROM OrderArtiklar LEFT JOIN Artiklar ON Artiklar.ArtikelNr = OrderArtiklar.ArtikelNr WHERE OrderArtiklar.OrderNr = 123
|
Hämta ordrar för en viss kund:
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 |
|
lucaswelander

Medlem i: 728 dagar Från: Märsta, Stockholm
Status: Offline
#710576
|
Skrivet: 2011-07-21 13:44
Ämne:
|
|
|
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 |
|
Azreal


Medlem i: 2814 dagar Från: Uppsala, bor i Göteborg
Status: Online
#710579
|
Skrivet: 2011-07-21 13:54
Ämne:
|
|
|
| Snyggt Storken, riktigt fint inlägg. |
|
|
_________________ Konsultation via PM, inte gratis. |
| Till toppen på sidan |
|
mmmmm
Medlem i: 3386 dagar
Status: Offline
#710875
|
Skrivet: 2011-07-27 15:33
Ämne:
|
|
|
| Bra inlägg Storken! |
|
|
|
| Till toppen på sidan |
|
|