Views
Uit Yapf
Inhoud |
Wat is een view?
Een view is een voorgeprogrammeeerde query die kan worden aangesproken onder een alias.
Stel dat je deze tabel hebt:
CREATE TABLE spelers (
id SERIAL,
naam VARCHAR,
geblokkeerd BOOLEAN,
CONSTRAINT spelers_pkey PRIMARY KEY(id)
) WITH OIDS;
INSERT INTO "public"."spelers" ("id", "naam", "geblokkeerd")
VALUES (1, NULL, False);
INSERT INTO "public"."spelers" ("id", "naam", "geblokkeerd")
VALUES (2, NULL, True);
INSERT INTO "public"."spelers" ("id", "naam", "geblokkeerd")
VALUES (4, NULL, True);
INSERT INTO "public"."spelers" ("id", "naam", "geblokkeerd")
VALUES (5, NULL, False);
Dan zou je daar alle nietgeblokkeerde spelers uit op kunnen halen met:
SELECT
*
FROM
users
WHERE
geblokkeerd=false
Deze query kun je definieren in een view:
CREATE OR REPLACE VIEW actievespelers
(
id,
naam,
geblokkeerd)
AS
SELECT spelers.id, spelers.naam, spelers.geblokkeerd
FROM spelers
WHERE (spelers.geblokkeerd = false);
Dit maakt een view genaamd actievespelers en de definitie van die view is gewoon de query die kijkt naar 'geblokkeerd=false'.
Als je nu alle nietgeblokkeerde spelers wilt zien kun je gewoon selecteren uit die view:
SELECT
*
FROM
actievespelers;
Waar, wanneer en waarom gebruik je views?
Queries vereenvoudigen.
Queries kunnen snel groot worden, bijvoorbeeld door joins of complexe WHERE clausules. In de praktijk kom je sommige joins regelmatig tegen en in plaats van elke keer weer diezelfde join te tikken kun je ook een view definieren waar die join alvast in zit, zodat je het resultaat van die join als view in andere queries kunt gebruiken. Dit maakt je uiteindelijke query een stuk kleiner en leesbaarder.
Bijvoorbeeld, als je klanten een abonnement kunnen afsluiten dat een maand geldig is, dan hebben ze alleen toegang zolang er een abonnementrecord voor hen is waarvan de begin- en einddatum voor en na now() liggen en waar de status van dat abonnement 'betaald' is.
SELECT
*
FROM
klanten
LEFT JOIN
abonnementen
ON
klanten.klantid=abonnementen.klantid
WHERE
NOW() BETWEEN(abonnementen.startdate AND
abonnementen.enddate)
AND
abonnementen.paid=true;
Dit wil je echt niet elke openieuw intikken elke keer dat je een actieve klant zoekt, dus dit zet je in een view.
Databronnen centraliseren.
Door uit views te selecteren kun je in de definitie van de view bepalen met welke records gebruikt zullen worden door de queries die de view aanspreken. In dit voorbeeld bepaalt de definitie van de view 'actievespelers' welke spelers als actief worden geschouwd door elke query die selecteert uit 'actievespelers'. Mocht je definitie van wat telt als actief ooit veranderen, dan hoef je dat alleen in deze view door te voeren.
Databronnen beveiligen.
Met een view kun je een query toegang geven tot een tabel waar de query zelf geen toegang toe heeft. Je website gebruikt databaseuser X, en de DBA gebruikt een administratie account. De DBA kan user-X het select recht op de spelers tabel ontnemen en in plaats daarvan alleen select recht op de view geven. Op die manier kan de web site alleen spelers ophalen uit de view en in die view bepaalt de DBA welke records wel en niet te zien zijn. Mocht een query van de website gehackt worden dan is het nog steeds niet mogelijk om direct uit die spelers tabel te selecteren, want dat mag user-X niet.