Archief - PHP: veel data opslaan/opvragen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

passero

Legacy Member
Ik zit met volgend systeem dat momenteel volledig op mysql gebaseerd is:

producten(id,naam,omschrijving,...)
prijzen(id,prod_id,prijs,...)

Bedoeling is om een historiek bij te houden van de prijzen van de producten.
De DB telt +/- 1000 producten en de prijzen kunnen meerdere malen per dag veranderen.
Het is de bedoeling om dan een grafiek van de prijs van een bepaald product op het scherm te zetten. Dit is eigenlijk het enigste nut van die prijzentabel.

Nu is dit systeem nog jong en bevat de DB niet veel gegevens maar ik vraag me af wat er met dit systeem zal gebeuren na een jaar:

stel dat de prijs 2x per dag veranderd en we hebben 1000 producten in de DB:

250*1000*2 (250 aangezien weekend niet worden meegerekend), dat geeft dan een half miljoen records per jaar.
Is dit nog performant als ik
select prijs from prijzen where prod_id = x doe?

Zijn er geen betere manieren om dit op te slaan dan in de DB?
Ik dacht eventueel aan een csv waar er dan elke keer een lijntje bijkomt in plaats van in de db. Dan moet ik gewoon elk bestand (per product) een andere naam geven en voor de grafiek kan ik dan gewoon heel de file inlezen en die gegevens gaan gebruiken voor de grafiek.

Andere suggesties zijn ook meer dan welkom natuurlijk.

Rvl

Legacy Member
Indien u database structuur goed in elkaar zit (normalisering) zou dat geen probleem mogen geven. Kijk maar naar TN forum, hier steekt toch ook al een relatief grote db achter.
Verder zou ik de persoon, die al de producten dagelijks 2 keer moet aanpassen, niet willen zijn, wat een kutjob.:) Het heeft ook geen enkel nut prijzen tot 2 maal per dag aan te passen, om de x aantal dagen / weken zal wel volstaan, of denk je echt dat er mensen gaan zijn die je site constant in het oog gaan houden om een eventuele daling/stijging van x aantal euro te kunnen vaststellen. En uiteindelijk zullen deze schommelingen (per dag) ook geen effect hebben op de grafiek, enkel de schommelingen die betekenis hebben zullen op termijn zichtbaar blijven (dus de schommelingen over een tijdspanne van enkele maanden).

passero

Legacy Member
u hoeft zich geen vraag te stellen in het waarom ;) en de prijzen worden automatisch opgehaald via een cronjob. Het kan zelf tot 10 maal per dag gaan, en ja, sommige mensen misbruiken hun f5 knop tot ze een scherpe prijs zien dus het is belangrijk dat er genoeg data is.

Ik denk dat alles vrij goed genormaliseerd is.

De prijzen tabel houdt enkel de prijs bij zodat via een
select prijs,datum from prijzen where prod_id = x al mijn gegevens geven die ik nodig heb.

Het zou dus geen kwaad kunnen dat er in de prijzen tabel een paar miljoen records zitten?

Breen

Legacy Member
Een paar miljoen records is geen probleem, maar met deze setup zal ergens in de tijdslijn dat wel een probleem vormen. Misschien kan je een systeem implementeren waar enkel het laatste jaar telt, dat lijkt me nauwkeurig genoeg en garandeerd performantie.

Rvl

Legacy Member
Zeg dan toch gewoon dat het voor een beurs browsergame is ;), dan moeten we dit probleem anders interpreteren en moet je dus ook wel om de x aantal tijd een update doorvoeren.

passero

Legacy Member
:p

momenteel los ik het op 2 manieren op:
om het kwartier loopt een script dat de koersen opslaat in een csv, 1 file per aandeel
Daar zouden de gegevens van de voorbije maand in opgeslaan worden. Via een rotatiesysteem zullen er 30 dagen bijgehouden worden per file.
Er wordt dan ook 1 maal per dag de aflsuitprijs bijgehouden in de DB
Ik denk dat op die manier ik genoeg gegevens heb voor relevante data want denk niet dat iemand zich zal intreseren wat de koers van aandeel X 3 maand geleden om 14uur was... vandaar dat op lange termijn 1 maal per dag goed is en op korte termijn meerdere malen per dag in een csv...

