[PHP] 6+ GB database + OO

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wellicht had ik de topictitel beter kunnen omschrijven, maar het komt er wel ong. op neer, ik heb een database van 6+ GB en 100.000+ drivers op mijn server.

Aangezien ik dmv mijn cursus AMBI steeds meer over UML en OO leer wil ik nu ook mijn site herontwerpen in OO. Ik kom echter op het volgende probleem uit:

Op mijn site zijn meerdere zoek mogelijkheden, waaronder bijvoorbeeld Simple Search. Men kan hier de device (apparaat), manufacturer (fabrikant) en trefwoord opgeven en hier rollen vervolgens een aantal drivers uit.

Nu heb ik een UML ontwerp hiervoor gemaakt, namelijk met o.a de klasse Driver en een klasse Result. Met de klasse Driver kan 1 driver per keer worden opgehaald en niet een hele lijst d.m.v een SQL query. Nu wil ik dat de klasse Result een SQL query opbouwt d.m.v de zoekopdracht, bijv.

code:
1
2
3
4
5
SELECT *, MATCH(modelnumbers,file,fccID)  AGAINST (KEYWORD)  AS rank 
FROM drivers 
WHERE MATCH(modelnumbers,file,fccID) AGAINST ('KEYWORD') 
AND deviceID = 'DEVICE' 
AND OS LIKE 'OS'


Ik wil nu met de klasse Result een array van objecten vormen aan de hand van de klasse Driver. Of beter gezegd, d.m.v een loop wil ik objecten uit de klasse Driver halen d.m.v de SQL-query.

Dit lijkt mij echter niet mogelijk omdat Driver steeds slechts 1 driver teruggeeft en geen lijst van drivers.

Om het te verduidelijken, wat ik wil is dus dat de klasse Result een lijst met objecten Driver teruggeeft aan de hand van een SQL-query.

Nog een tweede vraag. Bij een zoekresultaat moet ook een becijfering/rank worden opgenomen, bijv. 98%. Dit gaat bijna automatisch met SQL dankzij de AGAINST-statement. Echter worden de resultaten bij een lijst van boven de 10 naar een volgende pagina verwezen. Als er bijvoorbeeld 100 resultaten zijn betekend dat dat er 10 pagina's met drivers aangemaakt worden. Maar hoe kan ik de becijfering/rank op de tweede pagina berekenen ?

Momenteel doe ik dit door aan de volgende pagina in de lijst de becijfering van het laatste resultaat mee te geven.

Ter voorbeeld:

1. 100%
2. 99%
3. 97%
4. 94%
5. 93%
6. 91%
7. 88%
8. 87%
9. 84%
10. 82%

Nu geef ik nummer 10 mee aan de volgende pagina. De becijfering word dan niet met 100 berekend maar met 82. Echter dit werkt niet correct, de becijfering klopt dan niet meer. Ik heb er vervolgens over gedacht om de resultaten in een tijdelijke session te stoppen, alleen zijn de resultaten van bijv. pagina 3 na 15 minuten niet meer bereikbaar omdat de session dan is verlopen en daarmee ook de resultaten.

Mocht het verhaal niet duidelijk genoeg zijn laat het me weten en ik licht het beter toe.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 20 december 2003 @ 01:06:
Wellicht had ik de topictitel beter kunnen omschrijven, maar het komt er wel ong. op neer, ik heb een database van 6+ GB en 100.000+ drivers op mijn server.
Heet de database "6+ GB" of is de database meer dan 6 Gigabyte groot?
En wat bedoel je met "100.000+ drivers"?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 20 december 2003 @ 01:34:
[...]

Heet de database "6+ GB" of is de database meer dan 6 Gigabyte groot?
En wat bedoel je met "100.000+ drivers"?
aan de query te zien heeft ie een tabel met daarin drivers of links naar die drivers ofzo..

Acties:
  • 0 Henk 'm!

  • -GSF-JohnDoe
  • Registratie: Juli 2002
  • Laatst online: 25-07 14:39

-GSF-JohnDoe

[insert tile here]

zo moeilijk is dat toch niet? een dbase van 6 GB of iets meer (+) en daarin dus 100k drivers (of iets meer, die +).

