SQL in podatkovni model¶
Zakaj SQL sodi v ta predmet¶
Ko spletna aplikacija hrani podatke trajno, nekje v ozadju skoraj vedno stoji baza podatkov. V tem predmetu se ne učimo SQL zato, da bi pisali ogromne poslovne sisteme, ampak zato, da dijak razume:
- kaj je tabela,
- kako se podatki shranijo,
- kako jih preberemo,
- kako jih spremenimo,
- zakaj podatkov ne držimo samo v spremenljivkah.
Relacijska logika na začetni ravni¶
Relacijska baza podatke shranjuje v tabelah. Vsaka tabela ima:
- stolpce,
- vrstice,
- pravila za identifikacijo in povezovanje.
Primer tabele knjige:
| id | naslov | avtor | leto |
|---|---|---|---|
| 1 | Alamut | Vladimir Bartol | 1938 |
| 2 | 1984 | George Orwell | 1949 |
To je dovolj preprosto, da dijak takoj vidi, zakaj je baza uporabna.
Kaj pomeni dober podatkovni model¶
Dober model pomeni, da:
- podatki niso po nepotrebnem podvojeni,
- vsak zapis predstavlja eno smiselno stvar,
- tabela ima jasen namen,
- med tabelami lahko vzpostavimo odnose.
Na začetku zadošča, da dijak razume, da “ena ogromna tabela za vse” običajno ni najboljša ideja.
Primarni ključ¶
Primarni ključ enolično prepozna vrstico.
Primer:
CREATE TABLE knjige (
id INTEGER PRIMARY KEY AUTOINCREMENT,
naslov TEXT NOT NULL,
avtor TEXT NOT NULL,
leto INTEGER
);
Zakaj je to koristno?
- lahko se zanesljivo sklicujemo na zapis,
- dva zapisa imata lahko isti naslov, ne pa istega
id, - urejanje in brisanje postaneta veliko enostavnejša.
Osnovne SQL operacije¶
Štiri osnovna dejanja so:
SELECT– preberi,INSERT– dodaj,UPDATE– spremeni,DELETE– izbriši.
To je osnovni CRUD svet.
INSERT¶
Ta ukaz doda novo vrstico.
SELECT¶
To je osnovni način za branje podatkov.
Filtriranje¶
Urejanje¶
Omejitev rezultatov¶
UPDATE¶
Vedno razloži tudi nevarnost: brez WHERE lahko spremeniš vse vrstice.
DELETE¶
Tudi tukaj je WHERE izjemno pomemben.
Povezave med tabelami¶
Že na osnovni ravni je koristno pokazati, da imamo lahko več tabel.
Primer:
avtorjiknjige
Tabela knjige lahko vsebuje tuj ključ do avtorja.
CREATE TABLE avtorji (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ime TEXT NOT NULL
);
CREATE TABLE knjige (
id INTEGER PRIMARY KEY AUTOINCREMENT,
naslov TEXT NOT NULL,
leto INTEGER,
avtor_id INTEGER NOT NULL,
FOREIGN KEY (avtor_id) REFERENCES avtorji(id)
);
To pokaže, da relacijska baza ni samo “velik Excel”.
JOIN – osnovna ideja¶
Začetnikom ni treba delati deset vrst JOIN kombinacij. Dovolj je en uporaben primer.
SELECT knjige.naslov, avtorji.ime
FROM knjige
JOIN avtorji ON knjige.avtor_id = avtorji.id
ORDER BY knjige.naslov;
S tem dijak vidi, da lahko podatke povezujemo med tabelami.
Omejitve in kakovost podatkov¶
Tabele naj ne bi bile popolnoma brez pravil. Koristne omejitve so:
NOT NULLPRIMARY KEYUNIQUEFOREIGN KEY
Zakaj?
Ker dobra baza ne hrani samo podatkov, ampak tudi pravila o kakovosti podatkov.
Kako razmišljati pri poizvedbi¶
Začetniki pogosto gledajo SQL kot čudno sintakso. Pomaga, če ga predstaviš kot zaporedje vprašanj:
- katere stolpce hočem,
- iz katere tabele,
- katere vrstice želim,
- kako jih želim urediti,
- koliko jih želim.
To SQL precej poenostavi.
SQL in Flask¶
V učnem projektu bo SQL povezan z Flaskom tako, da:
- obrazec pošlje podatke,
- Flask jih prebere,
- SQL jih shrani v bazo,
- Flask nato s
SELECTprebere sezname, - predloga rezultate prikaže uporabniku.
To je odličen trenutek, da SQL ne ostane abstrakten.
Parameterizirane poizvedbe¶
To je obvezni minimum varnosti.
Napačno:
Pravilneje:
Zakaj?
- ker preprečuješ nevarno lepljenje SQL nizov,
- ker je to pravilnejši način dela,
- ker se dijak že zgodaj navadi na dobro prakso.
Normalizacija – samo osnovna intuicija¶
Ni treba predavati cele teorije normalnih form, je pa koristno povedati:
- ne zapisuj iste informacije desetkrat brez potrebe,
- en koncept naj ima jasno mesto,
- povezane stvari loči v ločene tabele, ko postane smiselno.
To je dovolj, da dijak začne razvijati zdravo intuicijo.
Pogoste napake¶
Vse je v eni tabeli¶
To je pogosto hitra pot v zmedo.
Manjka primarni ključ¶
Potem je težje urejati in brisati posamezne zapise.
UPDATE ali DELETE brez WHERE¶
To je legendarna katastrofa začetnikov.
Lepljenje nizov v SQL¶
To je nevarna navada, ki jo je treba zatreti takoj.
Nerazumevanje tipov podatkov¶
Če je vse tekst, model hitro postane meglen.
Kontrolni seznam¶
1. Ali tabela predstavlja eno jasno stvar?
2. Ali ima tabela primarni ključ?
3. Ali obvezna polja res ne smejo biti prazna?
4. Ali pri UPDATE/DELETE uporabljam WHERE?
5. Ali SQL podatke berem v pravilnem vrstnem redu?
6. Ali uporabljam placeholderje namesto lepljenja nizov?
Kaj naj dijak zna po tem poglavju¶
- razložiti, kaj je tabela,
- ustvariti preprosto tabelo,
- napisati
INSERT,SELECT,UPDATE,DELETE, - razumeti namen primarnega ključa,
- okvirno razumeti, zakaj obstajajo povezave med tabelami,
- uporabljati parameterizirane poizvedbe.
Pomembno
Če SQL ostane samo teorija, ga dijaki hitro pozabijo. Ko pa z enim obrazcem dejansko vpišejo podatke v bazo in jih nato spet vidijo na strani, SQL nenadoma postane zelo smiseln.