Aantal SQL commando's per pagina best zo weinig mogelijk te houden ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Davy Carmans

Davy Carmans

21/10/2013 21:28:54
Quote Anchor link
Hoi allemaal,

in de tool die ik aan het proberen bouwen ben, heb ik wel een veld of 30 waar keuzes uit materialen worden gemaakt. Deze keuzes komen elk in de tabel in een veld.

Als ik nu de "Edit" pagina wil vullen, dan moet ik per veld een nieuwe SQL lookup doen van de waarde van het veld in de tabel.

Dat betekent dat ik PER op te zoeken veld dus een $SQL commando moet uitvoeren en dat in een $row steken.

Kan dit niet op een betere manier ? Het gaat wel degelijk allemaal over aparte velden.

groetjes,

Davy
 
PHP hulp

PHP hulp

17/11/2024 20:49:24
 
Aad B

Aad B

21/10/2013 21:59:01
Quote Anchor link
Aparte velden in één tabel in één of aparte velden in meerdere tabellen in andere records? Hoe zit je datamodel in elkaar en hoe zien je tabellen eruit? Kan je niet alles ophalen in één query?
 
Davy Carmans

Davy Carmans

21/10/2013 22:04:48
Quote Anchor link
Aad,

ik heb een tabel met alle materialen waarbij "materiaalID" de index is.
In een tabel waar ik "meubels" heb zitten, heb ik bv voor het veld "corpusmateriaal" een materiaalID zitten (bv 6). In een veld "tabletmateriaal" heb ik een materiaalID zitten (bv 28).

Als ik die velden in een EDIT form dus wil invullen met de naam van het materiaal doe ik een SQL selectie met opzoeken van het materiaalID en dan de naam teruggeven in het veld.

Dat betekent dus dat ik per veld waar ik het gekozen materiaal wil hebben een aparte lookup moet doen, dat is tenminste wat ik denk !

Groetjes,

Davy
 
Aad B

Aad B

21/10/2013 22:38:39
Quote Anchor link
Wat is je uitgangspunt, wil je een hele berg materialen tegelijk editten of wil je een bepaald item editten, bijvoorbeeld een of meerdere meubels. Je kan dan de tabel materialen en de tabel meubels joinen. Of in een ander geval, tablets editten, de tabel materialen en de tabel tabletmateriaal joinen. Wil je alles tegelijk editten dan creeer je een union van de eerste en de tweede query. Wordt wel wat uitzoekwerk met updaten....
 
Davy Carmans

Davy Carmans

21/10/2013 22:45:55
Quote Anchor link
Eigenlijk editeer ik telkens 1 meubel.
Maar, elk meubel bestaat uit onderdelen (zoals bv een deur en een zijkant).
Beide onderdelen "kunnen" uit verschillende materialen bestaan.

Op mijn edit pagina toon ik dus een knop om het materiaal te kiezen voor de deur.
Daaronder toon ik een knop om het materiaal te kiezen voor de zijkant.
Ik toon niet de ID (alhoewel ik die hidden wel bij hou) maar de benaming en de dikte van het materiaal.

Als ik dit meubel ga editeren, zie ik dus beide materialen weer staan bij respectievelijk hun onderdeel.

Ik moet op dat moment via de (hidden) ID weer opnieuw de benaming en dikte gaan opzoeken.


Toevoeging op 21/10/2013 22:46:34:

P.S. Ik wil dus niet de tabel met materialen aanpassen hier !


Toevoeging op 21/10/2013 22:50:47:

Ook al heb ik hier nog niet alle selectie velden aangepast naar knoppen, toch kan de paste misschien wat meer inzicht geven.

Enerzijds heb ik hier de creatie pagina : http://pastebin.com/yCacsRmL

Anderzijds de EDIT pagina die ik nu probeer in orde te krijgen : http://pastebin.com/U8n16TJu
 
Erwin H

Erwin H

22/10/2013 00:10:06
Quote Anchor link
1200 regels code is me iets te veel, dus ik heb niet je code bekeken. Maar in zijn algemeenheid valt te zeggen dat je inderdaad het aantal database calls zoveel mogelijk wilt beperken per pagina.
In jouw geval zou er volgens mij een link moeten zijn tussen product dat je edit, de onderdelen en de materialen. Je zou, grofweg gezegd, een tabel producten moeten hebben, een tabel onderdelen en een tabel materialen. Daarnaast ook een link tabel tussen de onderdelen en de materialen. Als dat zo is, dan kan je alle materialen voor alle onderdelen voor het te editen product met 1 vrij simpele query ophalen. Middels joins kan je alles aan elkaar rijgen.
Gewijzigd op 22/10/2013 00:10:56 door Erwin H
 