En moet dat allemaal OO? PHP is nou niet bepaald een taal die bekend staat om OO. Is het niet handiger om te programeren in ASP.net?

Acties:
  • 0 Henk 'm!

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 22-06 16:52

MaxxRide

Surf's up

-GSF-JohnDoe, volgens mij is PHP best te gebruiken voor OO programming (zo wordt het steeds vaker in de markt gezet). Zou dus niet weten waarom dat niet kan.

Als ik het goed begrijp wil je dus een verzameling van driver classes hebben? Ik zou dan dus ook een soort verzameling klasse maken (zie Vector in JAVA).

Ik vind het nog een beetje een vaag verhaal, misschien kun je de vragen nog eens kort en concreet hier neerzetten?

If you are not wiping out you are nog pushing enough...


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 20 december 2003 @ 01:06:

Ik wil nu met de klasse Result een array van objecten vormen aan de hand van de klasse Driver. Of beter gezegd, d.m.v een loop wil ik objecten uit de klasse Driver halen d.m.v de SQL-query.

Dit lijkt mij echter niet mogelijk omdat Driver steeds slechts 1 driver teruggeeft en geen lijst van drivers.

Om het te verduidelijken, wat ik wil is dus dat de klasse Result een lijst met objecten Driver teruggeeft aan de hand van een SQL-query.
Je kan toch een method schrijven die door die opgehaalde resultset loopt, en gewoon een array/vector vult met driver objecten?

pseudo code
code:
1
2
3
4
5
6
for( int i = 0; i < rs.Count; i++ )
{
    arrDrivers[i] = new DriverObj( rs["id"], rs["naam"], rs["blaat"], ..... );
}

return arrDrivers;
Nog een tweede vraag. Bij een zoekresultaat moet ook een becijfering/rank worden opgenomen, bijv. 98%. Dit gaat bijna automatisch met SQL dankzij de AGAINST-statement. Echter worden de resultaten bij een lijst van boven de 10 naar een volgende pagina verwezen. Als er bijvoorbeeld 100 resultaten zijn betekend dat dat er 10 pagina's met drivers aangemaakt worden. Maar hoe kan ik de becijfering/rank op de tweede pagina berekenen ?
:?
Hoe bedoel je. SQL haalt toch gewoon gegevens op, en trekt zich niets aan van pagina's of whatsoever. Sterker zelfs, SQL weet totaal niet waar die data naar toe moet, naar een webpage, naar een file, naar een windows-app, ....
Wat bedoel je precies?
Verwijderd schreef op 20 december 2003 @ 01:34:
[...]

Heet de database "6+ GB" of is de database meer dan 6 Gigabyte groot?
En wat bedoel je met "100.000+ drivers"?
Dit is een irrelevante vraag, en die wetenschap is helemaal niet nodig als je een oplossing wil bekomen tot z'n probleemstelling.

[ Voor 12% gewijzigd door whoami op 20-12-2003 10:31 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

-GSF-JohnDoe schreef op 20 december 2003 @ 01:46:
En moet dat allemaal OO? PHP is nou niet bepaald een taal die bekend staat om OO. Is het niet handiger om te programeren in ASP.net?
Dit forum is toch wel een bewijs dat het wel kan ;)

ASP.net werkt verder meestal niet zo goed op systemen die bedoelt zijn voor php+mysql (doorgaans zijn dat toch wel linuxservers).


Wat ik iig zou doen is de Result-klasse zo abstract mogelijk houden en die niet een of andere specifieke set van objecten terug te laten geven, vervolgens bouw je dan een DriverFactory-klasse (ofzo) die je dan dmv de Result van je query een lijst van Drivers laat bouwen. (zie whoami)
En dat laatste probleem begrijp ik idd ook niet helemaal, zeg je nou dat de match-relevantie niet goed is als je de LIMIT-functionaliteit van mysql gebruikt?

Acties:
  • 0 Henk 'm!

Verwijderd

