Google+ Followers

woensdag 28 december 2011

Beperk je LIMIT

LIMIT en z'n ega OFFSET worden gebruikt om een resultset te beperken tot alleen een interessant plakje van de totale uitkomst. De pest is dat de database pas kan bepalen welke records binnen de opgegeven OFFSET en LIMIT vallen als hij de hele resultset ter beschikking heeft.

Dus als je een query hebt die een beste borrel werk doet om dingen te tellen en te sorteren, dan gaat de database eerst al die berekeningen doen en de uitkomst sorteren, om vervolgens alleen de gevraagde plak terug te geven.

Om dit soort queries sneller te maken kun je de manier van werken licht veranderen door de LIMIT en OFFSET alleen toe te passen op dat deel van de brondata waar hij ook echt op wordt toegepast.

Stel je wilt een lijst van klanten met de totale waarde van hun bestellingen, hun totale aantal transacties, gemiddelde bestelwaarde etc etc, gesorteerd op hun naam, beginnend op klant 15 in de lijst. Gewoonlijk zou je dan de usertabel raadplegen en die joinen aan diverse andere tabellen en/of subqueries:



SELECT *
FROM users
LEFT JOIN (SELECT COUNT(*) FROM transactions GROUP BY userid) AS transactioncounter
ON transactioncounter.userid=users.userid
ORDER BY user.name
LIMIT 15
OFFSET 15;

Nu wordt het aantal transacties voor *alle* users geteld en daar wordt een subset van 15 uit geplukt.

Door de werkvolgorde aan te passen wordt het aantal bewerkingen veel kleiner:




SELECT *
FROM (SELECT * FROM users ORDER BY users.name OFFSET 15 LIMIT 15) AS users
LEFT JOIN (SELECT COUNT(*) FROM transactions GROUP BY userid) AS transactioncounter
ON transactioncounter.userid=users.userid;


zaterdag 24 december 2011

DBSchema 6

In mijn voortdurende zoektocht naar het ultieme programma om ERD's te ontwerpen kwam ik weer een redelijke tegen: http://www.dbschema.com/

Importeert modellen van werkende databases en kan ze ook realtime aanpassen als je het model aanpast. Dit is lang niet altijd wat je wilt, maar het betekent wel dat direct 100% zeker weet dat wat je aangepast hebt ook echt werkt op je database.

De presentatie van het schema is zonder meer mooi te noemen. Lijnen die elkaar kruisen worden voorzien van een hobbeltje om over de kruisende lijn heen te springen. Ook is er een optie om lijnen die hetzelfde aangeven samen te voegen tot  één lijn die zich splitst. Als je een usertabel hebt waarvan de PK aan veertien andere tabellen wordt gekoppeld dan vertrekt er van de usertabel toch maar één lijn, wat bijzonder prettig leest.

Zoek niet naar een 'export database' functie, die is er niet. Wat er wel is is een 'backup as SQL' functie die effectief hetzelfde doet.

De voordelen:

  • Native Linux versie (geen gedoe met wine)
  • Bijzonder fraaie ERD presentatie
  • Ondersteunt alle populaire databases
  • Herkent PostgreSQL's schema constructie.
  • Wordt actief ontwikkeld
  • Niet duur, personal license kost $127 en met 20% korting via: http://migenblog.com/dbschema-promotion-discount-coupon-code.html ben je 88 Euro kwijt.
De nadelen:
  • Bevat nog de nodige bugs in de ondersteuning van databases, zo maakt het eerst de tabellen en dan pas de sequences, wat niet werkt als je nextval() toepast.

woensdag 7 december 2011

SQL brokjes, deel 24, CAST()

CAST() kan een boolean omzetten naar een integer en integers kun je optellen.

Dat maakt het onder andere mogelijk om binnene en groep te tellen hoeveel keer een bepaalde waarde voorkwam:

SELECT
SUM(CAST(veld=5 AS INTEGER)) AS aantal_veld_is_5
, SUM(CAST(veld=13 AS INTEGER)) AS aantal_veld_is_13
, iets
FROM tabel
GROUP BY iets;

dinsdag 6 december 2011

Ontwerp tipjes, deel 14: kolomnamen.

