Kodulehed
[384] - Andmebaasid I (ITI0206) (kevad 2023)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / Andmebaasi kavandamise sisulised küsimused

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Erki Eessaar (16.02.2023 15:30):
Miks on halb mõte kasutada erinevates tabelites ühesuguse nimega (id, kood või code) primaarvõtme veergu?
Vastus (18.01.2024 01:00): See muudab keerulisemaks tabelites olevatest andmetest arusaamise ja tabelite põhjal päringute tegemise.

Sellise nimega primaarvõtme veerud on üks sümptom, mis viitab sellele, et andmebaasi disainis esineb "Üks suurus kõigile" andmebaasi disaini antimuster. Antimuster on struktuurse kirjutamise viis, kuidas panna kirja halbu lahendusi levinud probleemidele.

Selline nimi on liiga üldine ja tuleb päringute tulemuses enamasti ümber nimetada. Vastasel juhul tekib päringu tulemusse mitu sama nimega veergu, mis vormiliselt on küll SQLis lubatud, kuid sisuliselt muudab see päringu tulemuse raskesti kasutatavaks.

Oletame, et andmebaasis on tabelid:

Mark (id, nimetus)
Primaarvõti (id)

Auto (id, mark_id, registri_nr)
Primaarvõti (id)
Välisvõti (mark_id) Viitab Mark (id)

Kui ülesandeks on leida iga auto kohta margi identifikaator, nimetus, auto identifikaator ja registri number, siis tuleks kirjutada päring

SELECT Mark.id AS mark_id, nimetus, Auto.id AS auto_id, registri_nr
FROM Mark INNER JOIN Auto ON Mark.id=Auto.mark_id;

Samas, kui andmebaasis oleksid tabelid:

Mark (mark_id, nimetus)
Primaarvõti (mark_id)

Auto (auto_id, mark_id, registri_nr)
Primaarvõti (auto_id)
Välisvõti (mark_id) Viitab Mark (mark_id)

, siis saab selle ülesande lahendada SQL standardit hästi järgivas andmebaasisüsteemis (nt PostgreSQL) oluliselt lühema lausega. USING võimaldab teha ühendamist üle samanimeliste veergude. Ühendamise tulemuses on see veerg (antud juhul mark_id) ühekordselt, st SELECT klauslis pole veeru nime ees vaja täpsustada tabeli nime.

SELECT mark_id, nimetus, auto_id, registri_nr
FROM Mark INNER JOIN Auto USING (mark_id);

Hinda vastust:

Keskmine hinne : 4.0