Nog een tweede vraag. Bij een zoekresultaat moet ook een becijfering/rank worden opgenomen, bijv. 98%. Dit gaat bijna automatisch met SQL dankzij de AGAINST-statement. Echter worden de resultaten bij een lijst van boven de 10 naar een volgende pagina verwezen. Als er bijvoorbeeld 100 resultaten zijn betekend dat dat er 10 pagina's met drivers aangemaakt worden. Maar hoe kan ik de becijfering/rank op de tweede pagina berekenen ?
De pagina's kan je met behulp van een LIMIT selecteren. Dus
code:
1
2
3
4
5
6
SELECT *, MATCH(modelnumbers,file,fccID)  AGAINST (KEYWORD)  AS rank 
FROM drivers 
WHERE MATCH(modelnumbers,file,fccID) AGAINST ('KEYWORD') 
AND deviceID = 'DEVICE' 
AND OS LIKE 'OS'
LIMIT 30,10

Deze query geeft de resultaten voor pagina 4 weer (resultaten 30 t/m 39).

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
ACM schreef op 20 december 2003 @ 11:40:
[...]

Dit forum is toch wel een bewijs dat het wel kan ;)
Ik denk dat echt OO ontwerp toch wel moeilijk is met PHP. Ik heb niet echt ervaring met PHP, maar ik vroeg me toch af of inheritance, polymorphisme en encapsulation (niet enkel data encapsulation, maar ook 'interface encapsulation' (zoals we zien in de meeste design patterns in het GoF boek wel mogelijk is met PHP). Aangezien C# en VB.NET volledig OO zijn, strong typed en compiled languages, denk ik toch dat ASP.NET een betere oplossing is om een OO ontwerp mee te implementeren in een webomgeving.
ASP.net werkt verder meestal niet zo goed op systemen die bedoelt zijn voor php+mysql (doorgaans zijn dat toch wel linuxservers).
Daar heb je wel een punt, maar dan kan je nog naar Java kijken.
Wat ik iig zou doen is de Result-klasse zo abstract mogelijk houden en die niet een of andere specifieke set van objecten terug te laten geven, vervolgens bouw je dan een DriverFactory-klasse (ofzo) die je dan dmv de Result van je query een lijst van Drivers laat bouwen. (zie whoami)
Dat kan je doen, maar ik denk dan dat het interessanter is om eerst de objecten in je systeem te gaan identificeren voordat je begint met een ontwerp om die objecten te kunnen creeëren.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou toch uitkijken vooraleer je zo'n uitspraak maakt ACM. Ik heb de source van dit forum nog nooit bekeken maar ik heb wel nog nooit een OO project in PHP gezien dat ook echt OO was ipv maar een beetje in elkaar gegooid met vage includes en dan beweren dat het OO was.
Imo is OO programmeren in PHP volledig onzinnig aangezien je meer bezig bent met een framework te programmeren dan het effectieve probleem op te lossen. Het werd eerder in deze thread al gezegd "Maak anders een Vector object zoals in Java". Als je zoiets elementair al zelf moet gaan schrijven zou ik me echt afvragen wat het nut van PHP voor OO is. Ik ben 3 jaar geleden van ASP overgegaan op PHP en ondertussen ben ik overgegaan op J2EE. Het is me wel opgevallen hoe weinig PHP geëvolueerd heeft in die tijd terwijl J2EE en ASP.NET echt zinnigie vooruitgangen hebben geboekt.

Maargoed wat de topic betreft ik zou gewoon geen PHP gebruiken wil je jezelf oefenen met OO-ontwerp. Kies een taal die er een framework voor heeft anders verspil je je tijd maar.

Acties:
  • 0 Henk 'm!

Verwijderd

offtopic:
Met de komst van PHP5 (is nu beta2) is er al een goeie stap gezet in de richting van echt OO programmeren in PHP. Dit komt vooral door de nieuwe Zend engine die in PHP5 zit:
http://www.php.net/zend-engine-2.php

Acties:
  • 0 Henk 'm!

Verwijderd

Ja dat roepen ze maar wil niet persé wat zeggen. Misschien dat hun ondersteuning van OO beter zal zijn maar dat wil nog niet zeggen dat er een zinnige framework is om mee te werken. .NET en J2EE hebben beide een 3-tier design voor hun framework terwijl PHP nog steeds slechts op 1 niveau kan opereren. Daar zal PHP5 niets aan veranderen tenzij er dingen zijn waar ik nog niet van gehoord heb.
Als je alles wat niet met het doel van je project te maken heeft elke keer weer moet gaan ontwikkeling of verbeteren dan gooi je het merendeel van je resources (tijd, geld en mankracht) gewoon weg.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
:) Vreesde ik al dat ik een iets te vaag verhaal had gemaakt (was ook laat gisternacht, ben nu wat helderder :) ).

