Skip to content

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

INSERT INTO knjige (naslov, avtor, leto)
VALUES ('Alamut', 'Vladimir Bartol', 1938);

Ta ukaz doda novo vrstico.

SELECT

SELECT id, naslov, avtor, leto
FROM knjige;

To je osnovni način za branje podatkov.

Filtriranje

SELECT naslov, avtor
FROM knjige
WHERE leto >= 1950;

Urejanje

SELECT naslov, avtor, leto
FROM knjige
ORDER BY naslov ASC;

Omejitev rezultatov

SELECT naslov
FROM knjige
LIMIT 10;

UPDATE

UPDATE knjige
SET leto = 1948
WHERE id = 2;

Vedno razloži tudi nevarnost: brez WHERE lahko spremeniš vse vrstice.

DELETE

DELETE FROM knjige
WHERE id = 2;

Tudi tukaj je WHERE izjemno pomemben.

Povezave med tabelami

Že na osnovni ravni je koristno pokazati, da imamo lahko več tabel.

Primer:

  • avtorji
  • knjige

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 NULL
  • PRIMARY KEY
  • UNIQUE
  • FOREIGN 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:

  1. katere stolpce hočem,
  2. iz katere tabele,
  3. katere vrstice želim,
  4. kako jih želim urediti,
  5. 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 SELECT prebere 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:

sql = f"SELECT * FROM knjige WHERE naslov = '{naslov}'"
cur.execute(sql)

Pravilneje:

cur.execute(
    "SELECT * FROM knjige WHERE naslov = ?",
    (naslov,)
)

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.