Vinnaren i pepparkakshustävlingen!
2006-05-03, 11:23
  #1
Medlem
genos avatar
Hejsan... jag sitter fast med ett litet problem...

jag vill använda mig av multipla separators i en array för att kunna loopa ut koden på ett speciellt sätt.
Låt oss säga att fältet i databasen innehåller:

Apelsiner£3€Bananer£6€Äpplen£4€

då vill jag att den ska kunna loopa ut detta som (det är värdet från ett databasfält):

Apelsiner 3st
Bananer 6st
Äpplen 4st

Jag har fått lite tips om att googla på multidimensional arrays... men jag lyckas inte hitta vad jag riktigt söker och undrar därför om någon här vet lösningen på mitt problem?
Citera
2006-05-03, 13:26
  #2
Medlem
Dengos avatar
Jag tror inte du förstår vad du bör använda en databas till. Använd tre kolumner, en för varje frukt, istället för en sträng med datan. Det är nästan alltid en dålig idé att kombinera och dela upp datan själv istället för att låta databasen göra sitt jobb.
Citera
2006-05-03, 13:41
  #3
Medlem
genos avatar
Citat:
Ursprungligen postat av Dengo
Jag tror inte du förstår vad du bör använda en databas till. Använd tre kolumner, en för varje frukt, istället för en sträng med datan. Det är nästan alltid en dålig idé att kombinera och dela upp datan själv istället för att låta databasen göra sitt jobb.
Jo jag förstår vad man använder en databas till... problemet är bara det att jag inte vet hur många "frukter" som behövs för varje rad i förväg.

Blir inte så smidigt att skriva in 15 fält typ:

fruit_1, fruit_1_number, fruit_2, fruit_2_number, fruit_3, fruit_3_number, fruit_4, fruit_4_number, osv.... och på vissa bara använda de tre första, medan jag på andra bara behöver alla 15... blir onödigt mycket kod för att plocka ut datan sen imo...
Citera
2006-05-03, 14:10
  #4
Medlem
pockis avatar
En rad för varje frukt?

Kod:
Fruktnamn Antal |
-------------------
Äpple       4       |
Banan      2       |
Päron       7       
Citera
2006-05-03, 15:41
  #5
Medlem
Kod:
Jag skulle nog personligen också hoppa över att 
konkatenera information i samma fält. Istället 
valde jag nog en lösning med t.ex. tre tabeller 
liknande dessa:

Table - Basket:
ID | Owner | (More columns)
---------------------------
0  | Lisa  |
1  | Marie |
2  | Elvis |

Table - Fruit:
ID | Name      | (More columns)
-------------------------------
0  | Apelsiner |
1  | Bananer   |
2  | Äpplen    |

Table - BasketFruit:
BasketID | FruitID | Quantity |
-------------------------------
0        | 0       | 3        |
0        | 1       | 6        |
0        | 2       | 4        |
1        | 1       | 8        |
1        | 2       | 2        |
2        | 2       | 10       |

För att sedan ta reda på vilka och hur många frukter 
som respektive korg innehåller kan jag t.ex. göra så 
här:

Example - View fruits and quantities for the basket 
          owner Lisa.
sql: select Name, Quantity from BasketFruit bf
     join Fruit f on bf.FruitID=f.ID where BasketID=0

Vilket ger resultatet:

Name      | Quantity
--------------------
Apelsiner | 3
Bananer   | 6
Äpplen    | 4

Detta var ett ganska simpelt exempel men det kanske 
ger dig lite inspiration eller idéer till din egen
uppgift.
Citera
2006-05-03, 17:55
  #6
Medlem
genos avatar
Tack för visat engagemang, även om det inte riktigt går att göra som ni föreslagit...

Tänk er det hela som "recept" över saker.

Jag har en tabell som är fylld med en massa ingredienser, mjöl, socker, smör, kakao, ägg osv.

Sen så har jag en tabell som innehåller alla recept.

Men för att inte behöva använda en massa onödiga fält (äggröra innehåller t.ex. bara 2 ingredienser, medan hemmagjord pyttipanna innehåller ett 10tal ingredienser) så vill jag slippa skapa en jävla massa fält och sedan måsta ha ifsatser för att kolla vilka fält som innehåller data när jag hämtar "recepten".

och det blir ju allmänt jobbigt att hantera överlag med en massa olika fält typ:
"ingrediens_1", "ingrediens_1_mängd", "ingrediens_2", "ingrediens_2_mängd",
det är därför jag behöver kunna sätta alla ingredienser samt mängden efter varje, i ett och samma fält....typ:
Kod:
Socker£2€Ägg£4€ (fast nu kommer det ju inte stå socker och ägg, utan dessa ingrediensers id:n från ingredienstabellen)
så att jag kan loopa ut dem som t.ex:
Socker 2dl
Ägg 4dl
Citera
2006-05-03, 18:44
  #7
Medlem
"äggröra" är en sträng du kan använda som den är liksom
"Socker 2dl
Ägg 4dl"