Davy Carmans

Davy Carmans

22/10/2013 19:20:10
Quote Anchor link
Erwin,

bedankt voor je antwoord, maar ik vrees dat het hier in dit geval onmogelijk is om met joins te gaan werken. Of ik moet het op dit moment "even niet inzien".

Ik was al aan het denken om de SQL en RESULT te gaan moven naar een functie. Zodoende zijn er nog wel even veel calls maar dan wordt de code toch wat overzichtelijker.

groetjes,

Davy
 
Erwin H

Erwin H

22/10/2013 19:30:36
Quote Anchor link
Onmogelijk is het (bijna) nooit, dus ik zet mijn geld op dat je het even niet ziet. Wat is de structuur van je tabellen en hoe zijn die (voor wat betreft het probleem nu) aan elkaar gelinkt?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/10/2013 19:32:54
Quote Anchor link
In het algemeen kan je stellen, dat je nooit query's uit moet voeren binnen een lus van een andere query, gebaseerd op resultaten van die andere query.
Dit kan in 99,99% van de gevallen met een join opgelost worden.

Ik heb ook niet al je code doorgekeken, als je (met bovenstaande in het achterhoofd) twijfels hebt laat dan de relevante code hier zien.
 
Davy Carmans

Davy Carmans

22/10/2013 20:15:28
Quote Anchor link
Ik heb de volgende tabellen :

1. Materiaal
2. Meubels

in de tabel van meubels hou ik voor elke gekozen materiaal (per onderdeel) de ID bij. Dus bv als je dekorzijdes kiest, dan is er in de "meubels" tabel een veld "dekorzijdemat" waarin bv 30 staat.

Is dit een join ? Of gewoon een lookup ?

Ik gebruik die 30 dan als opzoekwaarde om de gegevens van materiaal 30 te vinden en te tonen. Maar die gegevens komen NIET in de "meubels" tabel.

Ik begrijp niet goed hoe een join voor mij hier kan helpen. Dus ik "zie het niet" (sorry daarvoor).
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/10/2013 11:24:32
Quote Anchor link
Als ik het zo zie, dan zou je op zijn minst drie tabellen nodig hebben, een stoel heeft houten poten, en lederen rugstuk en een rieten bipszitting dus een stoel kan uit meerdere materialen bestaan, en een ander meubel kan ook uit diezelfde materialen staan.
Kortom een n-n relatie tussen meubels en materialen, dus een koppeltabel.
 
Erwin H

Erwin H

23/10/2013 11:43:10
Quote Anchor link
Zo te zien schoort er nog wel iets in het database ontwerp, maar wat je nu beschrijft is dus inderdaad prima voor een join.
Voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT...
FROM meubels a
LEFT JOIN materiaal b ON a.dekorzijdemat = b.id

En zo kan je voor elk onderdeel de join maken en alles in 1 query ophalen.
Bedenk alleen wel wat Ger zegt. Zo te zien heb je linktabellen nodig, want niet elk meubel heeft elk onderdeel en dus wil je eigenlijk niet in je meubels tabel alle mogelijke onderdelen hebben, maar dat doe je in een link tabel die ik eerder ook al benoemde:
Erwin H op 22/10/2013 00:10:06:
Je zou, grofweg gezegd, een tabel producten moeten hebben, een tabel onderdelen en een tabel materialen. Daarnaast ook een link tabel tussen de onderdelen en de materialen.
 
Davy Carmans

Davy Carmans

24/10/2013 16:48:36
Quote Anchor link
Ger, Erwin,

ik probeer me voor te stellen wat jullie bedoelen. En eigenlijk begrijp ik best wat jullie willen zeggen.

Maaaaaar, ik denk dat de manier waarop mijn tool moet werken niet echt op deze manier kan.

Het is idd zo dat er "materialen" zijn. Bv een plank melamime van 4m op 2m met een dikte van 2cm. Dat is voor mij 1 materiaal.

De persoon die het meubel gaat samenstellen, krijgt een scherm te zien waarop hij heel wat zaken kan invullen. De meest normale zaken zijn hoe hoog, hoe breed en hoe diep de kast moet zijn. Na deze waarden in te geven, kiest hij 1 materiaal uit de lijst waarvan de "body" (ook wel corpus genoemd) gemaakt moet worden. In principe kan deze kast nu al klaar zijn, maar er volgt een hele waslijst van mogelijke opties.

