Frammistaða er einn mikilvægasti þátturinn sem þarf að hafa í huga þegar vefumsóknir eru þróaðar. Að greina hvernig gögn eru sótt úr gagnagrunni er góður upphafspunktur þegar leitað er að leiðum til að bæta. Í þessari grein finnur þú dæmi um hvernig megi bæta frammistöðu með því að nota samantektarfall og sía gögn á gagnagrunnsstigi.
Hér er tómt.
Smá samhengi til að byrja með
Þessi grein er innblásin af raunverulegu vandamáli sem mér var einu sinni falið að leysa. Að takast á við það kenndi mér margt, og ég nota það enn sem viðmið í huga mér. Ég tel dæmi vera góða námsauðlind; þau geta skýrt margt. Í þessari grein langar mig að deila með ykkur nokkrum dæmum um notkun fyrirspurnaraðferða Active Record.
Til þess að forðast að koma inn á sértækar upplýsingar um viðfangsefnið mun ég nota dæmi um forrit fyrir bókasafn til að sýna dæmi. Allt er nokkuð einfalt, eins og sýnt er í myndinni hér að neðan. Við höfum fjögur töflur: höfundar, bækur, notendur og lántökur. Einn notandi getur lánað sér margar bækur og ein bók getur verið lánað af mörgum notendum, svo við þurfum tengitöflu til að líkana margar-til-margar tengingar. Í okkar tilfelli er það lántökutaflan. Þar geymum við einnig frekari upplýsingar, nefnilega dagsetningar lántöku og skila. Höfundur getur átt margar bækur skráðar undir nafninu sínu. Bók hefur einnig eiginleika sem skilgreinir tegund hennar.
Lestrartölfræði notenda
Verkefnið var að útbúa tölfræði fyrir einn notanda, svo við gætum sagt til um hversu margar bækur af hverjum flokki voru lánaðar. Fyrsta hugmyndin mín var að sækja allar bækur sem notandinn hafði lánað, flokka þær eftir tegundum og kortleggja þær þannig að hver tegund fengi úthlutað bókanúmeri í stað bókalista. Hér er það sem ég kom með:
Þó að þessi nálgun virki og líti snyrtilega út, nýtir hún ekki alla þá möguleika sem fyrirspurnaraðferðir Active Record bjóða upp á. Þökk sé þeim getum við síað og samantekið. gögn á gagnagrunnsstigi án þess að nota hrátt SQL beint í okkar kóði. Að vinna á gagnagrunnsstigi eykur einnig skilvirkni okkar.
Í dæminu hér að ofan getum við notað group-aðferðina í stað Ruby's group.með aðferð. Það mun beita tthe GROUPBY-skilyrði í tSQL-fyrirspurninni. Ennfremur er hægt að skipta út tengingu og stærðaraðferð fyrir talningar-samansafnsfall. Að lokum stendur eftir fyrirspurn sem lítur svona út:
Hér að neðan finnur þú nokkrar aðrar leiðir til að nota fyrirspurnarferðirnar sem mér finnst þess virði að þekkja.
Boð til óvirkra notenda
VERKEFNI: Sía notendur sem hafa aldrei lánað sér bók eða gerðu það fyrir meira en ári síðan.
Við gætum sótt alla notendur með því að innifela tengdar leigubókanir og síðan sía þá með select-aðferðinni.
User.includes(:rentals).select do |user|
user.rentals.empty? || user.rentals.none? { |rental| rental.start_date >= Date.today - 1.year }
end Hljóðskrift
En auðvitað er ekki þörf á að sækja allt. Með því að nota fyrirspurnaraðferðir getum við síað það út á gagnagrunnsstigi. Fyrst skulum við velja notendur sem hafa lánað sér nokkrar bækur á síðasta ári og síðan útiloka þá úr lokaúrvalinu.
Notandi.settu skilyrði fyrir ekki (id: [Notandi.tengist.leigum.settu skilyrði fyrir {start_date: (Date.today - 1.ár)..Date.today}])])
Undirfulltrúaðir höfundar
VERKEFNI: Fá höfunda sem eiga eina eða engar lánaðar bækur
Að gera þetta með select-aðferðinni er mjög einfalt, en aftur – það er ekki þörf á að vinna með svo stórt gagnasafn þar sem gagnagrunnurinn getur síað það fyrir okkur:
Það er mikilvægt að muna eitt þegar notað er left_joins (og ytri tengingar almennt). Ef í vinstri töflunni (hér: höfundar) eru færslur sem ekki eiga sér samsvarandi færslur í hægri töflunni (hér: bækur), þá verða reitirnir í hægri töflunni í niðurstöðunni fylltir með gildunum nil.
Þar sem við þurfum einnig höfunda sem eiga eina bók skráða í kerfinu, eru nokkrar aðgerðir í viðbót sem þarf að framkvæma. Við verðum að hópa, telja og bæta við skilyrði. Svona sameinum við allt saman:
Skilyrðið kemur eftir samansafnsfallaðgerðina, svo við verðum að nota HAVING-skilyrðið í stað WHERE-skilyrðsins til að tilgreina það.
Það er þess virði að skoða fyrirspurnaraðferðir Active Record þegar hugsað er um frammistöðu forritsins. Þær geta einfaldað kóðann þinn og gert hann hraðari. Ég vona að hin sameiginlegu dæmin muni hjálpa þér að kanna möguleikana sem fyrirspurnaraðferðirnar bjóða upp á.