Kolomnamen moeten beschijvend zijn, ze moeten aangeven wat voor soort data er in de kolom zit en waar die data voor gebruikt dient te worden.

Dat betekent meteen al een schop tegen mijn persoonlijke irritatie nummer één, de 'id' kolom. Een kolom bevat niet 'id', een kolom bevat een userid, of een postid, vul maar in, maar het id is altijd van een entiteit binnen je database en daar dient de naam melding van te maken.

Waarom; nou los van "omdat het logisch is"; het is gewoon onhandig als al je tabellen een kolom 'id' hebben. Koppel de user tabel aan de forumposts en select daar eens * van, dan krijg je twee resultaatkolommen genaamd 'id'. Welke is dan van de user en welke van de forumposts? Dat kun je wel afvangen met aliassen: SELECT user.id AS userid, forumposts.id AS forumposts, maar.... uhm... als je in de query een onduidelijke kolomnaam gaat verduidelijken dan ben je toch wel fout bezig.

In het verlengde hiervan; in de forumposts tabel zit uiteraard het id van de user die de post gedaan heeft. Noem die kolom dus niet userid, want er staat niet zomaar een leuk userid in, er staat in wie de post gedaan heeft.; poster_userid dus. Er is geen twijfel mogelijk over wat er in de kolom 'poster_userid' staat.

En nu ik toch bezig ben. Afkortingen. Probeer ze te voorkomen en gebruik ze alleen als het echt volledig ingeburgerd is. Waarom: ik heb veel te veel databases gezien met een uid, een gid, een pid, tid, sid, tid en wid, waarbij de progammeurs een kladblokje naast hun toetsenwordt hadden liggen met de verklarende woordenlijst.
Afkorgen maakt je query niet duidelijker en op performance heeft het al helemaal geen enkele invloed.

zaterdag 3 december 2011

Relax ProSilence-Plus

Tijden veranderen, marketing blijft een groepje apart.

Neem Bosch. Ze maken een stofzuiger die erg stil is, dus krijgt hij 'silence' in de naam verwerkt. Daar kan ik nog mee leven,het klinkt in ieder geval beter dan "superstil", en wie spreekt er nog Nederlands, niewaar?

Maar we moeten als potentiele stofzuigerkoper natuurlijk ook denken dat het professionele stofzuiger is, want "professioneel" is goed, toch? En omdat stofzuigen best hard werk is (als je het goed doet) zet je "Relax" in de naam, dan denken al die suffe kopers dat ze op hun gat kunnen zitten tijdens het stofzuigen. Om het af te maken hang je dan het nietszeggende  maar positief klinkende "plus" er achter en hop, een naam die *niets* zegt, die niemand kan onthouden, maar die wel voldoet aan alle wensen van de moderne eikel marketing bureau's.

"Relax ProSilence-Plus".

Nee ik kan er echt niet bij.

zondag 12 juni 2011

Socal media... ok, mag het nu uit?

15 mensen vinden dit leuk

Oh wow, 15 andere mensen die ik niet ken vinden dit ook leuk. Jippie, nu kan ik.... uhm.... nu weet ik.... naja nu weet ik dat er 15 anderen zijn die dit leek vinden.

Als ik het zo zeg klinkt het toch wel vreemd, niet? Een blokje op je website waarin staat dat een groepje mensen die je niet kent, waarvan je niet eens weet of ze wel echt bestaan, deze website leuk vinden. En wat is leuk dan? Vinden ze hem kwalitatief goed, of informatief, of heeft hij leuke kleurtjes? Geen idee, maar ze vinden het wel leuk.

Is dit wat men bedoelt met social media?

Dat twitter populair is is mij al een raadsel. ja helemaal nieuw, een microblog met 140 tekens wat steevast te weinig is waardoor de berichten worden uitgesmeerd over meerdere berichten. En dan je twitter account koppelen aan je google-reader (want google is geil, toch?) zodat je uiteindelijk gewoon weer een RSS feed volgt. Ja, helemaal geweldig dat twitter, en zo nieuw, want voor twitter kon niemand bloggen... toch?