Ok, ik heb nu dus twee klasses, Result en Driver. Zoals Driver al aangeeft gaat het slechts om 1 driver. Maar ik heb meerdere drivers nodig, en ik kan geen 100.000 driver instanties aanmaken en dan door die heen gaan loopen en kijken welke matched. Uiteraard kan ik gewoon een methode getDrivers(sql) aanmaken en daarmee een array terug mee krijgen met een lijst van drivers voor het zoekresultaat, alleen is dat volgens mij niet echt de bedoeling van OO. De klasse Driver is perfect om 1 driver op te halen, m.b.v een ID. Maar hoe met meerdere drivers ? Is de enige oplossing een methode getDrivers ?

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
class drivers ->algemene functies zoals een overzicht van alle geladen drivers
subclass driver -> 1 specifieke driver met functies zoals een overzicht van de eigenschappen e.d.

Het lastige binnen PHP is alleen dat je dan meerdere instanties van de subclass moet hebben. Daar zijn echter wel wat speciale techniekjes voor.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

digitalghost:
Zoals Driver al aangeeft gaat het slechts om 1 driver. Maar ik heb meerdere drivers nodig, en ik kan geen 100.000 driver instanties aanmaken en dan door die heen gaan loopen en kijken welke matched. Uiteraard kan ik gewoon een methode getDrivers(sql) aanmaken en daarmee een array terug mee krijgen met een lijst van drivers voor het zoekresultaat, alleen is dat volgens mij niet echt de bedoeling van OO. De klasse Driver is perfect om 1 driver op te halen, m.b.v een ID. Maar hoe met meerdere drivers ? Is de enige oplossing een methode getDrivers ?
De fout die je hier volgens mij maakt is dat je de Driver zijn eigen gegevens op laat halen. Het is imho logischer om een DriverDatabase class aan te maken die de functionaliteit bevat om drivers uit een database (of andere datasource) op te halen. Vervolgens fungeert die DriverDatabase als laag tussen je overige programmacode en de database. Hoe je dat vervolgens implementeert hangt af van wat jouw voorkeur geniet.

Een mogelijkheid is de volgende:
code:
1
2
3
4
class MySqlDatabase {
   // bevat functionaliteit om te connecten met een mysql database,
   // queries uit te voeren en results terug te geven
}


code:
1
2
3
4
5
6
class DriverDatabase extends MySqlDatabase {
   // bevat de functionaliteit om van een resultset van MySQL een serie drivers
   // aan te maken

   // eveneens functionaliteit om nieuwe drivers in te voeren
}

code:
1
2
3
4
class DriverResultSet {
   // bevat een constructor die aan de hand van een serie rows van mysql
   // de Driver set aan gaat maken en vervolgens daarvoor de "container" is
}

code:
1
2
3
4
class Driver {
   // bevat een of meerdere constructors die aan de hand van de gegeven 
   // parameters de object-representatie van een driver te verzorgen)
}


Vervolgens iets van deze strekking
PHP:
1
2
3
4
5
6
7
8
9
10
$driverDb = new DriverDatabase ();
$driverDb->connect ( 'server', 'user', 'password' );
$driverDb->selectDatabase ( 'database' );

$driverResultSet = $driver->getDrivers ( $zoekparameter1, $zoekparameter2, ... );

for ( $i = 0; $i < $driverResultSet->size (); $i ++ ) {
   $driver = $driverResultSet->get ( $i );
   printf ( "Driver nummer 1: %s<br />", $driver->getName () );
}


Je kunt er dan over discussieren of je, for the sake of modularity, niet beter de MySQL database als "datasource" aan de DriverDatabase meegeeft, en die MySQL database dan een bepaalde interface implementeert die je beschrijft in een abstracte klasse (is te doen in PHP) zodat je je in de DriverDatabase niet bezig hoeft te houden met MySQL logica. Dat zou wel mijn voorkeur hebben, maar is niet de snelste en makkelijkste oplossing.

