[mySQL/PHP] database ontwerp

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NEOeo
  • Registratie: December 2003
  • Laatst online: 19:06
Ik hoop dat iemand mij even verder kan helpen het volgende probleem.

Ik heb 3 dropdownmenu's
1e=merk, 2e=type, 3e=providers.

Ik heb nu gewoon 1 tabel met merk en type.

Hoe koppel ik meerdere providers aan 1 type?

Dus iets als select * from providers where type = 'type'; waarbij dan alle providers bij dat type in het dropdownmenutje tevoorschijn komen

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Ja dat kan met een select statement. Kun je wat verder uitleggen wat je probleem dan is? Wat heb je al......?

Acties:
  • 0 Henk 'm!

  • Arethusa
  • Registratie: December 2003
  • Laatst online: 19-09 15:38

Arethusa

Niet die server

Je kunt ook 3 tabellen gebruiken met een relatie naar andere tabellen.

[ Voor 35% gewijzigd door Arethusa op 26-09-2008 22:45 ]

I've been mad for fucking years, absolutely years, been over the edge for yonks.
Vinyl: Discogs


Acties:
  • 0 Henk 'm!

  • NEOeo
  • Registratie: December 2003
  • Laatst online: 19:06
Ja oke.
Er horen bij de types dus verschillende providers.

Er komen misschien wel 1000 verschillende mogelijkheden, dus een simpele select statement lijkt me niet handig denk ik.

Ik doelde dus eigenlijk op relatie tabellen, maar hoe kan ik daar meerdere providers in 1 rij kwijt?

=====================
ID | merk | type | providers
=====================

[ Voor 21% gewijzigd door NEOeo op 26-09-2008 22:58 ]


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Wat bedoel je precies met 'merk' en type? Een type telefoon dat bij bepaalde providers beschikbaar is? Dus je krijgt dan een lijst van telefoons, een lijst van providers, en een koppeling daar tussen (foreign keys you know....)? En type een gewoon attribuut?

Met alle respect, maar is zoiets niet handig voor je? http://www.tekstenuitleg....rsus_database_ontwerpen/1 Of een boek over databases en normaliseren? Lijkt me dat je beter bij het begin kan beginnen.

[ Voor 31% gewijzigd door Noork op 26-09-2008 23:09 ]


Acties:
  • 0 Henk 'm!

  • NEOeo
  • Registratie: December 2003
  • Laatst online: 19:06
Oke bedankt voor het opweg helpen.

Ik snap alleen nog niet hoe ik dan meerdere ID's (dus meerdere providers) in 1 cel krijg.

[ Voor 10% gewijzigd door NEOeo op 26-09-2008 23:16 ]


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

NEOeo schreef op vrijdag 26 september 2008 @ 23:16:
Oke bedankt voor het opweg helpen.

Ik snap alleen nog niet hoe ik dan meerdere ID's (dus meerdere providers) in 1 cel krijg.
Niet, die stop je in de andere tabel

1.Tabel: #merk +#type
(select type1 from tab1 where merk=data)

2 tabel providers koppeling
(#type,#provider) -> per type meer providers
(select providersnum from koppeling where type=type1)

3 tabel provider
#provider, providernaam, provider adres.
(select providernaam from priovider where #providder=providersnum

Als je meer id in 1 veld moet stoppen is je ontwerp niet goed. (Nooit zo ontwerpen)
database normalisatie heet dat en daar is heel veel over te vinden.

[ Voor 8% gewijzigd door leuk_he op 26-09-2008 23:28 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


  • NEOeo
  • Registratie: December 2003
  • Laatst online: 19:06
oke dan thanks.

Ik ben nog niet zolang bezig met databases op een hoger niveau, zoals je kunt zien.

Nog 1 laatste vraag:
Ik zet het ID in het value veld van de dropdownlijst. Hoe krijg ik de naam die bij dat ID hoort die dus in een andere tabel staat in het naam veld?

Ik doe nu dus het volgende:
PHP:
1
2
3
4
5
6
7
8
<select>
    $sql = "SELECT * FROM types";
    $sql_resultaat = mysql_query($sql);
    while ($rij = mysql_fetch_array($sql_resultaat))
    {
            echo "<option value='".$rij[merk_ID]."'>????????</option><br>";
    }
</select>

[ Voor 68% gewijzigd door NEOeo op 27-09-2008 14:23 ]


  • gizmo9003
  • Registratie: November 2000
  • Laatst online: 20-09 13:10

gizmo9003

Go For It!

NEOeo schreef op zaterdag 27 september 2008 @ 13:22:

Nog 1 laatste vraag:
Ik zet het ID in het value veld van de dropdownlijst. Hoe krijg ik de naam die bij dat ID hoord die dus in een andere tabel staat in het naam veld?
Je zegt eerst dat er verschillende providers bij 1 merk horen. Hoe wil je dan een dropdown list maken, met meerdere namen per merk???? Of bedoel je de merknaam die bij dat ID hoort?

Ik neem aan dat je in de tabel merken, zowel een kolom ID, als een kolom TYPE, als een kolom NAAM hebt staan dan....

tjah..


  • NEOeo
  • Registratie: December 2003
  • Laatst online: 19:06
owjah ik zie het al ik ben erg dom aan het doen :P
sorry..

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom ben je aan het ontwerpen tijdens het programmeren en niet voordat je begint? :X

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

-NMe- schreef op zaterdag 27 september 2008 @ 14:45:
Waarom ben je aan het ontwerpen tijdens het programmeren en niet voordat je begint? :X
Omdat tegen de tijd dat jij je ontwerp hebt opgezet en gaat implementeren je er 9/10 keer achterkomt tijdens development dat je ontwerp alweer in de tussentijd achterhaald is geworden. Waterfall model is achterhaald enzo. Je kan niet alles al van te voren aan zien komen. Probeer agile development eens, het is niet alleen maar buzzwords alhoewel die ook zou voorschrijven nu dat je iig een klein opzetje hebt als dat is wat je bedoelde, maar iig geen geheel ontwerp al.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat werkt voor mensen die weten wat databasenormalisatie is prima, maar voor de topicstarter zou ik die manier van werken niet willen aanraden. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Je kunt ook een veld opnemen met providers hoor.

SQL:
1
2
3
4
5
6
7
8
9
10
11
+--------------+-------+-----------------------+
| merk         | model | provider              |
+--------------+-------+-----------------------+
| Nokia        | 3310  | KPN,Vodafone,T-Mobile |
| Nokia        | 6330  | KPN,Vodafone          |
| Nokia        | 6210  | KPN,Vodafone          |
| Nokia        | 2430  | T-Mobile              |
| SonyEricsson | k800i | Vodafone,T-Mobile     |
| SonyEricsson | k620  | Vodafone              |
| Samsung      | s30   | KPN,T-Mobile          |
+--------------+-------+-----------------------+


PHP:
1
2
3
$result = mysql_query("SELECT providers FROM mytable WHERE merk = '$merk' AND model = '$model' LIMIT 1;");
$row = mysql_fetch_array($result);
$supported_providers = explode(',',$row[0]);


Het is alleen niet erg slim om dit te doen. Je kunt bijvoorbeeld niet gemakkelijk alle Nokia telefoons selecteren met KPN netwerk. Verder krijg je nu heel vaak dezelfde strings in je database.

Ik zou zoiets doen (met de kanttekening dat ik nog nooit een boek over database normalisatie heb gelezen)

SQL:
1
2
3
4
5
6
7
8
9
10
11
+--------------+-------+-----+----------+----------+
| merk         | model | KPN | Vodafone | T-Mobile |
+--------------+-------+-----+----------+----------+
| Nokia        | 3310  | 1   | 1        | 1        |
| Nokia        | 6330  | 1   | 1        | 0        |
| Nokia        | 6210  | 1   | 1        | 0        |
| Nokia        | 2430  | 0   | 0        | 1        |
| SonyEricsson | k800i | 0   | 1        | 1        |
| SonyEricsson | k620  | 0   | 1        | 0        |
| Samsung      | s30   | 1   | 0        | 1        |
+--------------+-------+-----+----------+----------+


PHP:
1
2
3
4
5
6
$result = mysql_query("SELECT * FROM mytable WHERE merk = '$merk' AND model = '$model' LIMIT 1;");
$providers = mysql_fetch_assoc($result);
$supported_providers = array();
foreach ($providers as $provider => $supported) {
   if ($supported == 1) array_push($supported_providers, $provider);
}

TabCinema : NiftySplit


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik stel toch voor dat je dat boek gaat lezen, Bozozo, want wat je nu voorstelt is niet bepaald goed. ;) Als je in jouw voorstel een provider wil toevoegen moet je je programmacode én je databasemodel aan gaan passen. Daar zijn koppeltabellen voor verzonnen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • NEOeo
  • Registratie: December 2003
  • Laatst online: 19:06
Oke bedankt voor alle hulp mensen.
Ik weet voorlopig genoeg :D

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

In de PHP code verandert helemaal niets als er een provider bij komt (echt waar :9 ).
In de database voeg je een nieuwe kolom toe, default 0, waarna je alle toestellen die hem ondersteunen een 1 geeft.

Met gekoppelde tabellen heb je ook problemen. Het lijkt het me bijvoorbeeld erg lastig om zowel op te vragen 'Alle providers die een bepaalde telefoon aanbieden' als 'Alle telefoons die een bepaalde provider aanbiedt'. Verder moet je op gaan passen voor hetzelfde modelnummer bij verschillende merken.

TabCinema : NiftySplit


Verwijderd

Bozozo schreef op zaterdag 27 september 2008 @ 16:00:
In de PHP code verandert helemaal niets als er een provider bij komt (echt waar :9 ).
In de database voeg je een nieuwe kolom toe, default 0, waarna je alle toestellen die hem ondersteunen een 1 geeft.
Doe de rest van de wereld een lol en blijf weg uit dit soort onderwerpen als je niet bereid bent iets te leren van mensen met stukken meer ervaring dan jij.

Stug vasthouden aan je eerste brainfart is over het algemeen behoorlijke bad practise, maar aan de andere kant hebben websites als The Daily WTF daardoor wel hun bestaansrecht.
Met gekoppelde tabellen heb je ook problemen. Het lijkt het me bijvoorbeeld erg lastig om zowel op te vragen 'Alle providers die een bepaalde telefoon aanbieden' als 'Alle telefoons die een bepaalde provider aanbiedt'.
Het stelt weinig voor. Misschien lijkt het moeilijk, maar dat is alleen als je het nog nooit hebt gedaan.
Verder moet je op gaan passen voor hetzelfde modelnummer bij verschillende merken.
Alleen als je een niet garandeerd unieke eigenschap als primaire sleutel kiest.

  • martijnve
  • Registratie: December 2004
  • Laatst online: 16:12
Bozozo schreef op zaterdag 27 september 2008 @ 16:00:
In de PHP code verandert helemaal niets als er een provider bij komt (echt waar :9 ).
In de database voeg je een nieuwe kolom toe, default 0, waarna je alle toestellen die hem ondersteunen een 1 geeft.

Met gekoppelde tabellen heb je ook problemen. Het lijkt het me bijvoorbeeld erg lastig om zowel op te vragen 'Alle providers die een bepaalde telefoon aanbieden' als 'Alle telefoons die een bepaalde provider aanbiedt'. Verder moet je op gaan passen voor hetzelfde modelnummer bij verschillende merken.
Die vragen zijn in een db met 3 tabellen veel makkelijker te beantwoorden dan met jouw voorbeeld.

SQL:
1
2
select t.merk, t.model from telefoons as t, biedt_aan as b, providers as p 
where b.telefoon_id = t.id and b.provider_id = p.id and p.naam = "kpn";
SQL:
1
2
select p.naam from telefoons as t, biedt_aan as b, providers as p
where b.telefoon_id = t.id and b.provider_id = p.id and t.merk = "nokia" and t.model = "3310";

[ Voor 52% gewijzigd door martijnve op 27-09-2008 16:37 ]

Mini-ITX GamePC: Core i5 3470 | 16GB DDR3 | GTX 970 4GB | Samsung 830 128GB | Dell u2711 (27", IPS,1440p), 2343BW


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Bozozo schreef op zaterdag 27 september 2008 @ 16:00:
In de PHP code verandert helemaal niets als er een provider bij komt (echt waar :9 ).
Mag je mij vertellen hoe jouw script/programma vervolgens data uit die nieuwe kolom uitleest, interpreteert en ernaartoe kan schrijven. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

@ Cheatah: ik ben best bereid te leren. Ik neem graag aan dat mijn brainfart volkomen onjuist is, maar het is wel een idee waar veel beginners mee zullen komen. Als jij vervolgens aangeeft tegen welke problemen je gaat aanlopen met die werkwijze (zie reactie NMe) kan ik, en een meelezer van hetzelfde niveau, daar iets van leren. Verder voegt de onbeleefde toon waarmee je (zoals regelmatig) reageert helemaalt niets toe, integendeel.

TabCinema : NiftySplit


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Bozozo schreef op zaterdag 27 september 2008 @ 17:17:
@ Cheatah: ik ben best bereid te leren. Ik neem graag aan dat mijn brainfart volkomen onjuist is, maar het is wel een idee waar veel beginners mee zullen komen.
Er zijn inderdaad veel beginners die met dat idee zullen komen, alleen komen ze er niet ver mee. Echter, omdat jij het bijna als waarheid verkondigde in je vorige post en bovendien de goeie oplossing afdeed als "te lastig". Cheatah reageert inderdaad een beetje bot, maar zijn punt is valide. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Mensen met veel meer ervaring hebben meestal gelijk. Het afblaffen van iemand die ook gewoon zijn best doet is daarmee niet gerechtvaardigd.

TabCinema : NiftySplit


  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Verwijderd schreef op zaterdag 27 september 2008 @ 16:07:
[...]
Stug vasthouden aan je eerste brainfart is over het algemeen behoorlijke bad practise, maar aan de andere kant hebben websites als The Daily WTF daardoor wel hun bestaansrecht.
Site Kende ik niet. Toch nog iets geleerd vandaag.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Verwijderd

Bozozo schreef op zaterdag 27 september 2008 @ 17:17:
@ Cheatah: ik ben best bereid te leren. Ik neem graag aan dat mijn brainfart volkomen onjuist is, maar het is wel een idee waar veel beginners mee zullen komen. Als jij vervolgens aangeeft tegen welke problemen je gaat aanlopen met die werkwijze (zie reactie NMe) kan ik, en een meelezer van hetzelfde niveau, daar iets van leren. Verder voegt de onbeleefde toon waarmee je (zoals regelmatig) reageert helemaalt niets toe, integendeel.
Waarom verdedig je dan je brainfart? Als wordt aangeraden toch eens dat boek te gaan lezen, lees je ook meteen wat er verkeerd gaat als je jouw werkwijze hanteert. En als ik helemaal eerlijk moet zijn, dan weet ik dat zelf ook niet. Ik neem ook niet de moeite om erover na te denken tegen welke problemen ik aan zou lopen als ik een methode zou hanteren waarvan ik weet dat er veel onnodige problemen zullen zijn als ik die hanteer.

Dadelijk openen andere beginners dit topic, ze copy/pasten jouw code, en vervolgens zitten ze op hetzelfde dwaalspoor. Alleen maar omdat ze niet even de theorie van het normaliseren hebben doorgenomen.

Het probleem is niet dat je een beginnersfout maakt, het probleem is dat je wéét dat je niets van normaliseren weet en dat je tóch een oplossing probeert aan te dragen. En nadat je daarop wordt gewezen, los je niet het probleem op, je maakt het erger door je eigen methode, waarvan je net te horen hebt gekregen dat die niet goed is, tóch gaat verdedigen.

Als je zo graag dingen wilt leren zoals je aangeeft, stop dan in elk geval met andere mensen verkeerde dingen aanleren.

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 16:06
Normaliseren is echt een vereiste. Nu met drie providers is het nog wel bij te werken. Maar als je ook nog per provider wilt gaan aangeven of het toestel prepaid of abo is en desnoods ook nog welke abo's ga je echt helemaal vast lopen wil je vast blijven houden aan een tabel.

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Verwijderd schreef op zaterdag 27 september 2008 @ 17:34:
[...]
Waarom verdedig je dan je brainfart? (...) Als je zo graag dingen wilt leren zoals je aangeeft, stop dan in elk geval met andere mensen verkeerde dingen aanleren.
Ik post mijn idee en verdedig het. Mensen die het beter weten dan ik laten vervolgens zien waarom het niet zo slim is (subcategoriën in Providers zorgt inderdaad voor een onoverzichtelijke rommel) en dus moet ik toegeven dat ik ernaast zit. Andere lezers leren geen verkeerde dingen, maar zien de fouten die ik maak en vermijden die hopelijk zelf.

Je eigen idee niet posten (of verdedigen) omdat het wel eens fout zou kunnen zijn vind ik een slecht alternatief.

TabCinema : NiftySplit

Pagina: 1