Varför inte ha den i databasen just så, med vanliga mellanslag och radbrytningar? Det du beskriver låter nästan lika barockt som att beskriva ordet "äggröra" med "1 ä, 2 g, 1 r, 1 ö, 1 r, 1 a".
Citera
2006-05-03, 22:54
  #8
Medlem
Kod:
Jag tror fortfarande att en variant på mitt tidigare
förslag vore alldeles ypperligt att använda i just ditt
exempel. 

Modifierat exempel anpassat för just ditt scenario:

Table - Recept:
ID | Recept       | Portioner | (More columns)
---+--------------+-----------+---------------
0  | Äggröra      | 3-4       |      
1  | Varm choklad | 4         | 
2  | Pannkaka     | 2         |

Table - Ingredienser:
ID | Ingrediens | (More columns)
---+------------+---------------
0  | Ägg        |
1  | Grädde     |
2  | Mjölk      |
3  | Socker     |
4  | Salt       |
5  | Vetemjöl   |
6  | Smör       |
7  | Kakao      |

Table - ReceptIngredienser:
ReceptID | IngrediensID | Quantity | 
---------+--------------+----------+
0        | 0            | 6-8 st   |
0        | 4            | 1/2 tsk  |
0        | 2            | 3-4 msk  |
0        | 6            | 2 msk    |
1        | 7            | 2 msk    |
1        | 3            | 3 msk    |
1        | 2            | 1 l      |
2        | 5            | 2 1/2 dl |
2        | 2            | 6 dl     |
2        | 0            | 3 st     |
2        | 4            | 1/2 tsk  |
2        | 6            | 2-3 msk  |

För att sedan ta skriva ut de olika recepten kan du 
göra som nedan med rena sql-frågor utan att behöva 
göra några som helst if-satser eller annan logik i
din applikation.

Exempel - Listning av ingredienser för äggröra:
sql: select Quantity, Ingrediens  
     from ReceptIngredienser ri join Ingredienser i 
     on ri.IngrediensID=i.ID where ReceptID=0
==>
     +---------+-------+
     | 6-8 st  | Ägg   |
     | 1/2 tsk | Salt  |
     | 3-4 msk | Mjölk |
     | 2 msk   | Smör  |
     +---------+-------+

Exempel - Listning av ingredienser för varm choklad:
sql: select Quantity, Ingrediens  
     from ReceptIngredienser ri join Ingredienser i 
     on ri.IngrediensID=i.ID where ReceptID=1
==>
     +---------+--------+
     | 2 msk   | Kakao  |
     | 3 msk   | Socker |
     | 1 l     | Mjölk  |
     +---------+--------+

Exempel - Listning av ingredienser för pannkaka:
sql: select Quantity, Ingrediens  
     from ReceptIngredienser ri join Ingredienser i 
     on ri.IngrediensID=i.ID where ReceptID=2
==>
     +----------+----------+
     | 2 1/2 dl | Vetemjöl |
     | 6 dl     | Mjölk    |
     | 3 st     | Ägg      |
     | 1/2 tsk  | Salt     |
     | 2-3 msk  | Smör     |
     +----------+----------+

Genom att göra ett liknande upplägg som i mitt exempel 
kan du dessutom enkelt göra sökningar efter t.ex:
alla recept som innehåller mjölk, alla recept där det
räcker med bara två ägg, osv.

Faktum är att detta är en för mig klassik databas- och
programmeringsuppgift vilken jag själv tvingats göra
för många herrans år sedan. Jag har dessutom använt 
mig av ett mycket snarlikt exempel i de kurser jag 
själv varit kursledare i.
Citera
2006-05-03, 23:08
  #9
Medlem
genos avatar
Alltså, verkligen, tack för engagemanget

Men... jag kan inte ha sådär... eller rättare sagt... det blir inte bra i det långa loppet (ja, jag vet att det är den "vanligaste" metoden att göra det på).

Då blir det inte så dynamiskt som jag tänkt att det ska vara (tro det eller ej)
Citera
2006-05-03, 23:12
  #10
Medlem
Dengos avatar
Som Dormie sa, det här är en klassisk hemläxa för att lära eleverna relationsdatabaslayout - just det här problemet är väl första introduktionen till M-M relationer, där varje rad i A & B kan vara relaterad till flera rader i motstående tabell, och man därför behöver en extra tabell A_B.
Citera
2006-05-03, 23:30
  #11
Medlem
Tja, om du envisas med din egen "dynamiska" lösning så får du väl lov att snegla på någon explode- eller splitfunktion. T.ex:

http://se.php.net/manual/en/function.explode.php
http://se.php.net/manual/en/function.split.php
http://se.php.net/manual/en/function.preg-split.php

Dock har jag svårt att se behovet utifrån den beskrivning du hittills gett av din uppgift.
Citera
2006-05-04, 09:04
  #12
Medlem
Stockos avatar
Att ha flera värden i ett databasfällt strider mot första normalformen.
I ditt fall med recept har en sådan design, förutom att den är ohyggligt ful, nackdelen att det blir svårare och långsammare att t.ex. söka upp alla recept som innehåller bacon.

Läs på om normalformerna om du vill designa databaser korrekt. Det finns självklart undantag med dom är få.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback