Avatar billede DonTorro Nybegynder
15. april 2010 - 12:30 Der er 9 kommentarer og
1 løsning

PHP / mysql flere informationer i samme kollone

Hej.. har tænkt en del over hvordan jeg skal gøre følgende:

Lad os sige brugeren skal oprette en opskrift hvor jeg selfølgelig ikke ved hvor mange ingredienser (fra min liste) brugeren vælger

hvordan skal jeg så sætte dem ind i min database?
og hvis de skal være i samme kollone , hvordan får jeg dem så ud?
15. april 2010 - 12:40 #1
Hvordan ser de database tabeller ud som opskrift og ingredienser skal indsaettes i?  Det lyder som et "en til mange" situation hvor normaliserede databaser bruger to tabeller.

For eksempel tabellen Opskrift med kolonnerne opskrift_id og opskrift_navn og tabellen Ingrediens med kolonnerne ingerdiens_id, ingrediens_navn, og opskrift_id.

Hvis du saa har en opskrift "Frikadeller" med ingredienserne fars, mel, og maelk saa skal det staa saadan i tabellerne:

Opskrift
opskrift_id opskrift_navn
1                frikadeller

Ingredienser
ingrediens_id ingreidens_navn opskrift_id
1                fars                1
2                mel                1
3                maelk              1

Du faar det ud ved denne select forespoergsel:

SELECT opskrift_navn, ingrediens_navn
FROM Opskrift JOIN Ingreidens ON Opskrift.opskrift_id = Ingrediens.opskrift_id
Avatar billede DonTorro Nybegynder
15. april 2010 - 13:01 #2
tak for det hurtige svar :D

men hvad hvis der er flere opskrifter hvor f.eks fars skal bruges?
15. april 2010 - 13:27 #3
Hvad skulle problemet vaere?  Du koerer videre i tabellerne og indsaetter nye retter med en ny id for hver ret og indsaetter ingredienser for hver ret ingredienserne, saaledes:

Opskrift
opskrift_id opskrift_navn
2              ravioli
3              medisterpoelse

Ingredienser
ingrediens_id ingrediens_navn opskrift_id
1                pasta          2
2                smoer          2
3                fars            2
1                tarm            3
2                spaek          3
3                salt            3
4                fars            3

Saa faar du for en bestemt ret, for eksempel ravioli, rettens navn og ingredienser ved denne forespoergsel:

SELECT opskrift_navn, ingrediens_navn
FROM Opskrift JOIN Ingredienser ON Opskrift.opskrift_id = Ingredienser.opskrift_id
WHERE Opskrift.opskrift_navn = "ravioli"

Eller navnet paa alle opskrifter med fars saaledes:

SELECT opskrift_navn
FROM Opskrift JOIN Ingredienser ON Opskrift.opskrift_id = Ingredienser.opskrift_id
WHERE Ingredienser.ingrediens_navn = "fars"

Hvis systemet ikke er "til husbehov" men til et storkoekken hvor der er behov for kontrol med ingredienser kan man lave en tabel Ingreidens med felterne in_id, ingrediens_navn.  Der fylder man saa alle ingredienser i.  I Ingredienser tabellen bliver feltet ingrediens_navn udskiftet med ingrediens_nummer, og hvis fars har nummer 13 (mit lykketal) i Ingrediens tabellen saa finder man retterne med fars ved denne query:

SELECT opskrift_navn
FROM Opskrifter JOIN Ingredienser ON Opskrift.opskrift_id = Ingredienser.opskrift_id JOIN Ingrediens ON Ingredienser.ingrediens_id = Ingrediens.in_id
Avatar billede DonTorro Nybegynder
15. april 2010 - 13:31 #4
Kan godt se hvad du mener :)
Giver det lige et forsøg om lidt også vender jeg tilbage..

tusind tak :)
16. april 2010 - 20:49 #5
Fik du forsoegt det?  Hvordan faldt det ud?  Jeg er spaendt paa at hoere nyt.
Avatar billede danco Nybegynder
16. april 2010 - 21:14 #6
Dumt spørgsmål fra den datamatiker studerende:
Jeg er enig i Christians løsningsforslag, som for mig ser ud til at være normaliseret helt til 3. normalform.
men umiddelbart ser det også ud til at der bruges fremmednøgler, som ikke er understøttet i MyISAM.
Hvordan kan det hænge sammen ?

Og ja, jeg er ligeså spændt på at høre om det virkede :)
16. april 2010 - 21:44 #7
danco, ikke helt forstaaet - du spoerger "Hvordan kan det haenge sammen?"  Hvordan kan hvad haenge sammen?

Det er korrekt (saa vidt jeg ved) at fremmednoegler ikke understoettes i MyISAM. 

Men naar du siger:  "umiddelbaert ser det ogsaa ud til at der bruges fremmednoegler.." referere du saa til mit loesningsforslag og mener du at jeg har defineret fremmednoegler?  Jeg har ikke defineret fremmednoegler fordi det ligger udenfor spoergsmaalet.  Hvis jeg selv skulle bruge det ville jeg sikkert have defineret fremmednoegler fra Ingredienser.opskrift_id til Opskrift.opskrift_id og, hvis en Ingredienstabel skulle bruges, fra Ingredienser.ingrediens_id til Ingrediens.ingrediens_id og saa brugt InnoDB engine.

(Jeg har set en udbredt sammenblanding af fremmednoegle med join queries.  En fremmednoegle for eksempel fra Ingredienser.opskrift_id til Opskrift.opskrift_id sikrer den referentielle integritet saaledes at der ikke i Ingredienser kan indsaettes en opskrift_id der ikke eksisterer i Opskrift, men det er sikkert muligt at joine Opskrift med Ingredienser ON Opskrift.opskrift_id = Ingredienser.opskrift_id uden at der er fremmednoegle.)
Avatar billede danco Nybegynder
16. april 2010 - 21:57 #8
Christian,
Tak, du forklarede så væsentlig ud over min tvivl, men det beklager jeg naturligvis at jeg ikke har formuleret mig ordentligt.
Men med din forklaring her er jeg bare endnu mere enig med dig :)

Super, og endnu engang tak for forklaringen.
16. april 2010 - 22:00 #9
Saa mangler vi bare reaktion fra DonTorro.  Jeg haaber stadig.
Avatar billede DonTorro Nybegynder
19. april 2010 - 15:34 #10
Hey.. Undskyld jeg først svarer nu :)
Det hele virker perfekt, på nær lige den sætter en tom ingrediens for meget ind :) men det er nok ikke her vi skal finde løsningen på det..

Tusind tak for hjælpen!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester