Skip to content
Home " IT ir technologijos " Kaip veikia SQL duomenų bazės

Kaip veikia SQL duomenų bazės

Kas iš tiesų yra SQL duomenų bazė

Kai pirmą kartą išgirstate apie SQL duomenų bazes, gali pasirodyti, kad tai kažkas baisiai sudėtingo ir skirto tik programuotojams. Tačiau iš tikrųjų tai tiesiog labai protingas būdas saugoti ir tvarkyti informaciją. Įsivaizduokite milžinišką bibliotekos katalogų sistemą, tik skaitmeninę ir daug greitesnę.

SQL (Structured Query Language) duomenų bazės veikia kaip organizuoti saugyklos spintelės, kuriose kiekvienas daiktas turi savo vietą. Skirtumas nuo paprasto Excel failo ar teksto dokumento yra tas, kad čia viskas yra labai griežtai struktūrizuota. Kiekvienas duomenų gabalas žino savo vietą, ir sistema gali akimirksniu surasti tai, ko jums reikia, net jei turite milijonus įrašų.

Pats SQL yra tarsi universali kalba, kuria “kalbatės” su duomenų baze. Tai ne programavimo kalba įprastine prasme – tai užklausų kalba. Jūs pasakote duomenų bazei, ko norite, o ji jums tai atnešta. Pavyzdžiui, galite paprašyti: “Duok man visus klientus iš Vilniaus, kurie pirkimus darė per pastarąjį mėnesį” – ir sistema per kelias milisekundes pateiks rezultatą.

Lentelės, eilutės ir stulpeliai – duomenų anatomija

Duomenų bazės pagrindas yra lentelės. Jei kada nors dirbote su Excel, tai jums bus pažįstama. Tik čia viskas daug griežčiau apibrėžta. Kiekviena lentelė turi stulpelius (laukus) ir eilutes (įrašus).

Tarkime, kuriate internetinę parduotuvę. Jums reikės lentelės “Klientai”. Joje bus stulpeliai: vardas, pavardė, el. paštas, telefonas, adresas. Kiekviena eilutė bus vienas konkretus klientas. Paprastai, ar ne? Bet štai kur prasideda magija – kiekvienas stulpelis turi apibrėžtą duomenų tipą. El. paštas bus tekstas, registracijos data bus datos formatas, o kliento ID bus skaičius.

Kodėl tai svarbu? Nes duomenų bazė žino, kaip su kiekvienu tipu elgtis. Ji nežinos, kaip sudėti du el. paštus, bet puikiai susidoros su skaičiais. Ji automatiškai patikrina, ar data yra teisingo formato. Tai kaip turėti asmeninį sekretorių, kuris nuolat tikrina, ar viskas tvarkoje.

Dar vienas svarbus dalykas – kiekviena lentelė paprastai turi pirminį raktą (primary key). Tai unikalus identifikatorius, dažniausiai tiesiog skaičius, kuris automatiškai didėja su kiekvienu nauju įrašu. Jūsų klientas Jonas Jonaitis gali turėti ID numerį 1547, ir net jei sistemoje bus dar dešimt Jonų Jonaitių, kiekvienas turės savo unikalų numerį.

Ryšiai tarp lentelių – kur slypi tikroji galia

Viena lentelė – tai gerai, bet tikroji SQL duomenų bazių galia atsiskleidžia, kai pradedame jas sujungti. Tai vadinama ryšiais arba relacijomis (todėl ir vadinamos reliacinėmis duomenų bazėmis).

Grįžkime prie mūsų internetinės parduotuvės. Turite lentelę “Klientai” ir lentelę “Užsakymai”. Kaip jas susieti? Lentelėje “Užsakymai” sukuriate stulpelį “kliento_id”, kuris nurodo į konkretų klientą iš “Klientai” lentelės. Tai vadinamas išoriniu raktu (foreign key).

Dabar galite paklausti: “Parodyk man visus Jono Jonaičio (ID 1547) užsakymus” – ir sistema akimirksniu suras visus užsakymus, kuriuose kliento_id yra 1547. Arba atvirkščiai: žiūrite į konkretų užsakymą ir galite iškart pamatyti, kas jį padarė, koks jo adresas ir telefonas.

Yra keletas ryšių tipų. Vienas su vienu (one-to-one) – pavyzdžiui, vienas klientas turi vieną išsamią profilį. Vienas su daug (one-to-many) – vienas klientas gali turėti daug užsakymų. Daug su daug (many-to-many) – vienas produktas gali būti daugelyje užsakymų, ir vienas užsakymas gali turėti daug produktų. Šiam paskutiniam atvejui paprastai sukuriama tarpinė lentelė.

SQL užklausų magija ir kaip ji veikia

Kai jau turite struktūrą, reikia mokėti su ja bendrauti. Čia ir ateina SQL užklausų kalba. Ji gana intuityvi, nes panaši į paprastą anglų kalbą.

Pagrindinės komandos yra keturios: SELECT (pasirinkti duomenis), INSERT (įterpti naujus), UPDATE (atnaujinti esamus) ir DELETE (ištrinti). Paprasčiausia užklausa atrodytų taip: SELECT * FROM Klientai – tai reiškia “parodyk man viską iš Klientų lentelės”.

Bet galite būti daug konkretesni. SELECT vardas, el_pastas FROM Klientai WHERE miestas = 'Vilnius' ORDER BY vardas – čia prašote tik vardo ir el. pašto, tik iš Vilniaus klientų, ir surikiuoti pagal vardą. Sistema tai supras ir įvykdys.

Užklausos gali būti sudėtingesnės. Galite sujungti kelias lenteles su JOIN komanda. Pavyzdžiui: SELECT Klientai.vardas, Uzsakymai.data FROM Klientai JOIN Uzsakymai ON Klientai.id = Uzsakymai.kliento_id – tai parodys klientų vardus kartu su jų užsakymų datomis.

Duomenų bazės variklis (engine) gauna jūsų užklausą ir ją optimizuoja. Jis nusprendžia, kokiu būdu greičiausiai rasti reikiamus duomenis. Čia naudojami indeksai – tai kaip knygos turinys, kuris leidžia iškart peršokti į reikiamą puslapį, o ne vartyti visą knygą nuo pradžių.

Transakcijos ir duomenų vientisumas

Vienas svarbiausių SQL duomenų bazių bruožų – gebėjimas užtikrinti duomenų vientisumą. Įsivaizduokite, kad pervedate pinigus iš vienos sąskaitos į kitą. Tai iš tiesų du veiksmai: atimti iš vienos ir pridėti prie kitos. Kas nutiktų, jei sistema sugriūtų tarp šių dviejų veiksmų? Pinigai tiesiog išnyktų!

Čia ir padeda transakcijos. Transakcija – tai operacijų grupė, kuri arba įvyksta visa, arba neįvyksta visai. Jokių tarpinių būsenų. Tai veikia pagal ACID principą: Atomicity (atomiskumas – viskas arba nieko), Consistency (nuoseklumas – duomenys visada teisingi), Isolation (izoliacija – transakcijos netrukdo viena kitai), Durability (patvarumas – įrašyta informacija nedinsta).

Praktiškai tai reiškia, kad prieš pradėdami kelis susijusius veiksmus, pasakote duomenų bazei “BEGIN TRANSACTION”. Atliekate visus veiksmus. Jei viskas gerai – sakote “COMMIT”, ir pakeitimai įsigalioja. Jei kažkas nepavyko – sakote “ROLLBACK”, ir viskas grįžta į pradinę būseną, tarsi nieko nebūtų buvę.

Duomenų bazė taip pat naudoja užraktus (locks), kad du vartotojai vienu metu negalėtų keisti tų pačių duomenų ir sukurti chaoso. Tai kaip turėti “Užimta” lentelę ant tualeto durų – kiti turi palaukti, kol dabartinis vartotojas baigs.

Skirtingi SQL duomenų bazių tipai ir kada ką naudoti

Nors visos SQL duomenų bazės veikia panašiais principais, yra keletas populiarių variantų, kiekvienas su savo ypatumais.

MySQL yra turbūt populiariausias pasirinkimas mažiems ir vidutiniams projektams. Jis nemokamas, atviro kodo ir puikiai tinka daugumai svetainių. Jei kada lankėtės WordPress svetainėje (o tai apie 40% viso interneto), tai ji naudoja MySQL. Jis greitas, patikimas ir turi didžiulę bendruomenę, todėl bet kokiai problemai lengva rasti sprendimą.

PostgreSQL yra galingesnis ir turi daugiau funkcijų. Jis geriau tvarko sudėtingas užklausas ir turi pažangesnius duomenų tipus. Daugelis programuotojų jį laiko “teisingesniu” pasirinkimu dideliems projektams. Jis taip pat nemokamas ir atviro kodo.

Microsoft SQL Server yra komercinė sistema, kuri puikiai integruojasi su kitais Microsoft produktais. Jei jūsų įmonė jau naudoja Windows serverius ir .NET technologijas, tai natūralus pasirinkimas. Jis turi puikias valdymo priemones ir Microsoft palaikymą.

Oracle yra milžinas tarp duomenų bazių – galingiausias, bet ir brangiausias. Jį naudoja didžiosios korporacijos, bankai, vyriausybinės institucijos. Jis gali apdoroti neįtikėtinus duomenų kiekius ir turi funkcijų, kurių nėra kitur.

SQLite yra visiškai kitoks – tai ne serverio duomenų bazė, o tiesiog failas jūsų kompiuteryje. Jis puikiai tinka mobilioms programėlėms ar mažiems projektams. Kiekviena Android programa, kuri saugo duomenis vietiškai, greičiausiai naudoja SQLite.

Kaip duomenų bazės saugomos fiziškai

Galbūt stebėjotės, kaip visa ši informacija iš tikrųjų saugoma kompiuteryje? Tai ne magija, nors kartais taip atrodo.

