En introduksjon til MySQL 5 Visninger

MySQL 5-serien introduserte ganske mange endringer. Utløsere og lagrede prosedyrer var to av de store billettelementene. En av de mindre kjente tilleggene, i hvert fall fra mengden skriving om emnet, er introduksjonen av synspunkter. Mens du etter en rask titt på MySQL-visninger, ser du kanskje ikke de åpenbare fordelene, de er der hvis du graver dem bare litt.


Innledning: Hva er en visning

"En visning er ikke noe mer enn et pseudobord som gjør arbeidet med en definert spørring."

Kort sagt, den enkleste måten å se på en visning er at det bare er et lagret søk som etterligner et bord. Det er ikke noe mer enn et pseudobord som gjør arbeidet med en definert spørring. Det legger ikke til noen funksjonalitet, for eksempel endring av variabler, og det brenner heller ikke andre spørringer når noe annet skjer. Visninger bare sitte der, fett dum og glad å gjøre det du definerte dem å gjøre.

Ved første rødme høres dette ikke så stor av en avtale, men hvis du graver forbi overflaten, kan du begynne å se litt av kraften i den lave utsikten. Jeg skal ikke si at synspunkter vil forandre livet ditt, men jeg vil fortelle deg at de vil gjøre jobben med databaseinteraksjon litt enklere å jobbe med. De vil gjøre jobben litt enklere når du gjør store endringer i samspillet ditt. De vil også gjøre noen vanskelige oppgaver som dynamisk rapportering litt mer effektiv og litt lettere å jobbe med. Jeg vil ta litt enklere hver dag i uken.

Med noe er det tradeoffs.

"Visninger kan og sannsynligvis redusere ytelsen din."

Som jeg tidligere har skrevet, er jeg en troende på å gjøre avvik, så lenge du forstår hva som står på bordet. Mer enn sannsynlig vil noen skumme forbi dette avsnittet og gi en kommentar om at du aldri bør bruke en visning på grunn av resultatstrekket. Jeg er uenig. Du bør bruke hvert verktøy i verktøykassen, men når de gir mening. Du bruker ikke en hammer til å sette en skrue i en vegg, akkurat som du ikke ville bruke en visning når du virkelig trenger en haug / minnebord. Flippen er utviklingsbrukbarheten for dine applikasjoner. Når det er fornuftig å spare tid, innsats og energi over resultatene som du kan ta, ta det valget. Utvikling handler ikke bare om ytelsen av dine applikasjoner, da det er andre hensyn som støtte, tid til marked og total verdi av tiden din.

Verktøyene som jeg jobber med i denne opplæringen er ganske standard. Jeg bruker phpMyAdmin for databasens interaksjon for forklaringsformål. Jeg vil også bruke svært rudimentære bordstrukturer, strengt for enkel forklaring. Jeg forventer ikke at disse bordstrukturer noen gang vil bli brukt i et produksjonsmiljø, da jeg bare bruker dem til illustrasjon.

Et ytterligere notat. Det er ingen riktig eller feil måte å nevne en visning på. Jeg nevner imidlertid mine synspunkter med syntaxen til view_ * primary_table * _ * what_the_view_is_used_for * med mindre jeg jobber for endringer i bakoverkompatibilitet. Så, hvis jeg opprettet en visning for statistiske rapporteringsformål på min salesforce-tabell, ville visningsnavnet mitt være: view_salesforce_statistical_report. Det kan være ganske lenge, og du har bare 64 tegn å jobbe med, så hold det i bakhodet. Det fungerer for meg, og min stil, det kan ikke fungere for deg.

"Jeg skal ikke si at synspunkter vil forandre livet ditt, men jeg vil fortelle deg at de vil gjøre jobben med databaseinteraksjon litt enklere å jobbe med. De vil gjøre jobben litt enklere når du gjør store endringer i Interaksjonslaget ditt. De vil også gjøre noen vanskelige oppgaver som dynamisk rapportering litt mer effektiv og litt lettere å jobbe med. "


Definisjoner: Hvordan definere en visning

Som jeg sa, er en visning bare et spørsmål. Det er noen små konfigurasjoner som vi må gjøre når du lager en visning, så la oss diskutere det først. I phpMyAdmin, i "Bla gjennom" tabell siden, vil du se en lenke kalt "Create View".

