Toon posts:

[algemeen] verschil tussen array en db tabel?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een vraag over het vergelijken van een "lijst met items in de database" en een "lijst met items in een array".

M'n tabel ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
id, primary key
titel, een string variabele grootte, 10 tot 100 chars.
datum, datum van toevoeging

1|titel1|12-12-2004:20:01
2|titel2|12-12-2004:20:02
3|titel3|12-12-2004:20:03
4|titel4|12-12-2004:20:04
5|titel5|12-12-2004:20:05
(maximaal 500 items)


M'n array ziet er uit als een normale array:
code:
1
2
3
4
5
6
lijst[0]="titel4";
lijst[1]="titel5";
lijst[2]="titel6";
lijst[3]="titel7";
lijst[4]="titel8";
(zo'n 20 tot 40 items)


Heeft iemand een idee voor een algoritme hoe ik het snelst kan zien welke items wel in m'n array zitten maar niet in de DB (hier dus, titel6, titel7, titel8)

Ik kwam op de volgende methodes:
1. haal de laatste 50 toegevoegde records uit de database en controleer op nieuwe items in de array mbv code (simpel for loopie)
2. tja, hier hielden m'n hersenen al op er kwamen alleen minder efficientere methoden uit.

Weet iemand raad?

[ Voor 8% gewijzigd door Verwijderd op 13-07-2005 15:29 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:58
Waarom hou je bij jouw items die zich in die array bevinden, niet bij of het om een nieuw item gaat of niet ?

Ik bedoel, stel die array in het geheugen bevat objecten (die van een bepaald type zijn).
Waarom zou je dan in dat object niet bijhouden of iets 'nieuw' is, of niet ? (Hou dus een aantal administratieve vlaggen bij per object: IsNew, IsDirty, etc...

https://fgheysels.github.io/


Verwijderd

Een simpele for loop is toch ook efficiënt genoeg? Lijkt mij dat het je daarmee goed zou moeten kunnen lukken en zoals het erop lijkt is dit iets waar je zelf ook van weet ;) altijd makkelijker dan code o.i.d. toepassen die iemand anders maakt.

edit: Whoami heeft ook een goed punt ;)

[ Voor 9% gewijzigd door Verwijderd op 13-07-2005 15:33 ]


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 21:28
Snelst in de zin van processing time of programmeersnelheid?

In het geval van het laatste kan je de DB uitlezen, de resultaten in een nieuwe array (zelfde vorm als de andere) gieten, en er een array_diff op loslaten.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 01-05 19:54

Bosmonster

*zucht*

haal alle titels op in je array (where titel in ('titel1', 'titel2', etc)). 1 simpele query.

En controleer het vervolgens? Zo weet je dat je altijd de data ophaalt die je nodig hebt (met laatste 50 is dat maar een gok) en ook dat je nooit teveel ophaalt.

Even uitgaande dat je database altijd achterloopt op die array uiteraard.

Dit is in ieder geval een stuk efficienter dan:

- loopen (das dus tig query's)
- alle gegevens uit de DB ophalen (dit is dus altijd veel te veel)

[ Voor 22% gewijzigd door Bosmonster op 13-07-2005 15:34 ]


Verwijderd

Is het niet het makkelijkst om al je items in de array af te gaan, en te kijken of die in de db voorkomen, d.m.v. een kleine query ? het veld waarop je zoekt is je primary key, dus zoeken daarop zal redelijk snel gaan, sneller dan 50 keer je array doorzoeken

Verwijderd

Wat dacht je van de items in je array in een sql query proppen en je db het probleem laten oplossen...

  • Mir
  • Registratie: Maart 2001
  • Niet online

Mir

in je SQL gebruik maken van IN() ! :>

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:58
Verwijderd schreef op woensdag 13 juli 2005 @ 15:33:
Is het niet het makkelijkst om al je items in de array af te gaan, en te kijken of die in de db voorkomen, d.m.v. een kleine query ? het veld waarop je zoekt is je primary key, dus zoeken daarop zal redelijk snel gaan, sneller dan 50 keer je array doorzoeken
Als je 1000 items in die array hebt, dan moet je 1000x een query doen. Da's zowiezo niet efficient.
Mir schreef op woensdag 13 juli 2005 @ 15:35:
in je SQL gebruik maken van IN() ! :>
Hoe ga je dat oplossen ? Hij wil weten welke items er in z'n array zitten en niet in z'n DB.

Je kan natuurlijk wel alle items die in jouw array zitten in een temporary table pompen, en dan het verschil maken tussen die temp table en jouw echte table.
Echter, echt efficient zal dat ook niet zijn.

[ Voor 33% gewijzigd door whoami op 13-07-2005 15:39 ]

https://fgheysels.github.io/


Verwijderd

whoami schreef op woensdag 13 juli 2005 @ 15:38:
Hoe ga je dat oplossen ? Hij wil weten welke items er in z'n array zitten en niet in z'n DB.
Je kunt toch retourneren wat je wel hebt...

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:58
Verwijderd schreef op woensdag 13 juli 2005 @ 15:51:
[...]

Je kunt toch retourneren wat je wel hebt...
Toch niet als die items niet in de DB zitten, maar enkel in 't geheugen ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 13 juli 2005 @ 15:31:
Waarom hou je bij jouw items die zich in die array bevinden, niet bij of het om een nieuw item gaat of niet ?

Ik bedoel, stel die array in het geheugen bevat objecten (die van een bepaald type zijn).
Waarom zou je dan in dat object niet bijhouden of iets 'nieuw' is, of niet ? (Hou dus een aantal administratieve vlaggen bij per object: IsNew, IsDirty, etc...
Omdat ik niet weet of een item in de array nieuw is of niet, dat weet ik pas als ik heb gekeken of het item in de array niet in de database staat.

De items in de array komen uit een socket en het is mogelijk (zoals m'n voorbeeldje illustreerd) dat items in de array al in de database staan.

M'n taak is om te kijken welke items in de array nieuw zijn (maw welke items in de array niet in de db staan).

Verwijderd

Topicstarter
Bosmonster schreef op woensdag 13 juli 2005 @ 15:32:
haal alle titels op in je array (where titel in ('titel1', 'titel2', etc)). 1 simpele query.

En controleer het vervolgens? Zo weet je dat je altijd de data ophaalt die je nodig hebt (met laatste 50 is dat maar een gok) en ook dat je nooit teveel ophaalt.

Even uitgaande dat je database altijd achterloopt op die array uiteraard.

Dit is in ieder geval een stuk efficienter dan:

- loopen (das dus tig query's)
- alle gegevens uit de DB ophalen (dit is dus altijd veel te veel)
Daar heb je inderdaad een punt, al moet ik even controleren of de mysql server in queries aan kan, maar anders kan ik nog altijd OR gebruiken: where titel='titel1' or titel='titel2'. De resultset die ik dan terug krijg bevat de rijen die in de db zitten, een simpel loopje resulteerd dan in de nieuwe items die niet in de db zitten.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het kan niet zonder de 2 datastructuren naar hetzelfde systeem te verhuizen, dus ofwel naar de database, ofwel naar je applicatie. Als je een index hebt op de titel in je database zou ik het naar je database brengen (dus dmv een query WHERE title NOT IN (alle elementen uit je array), zoals bosmonster in omgekeerde volgorde suggereert ;)). Als dat niet het geval is denk ik niet dat het veel uitmaakt welke richting je het op doet.

[ Voor 4% gewijzigd door .oisyn op 13-07-2005 16:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
sjroorda schreef op woensdag 13 juli 2005 @ 15:32:
Snelst in de zin van processing time of programmeersnelheid?

In het geval van het laatste kan je de DB uitlezen, de resultaten in een nieuwe array (zelfde vorm als de andere) gieten, en er een array_diff op loslaten.
Processing time tuurlijk. ;) De optimalisaties die ik later moet doen (cache van db tabel) kosten toch al zat programmeertijd, nu maar eerst de basis goed.

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 05-05 14:01

thomaske

» » » » » »

code:
1
SELECT * FROM tabel WHERE titel NOT IN ('titel1','titel2')

Dit zou toch moeten werken lijkt me?

en in php wordt dat dan:
PHP:
1
$strSQL = "SELECT * FROM tabel WHERE titel NOT IN ('".implode("','",$lijst).")";


edit:

zoals hierboven dus al werd genoemd :)

[ Voor 68% gewijzigd door thomaske op 13-07-2005 17:16 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."

Pagina: 1