Wat ik wel eens zou willen zien is een trend naar kwaliteit. Minder schijnheilig gezeik om de brei heen en meer inhoud. Niet als een kleuter lopen leuren om likes op facebook. Heb je geen "facebook", dan loop je achter... of voor, want facebook schijnt ook al weer "uit" te zijn, we hyven tegenwoordig, want er zijn geen andere manieren om mensen die je niet kent te laten weten dat je ze niet wilt leren kennen.

Zit ik lekker naar de Formule-1 te kijken, klappert Perez uit de bocht. Dikke paniek, ambulancemedewerkers rennen zenuwachtig heen en weer, en Olaf Mol rapporteert: via twitter horen we dat het goed gaat met Perez.... Is het vreemd dat mijn klomp breekt als de f*cking verslaggever die op een f*cking 100 meter van de bron af zit via f*cking twitter moet vernemen wat de stand is? Er holt niet iemand naar de pers tent om een beericht te brengen, nee, men twittert het. Alsof dat de enige manier is waarop ze een bericht de wereld in kunnen sturen, alsof dat ook echt door iedereen gevolgd wordt.

Ik dacht altijd dat het een geintje was dat mensen elkaar op feestjes niet meer spreken maar twitteren, maar dat is dus echt aan de hand. Men kan niet meer normaal communiceren.

En ja dat zeg ik in een blog, een blog zoals dat al wordt gebruikt sinds het eerste bitje het web opging.

Voel je vrij om deze rant niet te "liken".

maandag 6 juni 2011

session_destroy() maakt meer kapot dan je lief is.

pfz.nl, in antwoord op de zoveelste vraag waarom je sessions niet moet vernietigen bij het uitloggen:



Je logt bezoekers niet aan door ze een session te geven maar door bepaalde data in de session te zetten. Je logt bezoekers dus ook uit door die data weer uit de session te halen. Er is simpelweg geen reden om de sessie te vernietigen.

Natuurlijik, als je de sessie vernietigt dan vernietig je ook die data, maar ook eventuele data die niets met het aanloggen te maken heeft, zoals een timestamp die aangeeft wanneer de sessie is gestart, hittellers, data van andere scripts op de site (denk wordpress en z'n plugins). Kortom; een session-destroy maakt meer kapot dan je lief is.

maandag 3 januari 2011

Selenium remote

Eigenlijk is dit meer onder het motto: wist je dat.

Met selenium kun je browse- sessies opnemen als op een videorecorder en later afspelen. Tijdens het afspelen kun je laten controleren of de pagina voldoet aan bepaalde eisen zoals het zichtbaar zijn van een element, het aanwezig zijn van een text, etc.

De leut is nu dat je de opgenomen test ook kunt afspelen vanuit phpunit, waarin je de commando's kunt laten versturen naar een centrale server. Die server kan vervolgens de test uitvoeren op... even wachten... meerdere browsers. Dat is recht; je kunt de test laten uitvoeren op firefox en de diverse smaken van IE, zonder er zelf een vinger naar uit te steken.

PostgreSQL en windowing.

Iedereen die met PostgreSQL werkt heeft wel gehoord van de windowing functies maar wat doen ze nu eigenlijk en wat kun je er nu feitelijik mee?

Kort samengevat kun je door middel van windowing functies gegevens ophalen over de relatie van records tot andere records die iets gemeen hebben. Dat klinkt heel erg als GROUP BY, en dat is het ook, met als grote verschil dat je gewoon alle records blijft terugkrijgen. Je kunt dus b.v. alle records van een personeelsdatabase ophalen en per personeelslid gegevens krijgen over hoe hij zich verhoudt tot andere personeelsleden uit dezelfde afdeling.

Een iets directer nut zal waarschijnlijk zijn dat je per record kunt ophalen hoeveel een kolomwaarde verschilt van het volgende of vorige record in een bepaalde sortering. Die informatie kun je dus ophalen tegelijk met het record zelf, er is geen aparte query meer voor nodig, ook niet in een subquery of iets dergelijks.

Verder kun je er running-totals mee maken, rangorde berekenen (1e, 2e, 3e plaats), gemiddelde, totalen etc mee berekenen, en als klap op de vuurpijl kun je per record ook informatie ophalen over het eerste of laatste record uit de groep.



Voor meer informatie, zie windowing queries op yapf.net