Bijvoorbeeld, op één regel kan hij kiezen of er bv een rug (wand) moet zijn. Als hij het vinkje aanklikt, dan moet hij voor die rug opnieuw een soort materiaal kiezen. Dat mag, maar zal meestal niet zo zijn, het zelfde materiaal zijn.
Dan kiest hij of er deuren moeten zijn. Deze deuren gaan dikwijls een ander (mooier) soort materiaal zijn.

Als hij daarna een tweede kast kiest, dan kan de configuratie helemaal anders zijn.

Er lijkt mij dus nergens een "link" (join ?) te zijn op basis van het meubel en de gekozen materialen. Ik houd daarom in mijn tabel gewoon de aangevinkte optie bij en het ID van het gekozen materiaal. Met dat ID kan ik zonder problemen later de naam en dikte van het materiaal gaan opzoeken als dat nodig is.

Maar omdat ik dus zoveel velden in mijn form heb, waarbij ik de naam en dikte wil vermelden, moet ik dus voor ELK aangevinkt veld de naam gaan opzoeken.

Draait dit de zaken om ? Of moet ik alsnog proberen in te zien hoe deze join mij kan helpen ? :-)

Sorry, je ziet waarom het in de "beginners" folder staat.

Groetjes,

Davy
 
Erwin H

Erwin H

24/10/2013 17:46:09
Quote Anchor link
Het lijkt er nog steeds op dat je database structuur verkeerd is. Ondermeer omdat je dit zegt:
Davy Carmans op 24/10/2013 16:48:36:
Maar omdat ik dus zoveel velden in mijn form heb, waarbij ik de naam en dikte wil vermelden, moet ik dus voor ELK aangevinkt veld de naam gaan opzoeken.

Hieruit maak ik op (maar verbeter me als ik het verkeerd begrijp) dat je een tabel hebt met daarin de keuzes van de gebruiker met een kolom voor elk mogelijke materiaal danwel onderdeel. En alleen die velden waarin een 'vinkje' staat (om het even zo te noemen) zijn geselecteerd. Als dat inderdaad zo is, dan heb je echt een verkeerd model. Dit betekent namelijk dat je een voornamelijk lege database hebt en dat als je er eens een nieuw onderdeel danwel materiaal bijkrijgt dat je je database model moet gaan aanpassen. Dat is echt uit den boze.

Wat je zou moeten hebben is in eerste instantie een splitsing tussen de mogelijke produkten/onderdelen/materialen enerzijds en de opdracht van de klant anderzijds. In principe zijn de produkten/onderdelen/materialen statische tabellen waarin niet vaak iets veranderd. Die hebben gewoon allemaal een id, naam en wat kenmerken.

Anderzijds heb je een tabel 'opdracht' (oid), waarin een klant een opdracht kan gaan maken. Laten we even voor het gemak zeggen dat elke opdracht altijd maar voor 1 produkt is, dus in de opdracht tabel staat een produkt_id (wat linkt naar de tabel produkten, bijvoorbeeld kast, stoel etc). Vervolgens moet de klant hier onderdelen aan linken. Daarvoor heb je dus een linktabel nodig, die de opdracht tabel linkt naar de onderdelen tabel en in die link tabel heb je bijvoorbeeld de velden opdracht_id, onderdeel_id en wat verder nog meer van toepassing is. Ook is er een opdracht_onderdeel_id, zodat je daarmee de volgende kan linken, namelijk de materialen. Per onderdeel selecteer je namelijk 1 of meerdere materialen en daar heb je dus weer een link tabel voor nodig. Daarin heb je dan dus het opdracht_onderdeel_id staan, materiaal_id, kleur, dikte en wat je nog meer belangrijk vind.

Op deze manier is alles aan elkaar gelinkt en kan je het ook met 1 query ophalen.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

24/10/2013 18:16:31
Quote Anchor link
Lol, ik was al met een soortgelijk verhaal bezig. Dus ben het er mee eens ;-)

Nog een bijkomend voordeel is dat je ook nog de onderdelen aan de producten kan linken, want niet elk product kan uit de zelfde onderdelen hoeven te bestaan. (ik heb nog nooit een stoel met een deur gezien)
 
Davy Carmans

Davy Carmans

27/10/2013 11:48:06
Quote Anchor link
Ger, Erwin,