Hvis du klikker på den linken, bør du se noe som ser slik ut:

Dette, vennene mine, er hvor magien skjer. Det er ikke mye å forklare på siden, men la oss ta en rask titt på definisjonene som vi trenger å forstå for å skape en visning.

Først er det "Opprett visning" etterfulgt av "ELLER SKIFT". Hvis du klikker på ELLER SKIFT, vil det gjøre akkurat som du tror, ​​som overskriver en eksisterende visning. Kolonnenavn er navnet på kolonnene i tabellen. Hver er skilt av et komma, så det kan se ut som fornavn, andre navn, etc. AS er spørringen.

Det er to ting å forklare, men konseptene er ikke harde. ALGORITHM har valgene av udefinert, flette og temp tabell. Hvis du velger "Merge" når det er ett til ett forhold, vil det kombinere det innkommende spørsmålet med visningen. Temp-tabellen er mindre effektiv, men når du ikke bruker et ett til ett forhold, for eksempel en aggregeringsfunksjon som SUM () eller du bruker bestemte søkeord som GROUP BY eller HAVING eller UNION, må du bruke tempabordalgoritmen. Når det er sagt, kan du gjøre som jeg gjør, og la algoritmen være "undefined" og MySQL vil velge den beste algoritmen å bruke.

Til slutt har vi CASCADED CHECK OPTION og LOCAL CHECK-alternativer. Tjekalternativene forteller MySQL for å validere visningsdefinisjonen hvis det er en betingelse på spørringen, som WHERE. Hvis WHERE-klausulen utelukker data, vil det forhindre oppdateringer eller innføring av disse radene der den skal utelukkes. Den lokale kontrollen omhandler bare visningen du definerer, hvor CASCADED CHECK er for visninger du har definert fra andre visninger. Det vil cascade sjekken for de også.

Det er en visning i et nøtteskall. La oss ta en titt på noen brukstilfeller for å se dem i aksjon og hvor de kan hjelpe din utviklingsarbeid.


Bakoverkompatibilitet: For Procrastinator

Jeg har hatt det til å skje flere ganger enn jeg ville bry deg om å nevne når jeg designer en enkeltbrukstabell som jeg aldri tror trenger å bli normalisert, gjør det videre uunngåelig. La oss ta eksemplet som viste før med noen flere poster.

Selvfølgelig lar mine normaliseringsferdigheter noe å være ønsket i dette eksemplet. Det jeg sannsynligvis burde ha gjort da jeg først opprettet dette bordet, var å ha et eget bord for adresser, og ring bare en adresse_id i salgsstyrktabellen. Problemet er at når jeg flytter til en databaseendring, må jeg løpe tilbake gjennom mitt logiske interaksjonslag og gjøre mange forespørselsendringer. I stedet for å gjøre så mye arbeid, hvorfor ikke la en visning komme til redning.

La oss først gjøre endringen til tabellstrukturen min. Jeg kopierer tabellstrukturen og dataene til mitt nye bord, adresser og gjør tabellen sane, slik som å legge til adresse_id og fjerne unødvendig struktur:

Da trenger jeg bare å slette de overordnede kolonnene og legge til min adresse_id tilbake til salgstabellen.

Dette er en ganske vanlig forandring som du gjør på en semi-vanlig basis, selv om det er ganske enkel i naturen. Du finner ut at du kan normalisere noe på grunn av en ny funksjon. I dette tilfellet kan vi gjenbruke adressene våre til kunder, eller til andre ansatte, eller for hva vi kan lagre adresser. Dette arbeidet er ikke så vanskelig, men avhengig av gjenbrukssøket ditt, kan det være en mye større endring i å finne alle stedene du ringer til vårt gamle sales_force-bord. I kommer en visning.

I stedet for å gå tilbake gjennom vår kode akkurat nå, og i stedet vente på en vanlig utgivelsessyklus, kan vi lage en visning for å holde vår gamle funksjonalitet intakt. Jeg endret navnet på vår sales_force-tabell til sales_force_normalized:

Nå kan vi skape vårt syn for å opprettholde bakoverkompatibilitet:

Og vi har vår bakoverkompatibilitet med bare det ekstra arbeidet med å lage en spørring som sitter i MySQL:

Selv når jeg går inn i en ny selger, vil visningen gjenspeile endringen:

Og presto:

Omtrent to minutter med arbeid for å opprettholde vår bakoverkompatibilitet til vår tidligere datastruktur. Det er ulempene med denne metoden, ved at du ikke kan definere en indeks mot visningen din, som er viktig når du er cascading visninger. I tillegg må du fortsatt endre dine spørsmål for INSERT, DELETE og UPDATE, men dette vil spare deg for noe arbeid. Din ytelse kan falle litt, men som et stoppavstand er det ingen enklere måte å gjøre endringer i datastrukturen din for å lette koden din i den endringen. Dine spørsmål i logikklaget ditt vil være uberørt fordi de ser på originalbordet så langt de vet.


Komplekse spørringer: Gjør det hardt bærbart

Nå som vi har vårt bevis på konseptet under våre belter, la oss se på en annen bruk. Jeg opprettet en annen tabell for å fange salgsdata fra salgsforvalgtabellen og fylte den med litt tilfeldig informasjon. Det ser slik ut:

Det er et ekstremt forenklet bord for å få tak i salget av salgsstyrken til illustrasjon. Det er alltid ting vi ønsker å trekke ut for måling på et bord som dette. Jeg vil sannsynligvis vite det totale salget. Jeg vil sannsynligvis ønske å vite totalsalg av person. Jeg vil kanskje også vite rangen av salgsresultatet. Jeg kunne skrive spørringer i databasen logikken for å utføre hver av disse når jeg trenger dem, eller jeg kunne bare skrive en visning for å hente dataene etter behov. Siden dette er en veiledning om visninger, antar jeg valget er ganske enkelt på dette punktet som taktikk å ta.

La oss starte med å evaluere totalt salg, sammen med annen relevant informasjon:

Som gir oss en oversikt over:

Jeg har også inkludert spørringen tid på denne, som ser på 200 poster, dette er lyn rask, men ytelsen vil variere. Legg merke til at jeg ikke bruker CHECK-funksjonene fordi jeg ikke diskriminerer informasjonen i en WHERE-bestemmelse. Nå som vi har denne informasjonen pent pakket, handler det bare om å bygge vår rapporteringsmekanisme i vår logikk.

Å få denne informasjonen er ikke så vanskelig. La oss ta dette bare et skritt videre og bruk en GROUP BY-funksjon og en sammenleggingsfunksjon mot salgsstyrken. Igjen bruker jeg forenklede spørringer for å illustrere. I dette tilfellet ønsker vi å få samme informasjon som vi hadde fra totalt salg, men denne gangen brytes ned av vår enkelte selger.

Som gir oss en oversikt over:

Igjen, veldig enkelt til slutt for å få disse verdiene ut av databasen. La oss ta en titt på et annet eksempel, som kombinerer de to visningene. Jeg vil sammenligne totalene mot den enkelte, og så vil vi skape et syn på to visninger:

Som gir oss en oversikt over:


Konklusjon

En annen fordel med synspunkter er at de gir et ytterligere sikkerhetsnivå til dine applikasjoner. Du utsetter ikke bordstrukturen for din søknad. I stedet utsetter du noe som egentlig ikke eksisterer, unntatt som et pseudobord. Jeg ville ikke kalle en visning en god praksis og bruke dem først og fremst til å skrive sikre applikasjoner, men jeg ville se på det som en ekstra fordel.

Jeg bruker visninger på en begrenset måte. Hvor jeg bruker visninger er som vist ovenfor, spesielt i rapporteringsmekanismer i mine applikasjoner. Å skrive en forespørsel om å utføre den tunge løftingen for meg er mye lettere enn å skrive logikken rundt vanskeligere spørringer. Jeg tar litt av et treff på ytelsen fra tid til annen, som jeg pleier å overvinne ved å optimalisere den opprinnelige datastrukturen. Jeg har ennå å få en til å være en show-stopper når det gjelder ytelse, men dagen er ung. Takk så mye for å lese.