webForumDet fria alternativet

Många till många

Databaser & SQLur Databashanterare & SQL

20 svar · 970 visningar · startad av Kalle M

Medlem sedan mars 20041 936 inlägg
Frågan#1

Vad är det som säger att relationen är många till många?

Se bifogad bild.

Är det TblOrder och tblProdukt?

Att en order kan ha många rader i tblorderrader och att även en produkt kan ha många rader i tblOrderrader?

relationer.gif
Medlem sedan apr. 2006409 inlägg
#2

Det är lättare än du tror. Vi tar ett förspänt exempel med följande två tabeller; tblkund, tblorder.

  1. Kan tex en kund göra flera beställningar?
  2. Kan en och samma order göras av flera kunder?

Om man utgår ifrån att svaret på fråga ett är JA. Då kan ju flera rader i tblorder kopplas till samma kundnr. Vi har alltså många till en. Svaret på fråga två är sannolik ja, men i praktiken är det liten chans att flera kunder gör exakt samma beställning. Resultatet blir att du inte behöver göra en många till många relation här. Du kan nöja dig med att låta en kund göra hur många beställningar som helst, så länge den betalar alltså.

Medlem sedan mars 20041 936 inlägg
#3

Det finns ju några varianter som "En till många", "En till En" och "många till många".

Vad är det som utmärker varianten "många till många" i mitt exempel?

Är det att en order kan ha många rader i tblorderrader och att även en produkt kan ha många rader i tblOrderrader?

Medlem sedan apr. 2006409 inlägg
#4

Kalle M skrev:

Vad är det som utmärker varianten "många till många" i mitt exempel?

Är det att en order kan ha många rader i tblorderrader och att även en produkt kan ha många rader i tblOrderrader?

Ehh... du har ingen sån relation i din struktur.

Medlem sedan mars 20041 936 inlägg
#5

Har jag inte? Då har jag fattat fel isåfall.

Enligt en bok jag har så löses detta genom att man skapar en kopplingstabell (Ex tblOrderrader).

Men vad är det som utmärker typen "många till många"(N:N) relation?

Medlem sedan dec. 20025 483 inlägg
#6

Ett rättighetssystem, där användare och saker de skall kunna komma åt finns, kan modelleras på följande vis: UserTable[1]-----[N]UserEntityAccess[M]-----[1]Entity.

D.v.s. i UserEntityAccess sparar du information om vilka användare som får komma åt vilka entities. I den tabellen kan samma användarid finnas flera gånger och samma entitetsid finnas flera gånger (dock endast på samma rad en gång!). I detta scenario finns det en många-till-många-relation mellan användare och entiteter.

Medlem sedan mars 20041 936 inlägg
#7

Men hur skulle isåfall min struktur se ut för att få till en "många till många"?

Jag var bergsäker att jag hade det,

Eller hade det varit en många till många relation om jag inte hade haft med tblOrderrader?

Hade det varit många till många om jag inte hade haft kundtabellen?

Medlem sedan dec. 20025 483 inlägg
#8

Du har redan en många-till-många-relation mellan ordrar och produkter. Resultatet av den relationen är tabellen tblOrderrader. (Man kan ifrågasätta huruvida Antal skall vara med som ett fält i den tabellen, men det är en helt annan femma.)

Medlem sedan juli 200012 980 inlägg
#9

Tycker att du börjar få en bra ordning på dina exempel.
Du bör kanske gå ett steg längre dock i normalisewringen.
Jag tycker att det var ett bra exempel du hade även där.
Men det finns en fjärde grad.
Fundera på vad som händer om kunden byter adress eller telefon! Hur kan du säkerställa historiska data.
Och en Produkt har olika pris vid olika tidpunkter. Där bör man se upp!
Så normalisera lite till och var inte rädd för TS.

Medlem sedan mars 20041 936 inlägg
#10

Peter S:

Så jag har en många till många relation mellan tblOrder och tblProdukt.
Hur blir det en många till många relation där?

Är det att en order kan finnas på många rader i tblOrderrader och att även Produkt kan finnas på flera rader i tblOrderader?

Medlem sedan dec. 20025 483 inlägg
#11

Precis. En specifik order kan finnas på flera rader i tblOrderrader, och en specifik produkt kan finnas på flera rader i tblOrderrader.

Medlem sedan mars 20041 936 inlägg
#12

Tackar så mkt för det!

Slutfundering1:
I tblOrderrader har jag just nu ingen primärnyckel.
Är det ok att inte ha det i den tabellen?

Slutfundering2:
Kundnr i tblkund har en primärnyckel.
Kundnr i tblkund är relaterad till kundnr i tblOrder. (En till många).

Kan man då säga att kundnr i tblOrder är en sekundärnyckel?

Medlem sedan dec. 20025 483 inlägg
#13

Primärnyckel i tblOrderrader skall vara ordernr och produktnr.

Kundnr är primärnyckel i tblKund.

Nej, kundnr i tblOrder är främmande nyckel till tblKund.kundnr.

Medlem sedan mars 20041 936 inlägg
#14

Peter S:

Jag har tolkat det som att kundnr i tblkund är en primärnyckel och att kundnr i tblOrder är en sekundärnyckel. Trodde att sekundärnyckel är samma sak som en främmande nyckel!?

Vad är isåfall en sekundärnyckel i min tabellstruktur?

Medlem sedan dec. 20025 483 inlägg
#15

Sekundär nyckel är (nödvändigtvis) inte samma sak som en främmande nyckel. I detta fall är inte kundnr sekundär nyckel i tblOrder.

En sekundär nyckel är samma sak som en alternativ nyckel, vilket innebär att den kan användas som primärnyckel.

Av de fält som syns i din modell finns troligtvis inga sekundära nycklar. Ett exempel: Säg att du har en tabell med användare kallad Users som ser ut enligt följande:

id (autoinc) | personnr (string) | namn (string)

Då är både id och personnr alternativa nycklar i Users. Men det är bara en av dem du väljer som primärnyckel; den andra blir då sekundär nyckel.

Medlem sedan mars 20041 936 inlägg
#16

Men tblkund är väl en primärtabell och tblOrder är väl en sekundärtabell till tblkund?

Tycker jag läst ett antal gånger att sekundärnyckel är samma sak som en främmande nyckel. Antingen så står det fel eller så tolkar jag det fel.

Medlem sedan dec. 20025 483 inlägg
#17

Har aldrig hört talas om primära/sekundära tabeller. Var har du läst om det?

Medlem sedan mars 20041 936 inlägg
#18

Nu sökte jag snabbt dock:

Kolla inläggen längre ner på sidan:
http://pcforallasmart.idg.se/forum/thread.jsp?forumid=6&rootid=421333

Hur skulle jag isåfall få till en sekundärnyckel i min tabellstruktur?

Om jag skulle (Av nån anledning) sätta primärnyckel på både kundnr i tblkund och kundnr i tblOrder. (En till en). Skulle kundnr tblOrder fortfarande vara en främmande nyckel?

Medlem sedan dec. 20025 483 inlägg
#19

Okej, jag förstår vad de säger i länken du postade, men just begreppen primära/sekundära tabeller vet jag inte varifrån de fått. Men det är väl en bisak i sammanhanget.

Sekundärnycklar är ingenting man skapar för skapandes skull; snarare är det så att de uppstår naturligt (se mitt exempel med id och personnr ovan). Med andra ord bör du inte lägga någon större vikt vid det.

Det finns ingen som helst anledning att sätta kundnr som primärnyckel i tblOrder, eftersom ett kundnr inte unikt identifierar en order (en kund kan ju ha flera ordrar). Mer sannolikt bör primärnyckeln i tblOrder vara ett ordernummer.

Ett fält F kan vara både primärnyckel och främmande nyckel. Vanligt är då att F är en del av en sammansatt nyckel i den tabell där den är primärnyckel.

Så länge kundnr är primärnyckel i tblKund så kommer alla förekomster av kundnr i de andra tabellerna att vara främmande nycklar till tblKund.kundnr (såvida de definieras till att vara främmande nycklar).

Medlem sedan juli 200012 980 inlägg
#20

Just därföt lät man ofta dessa fält ligga efter varandra i vissa Db verktyg
Exempelvis KundNr 6 Tkn samt OrderNr 6 tkn Då kunde man kontatinera (slå ihop) KundOrderNR 12 tkn vid vissa typer av transaktioner.
Sånt behövs ju inte idag med dagens datakraft.

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