Overigens denk ik dat je OO niet als doel moet zien maar als middel. In PHP is het niet per definitie handiger, sneller of mooier om OO te gebruiken, dus moet je dat imo niet willen forceren. Je kan een eind komen, maar je zult ook heel snel tegen minpunten van PHP aanlopen. Met PHP5 wordt dat wel een stukje beter, maar ik neem niet aan dat je PHP5 al in productie hebt draaien ;) Kortom: denk niet dat PHP4 geschikt is om het allemaal "op z'n netst OO" te doen. Er is wat dat betreft in PHP4 veel meer ruimte voor gewoon netjes procedureel programmeren, en daar is opzich helemaal niets mis mee ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 20 december 2003 @ 12:02:
Ik zou toch uitkijken vooraleer je zo'n uitspraak maakt ACM. Ik heb de source van dit forum nog nooit bekeken maar ik heb wel nog nooit een OO project in PHP gezien dat ook echt OO was ipv maar een beetje in elkaar gegooid met vage includes en dan beweren dat het OO was.
Ik ken de sourcecode van dit forum wel :)
En het zal heus niet de OO-puristen aanspreken, maar het is wel degelijk OO, of eigenlijk OB omdat de php-interface zelf geen echt OO is natuurlijk...
Imo is OO programmeren in PHP volledig onzinnig aangezien je meer bezig bent met een framework te programmeren dan het effectieve probleem op te lossen.
Imho kan je sneller OO programmeren in PHP dan in Java. Dat het uiteindelijke systeem "mooier OO" is in Java das wat anders...
Het werd eerder in deze thread al gezegd "Maak anders een Vector object zoals in Java".
Sja, php heeft dat niet nodig, php's array is al wat Java met een Vector ArrayList probeert te bereiken.
Als je zoiets elementair al zelf moet gaan schrijven zou ik me echt afvragen wat het nut van PHP voor OO is.
Dat ben ik met je eens, zoiets moet je dan ook niet gaan schrijven, daar moet je de arrays van php voor gebruiken. En alleen in heel bijzondere gevallen zou je een eigen klasse ervoor kunnen schrijven.
Ik ben 3 jaar geleden van ASP overgegaan op PHP en ondertussen ben ik overgegaan op J2EE. Het is me wel opgevallen hoe weinig PHP geëvolueerd heeft in die tijd terwijl J2EE en ASP.NET echt zinnigie vooruitgangen hebben geboekt.
Zowel J2EE en ASP.NET zijn nieuw sinds de afgelopen 3 jaar, dus dan is het niet erg bijzonder dat ze van "niks naar heel veel" zijn gegaan wel? Verder zitten er bij beide miljoenen bedrijven achter.
Maargoed wat de topic betreft ik zou gewoon geen PHP gebruiken wil je jezelf oefenen met OO-ontwerp. Kies een taal die er een framework voor heeft anders verspil je je tijd maar.
Ik zou ook niet PHP aanraden om OO mee te leren, absoluut met je eens. Maar in PHP kan je wel degelijk een behoorlijk OO (eigenlijk, door php's interface OB) systeem opzetten.
En ja, er missen bepaalde handige stukken syntactische suiker, benodigdheden en luxe zaken.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

En ja, er missen bepaalde handige stukken syntactische suiker, benodigdheden en luxe zaken.
... als je type-safety als syntactische suiker aan wilt merken :+

Even zonder gekheid: de programmeurs die strong-typed talen gewend zijn zullen dat (weak-typing) toch als grootste nadeel van PHP aanmerken. Er is niemand die typing verplicht behalve de programmeur zelf (gettype (), is_object(), get_class(), is_a, etc).

Inherent aan weaktyping is namelijk het missen van de meest gebruikte vorm van overloading, en dat is de vorm waarbij onderscheid gemaakt wordt op het type van de argumenten.

Dat maakt PHP in OOP-opzicht toch wel een beetje mank. En dat was ook wel stiekempjes de reden dat ik PHP5 aanhaalde *), want die heeft daar wel plakband voor gevonden :)

*) Zie bijv. Abstract Classes and Methods, instanceof, Interfaces en vooral Class Type Hints in http://www.php.net/zend-engine-2.php

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1