Duomenų bazė – tai vienas ar keli failai jūsų kietajame diske. Bet ne paprasti failai – jie turi sudėtingą vidinę struktūrą. Duomenys saugomi puslapiuose (pages) – paprastai 4KB ar 8KB dydžio blokuose. Kiekvienas puslapis gali saugoti kelias eilutes iš lentelės arba indekso dalį.

Kai prašote duomenų, sistema pirma patikrina atmintinę (RAM). Ten ji laiko dažniausiai naudojamus duomenis spartinimui (cache). Jei duomenų ten nėra, ji skaito iš disko. Šiuolaikinės duomenų bazės labai protingai valdo šią atmintinę, kad kuo rečiau reikėtų kreiptis į lėtą diską.

Indeksai saugomi atskirai nuo pačių duomenų. Dažniausiai naudojama B-medžio (B-tree) struktūra – tai kaip daugiapakopis medis, kuris leidžia labai greitai surasti bet kokią reikšmę. Jei turite milijoną įrašų, be indekso sistema turėtų peržiūrėti visus milijoną. Su indeksu – galbūt tik 20-30 įrašų.

Duomenų bazė taip pat veda žurnalą (log) – tai failas, kuriame užrašoma kiekviena operacija. Jei sistema staiga išsijungtų, paleidus iš naujo ji gali perskaityti žurnalą ir atkurti būseną. Tai kaip turėti juodąją dėžę lėktuve.

Našumo optimizavimas ir dažniausios klaidos

Sukurti duomenų bazę nesunku, bet sukurti greitą duomenų bazę – tai menas. Daugelis pradedančiųjų daro tas pačias klaidas.

Pirmiausia – indeksai. Jei neturite indeksų ant stulpelių, kuriuos dažnai naudojate WHERE sąlygose, jūsų užklausos bus lėtos. Bet per daug indeksų taip pat bloga – kiekvienas įterpimas ar atnaujinimas tampa lėtesnis, nes reikia atnaujinti visus indeksus. Aukso viduriukas – indeksuoti tai, kas tikrai dažnai ieškoma.

Antra dažna klaida – N+1 užklausų problema. Tai vyksta, kai pirmiausia gaunate sąrašą įrašų, o paskui kiekvienam įrašui darote atskirą užklausą papildomai informacijai gauti. Jei turite 100 įrašų, tai 101 užklausa! Sprendimas – naudoti JOIN ir gauti viską vienu kartu.

Trečia – nenormalizuoti duomenys. Normalizacija reiškia teisingą duomenų paskirstymą po lenteles, kad nebūtų pasikartojimų. Jei kiekviename užsakyme saugote pilną kliento adresą vietoj nuorodos į klientą, tai ir vietos švaistymas, ir problemos, kai klientas pakeičia adresą.

Bet kartais denormalizacija yra gerai! Jei tam tikrą informaciją reikia labai dažnai ir greitai, kartais verta ją dubliuoti, kad nereikėtų jungti daugelio lentelių. Tai kompromisas tarp idealo ir praktinio našumo.

Dar vienas patarimas – naudokite EXPLAIN komandą. Ji parodo, kaip duomenų bazė planuoja įvykdyti jūsų užklausą. Taip galite pamatyti, ar ji naudoja indeksus, ar skenuoja visą lentelę. Tai kaip turėti rentgeno aparatą savo užklausoms.

Ką SQL duomenų bazės mums davė ir kur jos veda

SQL duomenų bazės egzistuoja jau daugiau nei 40 metų, ir tai ne atsitiktinumas. Jos išliko, nes sprendžia fundamentalią problemą – kaip patikimai saugoti ir greitai rasti informaciją. Nuo banko sąskaitų iki jūsų mėgstamiausių dainų Spotify – viskas veikia ant SQL duomenų bazių.

Žinoma, pastaraisiais metais atsirado NoSQL duomenų bazės (MongoDB, Cassandra ir kitos), kurios teigia esančios geresnis pasirinkimas tam tikriems atvejams. Jos lankstesnės, geriau tinka labai dideliems duomenų kiekiams, bet neturi SQL griežtumo ir patikimumo. Daugelis šiuolaikinių sistemų naudoja abu tipus – SQL pagrindinei informacijai, NoSQL spartinimui ar specifinėms užduotims.

Jei tik pradedame mokytis apie duomenų bazes, rekomenduoju pradėti nuo SQLite – galite jį paleisti net neįdiegę jokio serverio. Parsisiųskite DB Browser for SQLite programą, sukurkite kelias lenteles, pamėginkite įvairias užklausas. Pamatysite, kaip viskas veikia savo akimis.

Supratimas, kaip veikia SQL duomenų bazės, yra vertinga žinia net jei nesate programuotojas. Tai padeda suprasti, kaip veikia beveik visos šiuolaikinės sistemos, su kuriomis susiduriame kasdien. O jei kada nuspręsite mokytis programavimo, SQL bus viena pirmųjų kalbų, kurią turėsite įsisavinti – ir dabar jau žinote, kad tai ne taip baisu, kaip gali atrodyti iš pirmo žvilgsnio.