Suorituskyky on yksi tärkeimmistä huomioon otettavista seikoista verkkosovelluksia kehitettäessä. Tietokannasta haettavan tiedon analysointi on hyvä lähtökohta parannuksia etsittäessä. Tässä artikkelissa on esimerkkejä siitä, miten suorituskykyä voidaan parantaa käyttämällä aggregaattifunktioita ja suodattamalla tietoja tietokantatasolla.
Aluksi muutama asiayhteys
Tämä artikkeli on saanut inspiraationsa todellisesta ongelmasta, jonka kanssa olen kerran ollut tekemisissä. Sen käsitteleminen opetti minulle paljon, ja minulla on se edelleen viitteenä mielessäni. Mielestäni esimerkit ovat hyvä oppimisresurssi, ne voivat selventää paljon. Tässä artikkelissa haluan jakaa kanssasi esimerkkejä Active Record -kyselymenetelmien käytöstä.
Jotta en esittelisi toimialakohtaisia yksityiskohtia, käytän esimerkkien havainnollistamiseen kirjaston esimerkkisovellusta. Kaikki on melko yksinkertaista, kuten alla olevassa kaaviossa näkyy. Meillä on neljä taulukkoa: kirjoittajat, kirjat, käyttäjät ja vuokraus. Yksi käyttäjä voi lainata monta kirjaa ja yhtä kirjaa voi lainata monta käyttäjää, joten tarvitsemme liitäntätaulukon, jolla voimme mallintaa monesta moniin -suhteita. Meidän tapauksessamme se on rentals-taulu. Tallennamme sinne myös joitakin lisätietoja, jotka ovat lainaus- ja palautuspäivämäärät. Kirjailijalla voi olla useita kirjoja nimellään. Kirjalla on myös attribuutti, joka määrittelee sen genren.
Käyttäjän lukutilastot
Tehtävänä oli laatia tilastoja yhdestä käyttäjästä, jotta voisimme kertoa, kuinka monta kirjaa kustakin genrestä oli lainattu. Ensimmäinen ajatukseni oli hakea kaikki käyttäjän lainaamat kirjat, ryhmitellä ne genren mukaan ja tehdä sitten mappaus, jotta jokaiselle genrelle olisi määritetty kirjojen määrä luettelon sijaan. Keksin seuraavan ratkaisun:
Vaikka tämä lähestymistapa toimii ja näyttää siistiltä, se ei käytä kaikkia Active Record -kyselymenetelmien tarjoamia mahdollisuuksia. Niiden ansiosta voimme suodattaa ja aggregoida tietoja tietokantatasolla ilman, että käytämme raakaa SQL:ää suoraan meidän koodi. Toimiminen db-tasolla lisää myös tehokkuuttamme.
Yllä olevassa esimerkissä voimme käyttää ryhmämenetelmää Rubyn ryhmän sijasta.menetelmän mukaan. Se soveltaa GROUPBY-lauseke tSQL-kyselyyn. Lisäksi kartoitus- ja kokomenetelmä voidaan korvata laskenta-aggregaatiofunktiolla. Loppujen lopuksi jäljelle jää kysely, joka näyttää tältä:
Book.joins(:rentals).where(rentals: { user: user }).group(:genre).count(:books)
Se näyttää vielä yksinkertaisemmalta!
Muita hyödyllisiä esimerkkejä
Alla on joitakin muita tapoja käyttää kyselymenetelmiä, jotka ovat mielestäni tietämisen arvoisia.
Kutsu inaktiivisille käyttäjille
TEHTÄVÄ: Suodata käyttäjät, jotka eivät ole koskaan lainanneet kirjaa tai jotka ovat lainanneet kirjan yli vuosi sitten.
Voisimme hakea kaikki käyttäjät sisällyttämällä niihin liittyvät vuokrasopimukset ja suodattaa ne sitten select-menetelmällä.
User.includes(:vuokraus).select do |user|
user.rentals.empty? || user.rentals.none? { |vuokraus| vuokraus.alkupäivä >= Date.today - 1.year }
end
Kaikkea ei tietenkään tarvitse hakea. Käyttämällä kyselymenetelmiä voimme suodattaa sen pois tietokantatasolla. Ensin valitaan käyttäjät, jotka ovat lainanneet joitakin kirjoja viimeisen vuoden aikana, ja jätetään ne sitten lopullisen valinnan ulkopuolelle.
TEHTÄVÄ: Hanki kirjailijat, joilla on yksi tai nolla lainattua kirjaa.
Sen tekeminen select-menetelmällä on erittäin yksinkertaista, mutta jälleen kerran - ei ole tarvetta käsitellä niin suurta tietomäärää, koska tietokanta voi suodattaa sen puolestamme:
On tärkeää muistaa yksi asia, kun käytät left_joineja (ja ulompia liitoksia yleensä). Jos vasemmanpuoleisessa taulukossa (tässä: kirjoittajat) on tietueita, joilla ei ole vastaavia tietueita oikeanpuoleisessa taulukossa (tässä: kirjat), tuloksena oikeanpuoleisen taulukon sarakkeet täytetään nolla-arvoilla.
Koska tarvitsemme myös kirjailijoita, joilla on yksi kirja järjestelmässä, on tehtävä vielä muutama toimenpide. Meidän on tehtävä ryhmittely, laskenta ja ehdon lisääminen. Tässä on, miten kaikki kootaan yhteen:
Ehto tulee aggregointitoiminnon jälkeen, joten meidän on käytettävä HAVING-lauseketta WHERE-lausekkeen sijasta sen määrittämiseen.
Active Record -kyselymenetelmät kannattaa tarkistaa, kun mietit sovelluksen suorituskykyä. Ne voivat yksinkertaistaa koodia ja nopeuttaa sen toimintaa. Toivon, että jaetut esimerkit auttavat sinua tutkimaan kyselymenetelmien tarjoamia mahdollisuuksia.