ik zie het op dit moment nog steeds niet helemaal. Mijn excuses daarvoor.
Waarschijnlijk komt het omdat ik met een "ander verhaal" in mijn hoofd zit.

Is er een manier waarop ik mijn tabelstructuren aan jullie kan laten zien op een makkelijke manier ? Want ik heb nog steeds het gevoel dat mijn verhaal niet strookt met jullie voorstel.

Ik bouw nl geen "stoel" die altijd het zelfde materiaal bevat en zo.

We bouwen meubels op maat die elke keer helemaal anders zijn. Er is nooit geweten of er al dan niet een bepaald onderdeel nodig is.

Ik heb één hoofdscherm waar ik de gebruiker laat kiezen (via checkboxes) of er voor dit meubel een "bepaald" onderdeel nodig is. Als dat aangevinkt is, kan hij dan het soort materiaal kiezen en eventueel extra maten.

Per meubel houd ik alles in één tabel bij met de waarde "1" als een checkbox werd aangevinkt en de ID van het materiaal in het veld voor het materiaal van dat specifieke onderdeel.

Ik ben er van overtuigd dat jullie 100000 keer meer weten dan mij, dus ik ben er van bewust dat ik het plaatje niet helemaal snap... :-)

Groetjes,

Davy
 
Erwin H

Erwin H

27/10/2013 15:34:01
Quote Anchor link
Davy Carmans op 27/10/2013 11:48:06:
Ik bouw nl geen "stoel" die altijd het zelfde materiaal bevat en zo.

We bouwen meubels op maat die elke keer helemaal anders zijn. Er is nooit geweten of er al dan niet een bepaald onderdeel nodig is.

Juist OMDAT het elke keer anders is moet je die tabelstructuur zo gaan maken zoals Ger en ik zeggen. Juist OMDAT het elke keer anders is wil je zo dynamisch mogelijk linken kunnen leggen tussen product, onderdelen en materialen. Lees nu nog een paar keer mijn vorige post en begin het te snappen.

Verder mag je best jouw tabelstructuur laten zien, maar dat heeft niet zoveel zin als je het mij vraagt want die is verkeerd.

Zoals je het wat mij betreft zou moeten hebben (min of meer):

De statische tabellen met in principe de mogelijk keuzes voor de klant:
Produkten tabel
- produkt_id
- naam
- omschrijving

Onderdelen tabel
- onderdeel_id
- naam
- omschrijving

Materialen tabel
- materiaal_id
- naam
- omschrijving

De tabellen met gegevens per opdracht van de klant:
Opdrachten tabel
- opdracht_id
- klant_nummer
- produkt_id
- aanmaak_datum

Link tabel naar onderdelen
- opd_ond_id
- opdracht_id
- onderdeel_id

Link tabel naar de materialen
- opd_ond_id
- materiaal_id
- kleur
- dikte
- breedte
- diepte
- etc
 
Davy Carmans

Davy Carmans

27/10/2013 15:49:32
Quote Anchor link
Erwin,

nogmaals bedankt.
Als ik het via deze nieuwe (betere) manier ga doen, waarvoor mijn dank, kan ik dan nog steeds de gebruiker alle aparte onderdelen laten ingeven op één pagina ?

Afbeelding

Groetjes,

Davy
 
Erwin H

Erwin H

27/10/2013 16:18:19
Quote Anchor link
Natuurlijk! Hoe je iets op een pagina toont heeft niets, maar dan ook helemaal niets te maken met hoe het in de database staat. Data laag en presentatie laag zijn niet voor niets in goede applicaties van elkaar gescheiden!
 
Eddy E

Eddy E

27/10/2013 16:57:43
Quote Anchor link
In plaats van de checkboxen jou je ook gewoon 0 stuks kunnen weergeven. Of leeg.
En zodra iemand daar 1 (of meer) van maakt, tel je hem mee.
Scheelt weer een hoop HTML en een hoop controle.
Wat als iemand bij "leggers" wel het vinkje aanzet, maar geen aantal invult?
Laat dan (enkel en alleen) het aantal invullen.
Bij materiaal idem dito: niets opgegeven = niets.
Iets opgeven = ja, blijkbaar willen ze iets.

Let wel dat (bij de materiaalkeuze) dan de mogelijkheid moet zijn om dit weer te verwijderen.
 
Davy Carmans

Davy Carmans

27/10/2013 21:21:24
Quote Anchor link
Eddy, die controles zitten er ondertussen al allemaal in ! Daardoor is het al een hele hoop code... :-)
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.