dit lijkt me een deftige oplossing, niet?

edit:
@Rvl: het is bijna zo goed als klaar hoor :) Je kan al alles doe: kopen, verkopen, orders plaatsen,.... nu enkel afwerken door historiek bij te houden enzo

Radiance

Legacy Member
Waarom je een CSV file gebruikt ontgaat mij, een database mag gerust groot worden hoor, daar dient het voor, het is een formaat speciaal ontworpen om er door te zoeken. Wat je nu gaat krijgen is dat telkens uw gebruiker refresht er een aantal megabytes aan CSV file moeten ingelezen en geparset worden .. da's pas resource intensief.

Verder lijkt uw tactiek mij wel inorde.

dJeez

Legacy Member
Al gehoord van caching? Je moet nl. niet steeds opnieuw queryen als het grafiekje toch niet wijzigt (dat blijft toch hetzelfde zolang er geen prijswijziging is), gooi gewoon het huidige grafiekje weg telkens de prijs wijzigt en laat het grafiekje enkel genereren indien er nog geen bestaat. Het heeft nl. ook geen nut van het grafiekje te genereren als niemand het zou opvragen voor er een nieuwe prijswijziging is. Herlees 't voorgaand etot je het snapt :p.

passero

Legacy Member
Radiance zei:
Waarom je een CSV file gebruikt ontgaat mij, een database mag gerust groot worden hoor, daar dient het voor, het is een formaat speciaal ontworpen om er door te zoeken. Wat je nu gaat krijgen is dat telkens uw gebruiker refresht er een aantal megabytes aan CSV file moeten ingelezen en geparset worden .. da's pas resource intensief.

Verder lijkt uw tactiek mij wel inorde.

Dus eigenlijk gewoon mijn csv strategie aanpassen naar mysql structuur

1 tabel voor maandelijkse gegevens en 1 tabel voor de prijzen die ik een jaar ga bijhouden... lijkt nog goed te doen :)


Wat betreft caching van de grafiek, dit gebeurt reeds dus hiervoor geen probleem.

PerfectPC

Legacy Member
met een .cvs gaat ge een file locking probleem krijgen. net als ge vertragingen gaat krijgen als ge myisam als storage engine gebruikt op een druk bezochte website met een mysql database. (myisam lockt op table niveau ipv op rij zoals innodb)
mijn suggestie: gebruik mysql als database met innodb als storage engine. zo hebt ge ook ineens foraign key constraints en transaction logs (voor moest er iets mislopen door stroomuitval ofzo) als ge dit doet kan ik u verzekeren dat ge 10.000 aandelen om het kwartier kunt volgen en toch een vlotte database toegang hebt.
vergeet uiteraard ook niet om de intervalgegevens van de vorige dag te wissen als er een nieuwe dag begint. zoals ge aangeeft is er niemand geinteresseerd in de koers van gistermiddag, enkel gisterochtend en gisteravond ;)

al ge dan effe rekent:
1000 aandelen
x250 beursdagen
=250.000 records voor 1 jaar slotkoersen
+
1000 aandelen
x8 beursuren
x4 updates per uur
=32.000 records per dag

in totaal komt ge zo zelfs nog niet aan 300.000 records. mysql lacht hier es goed mee, zelfs al gaat ge complexe joins doen ;) nog plaats zat om volume en andere leuke extraatjes ook bij te houden ...

passero

Legacy Member
ah ok, ziet er allemaal goed uit dus :)
IK hou mijn daggegevens een jaarrecords wel gescheiden dus die records komen niet eens samen.

Ik ben al lang voorstander van innoDB dus ik gebruik het reeds. Ik wist niet dat het verschil tussen innodb en myisam ook op locking niveau was, dacht enkel dat het om FK's ging... dat weten we dus ook weeral
thx
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan