Duomenų bazė – kursinis darbas

1. Bendra informacija

Užduotis: sukurti duomenų bazę su formomis, kuriomis galutinis vartotojas galėtų lengvai naviguoti bei pamatyti atitinkamą informaciją iš duomenų bazės. Duomenų bazę, t.y. lenteles, kūriau su „Oracle 9i“ programa, o formas – su “Forms Designer 1966”.

Tema: „Quake III Arena“ pasaulinis turnyras 2001.

Į duomenų bazę yra įvesti visi žaidėjai, dalyvavę pasauliniame “Quake III Arena” žaidimo turnyre, kuris vyko 2001 metų pavasarį, Korėjoje.
“Quake III Arena” – tai kompiuterinis trimatis veiksmo žaidimas, tęsiantis seną ir ypač populiarią – “Id Software” kompanijos sukurtą – “Quake” žaidimų seriją. Žaidimas pagrįstas greitu veiksmu, puikiai subalansuotais ginklais, šiuolaikiška grafika bei yra lengvai žaidžiamas per tinklą. Žaidėjai kaunasi žemėlapiuose, kur yra išdėstyti ginklai, amunicija, šarvai bei vaistinėlės. Kiekvienas žemėlapis yra savitas, todėl žaidimo eiga ir pabaiga ne tik priklauso nuo žaidėjų įgūdžių, bet ir nuo aplinkos, kurioje jie žaidžia: platesnės erdvės leis ilgiau apgalvoti pasirinktą puolimo strategiją, kai tuo tarpu siauruose koridoriuose viską nulems reakcija.
Sudariau penkias lenteles: informacija apie žaidėjus (viso 60), informacija apie mėgstamiausius žaidėjų ginklus (viso 8), sąrašas valstybių , iš kurių atvyko žaidėjai (viso 24), informacija apie mėgstamiausius žaidėjų žemėlapius (4) bei pirmą ir antrą dieną surinktų taškų suvestinė.

2. Lentelės

2.1 Kūrimas

Taigi, kaip minėjau yra 5ios lentelės: valstybes, zaidejai, zemelapiai, taskai ir ginklai. Žemiau pateikiu šių lentelių sukūrimo sintaksę:

•    create table VALSTYBES (“VALSTYBES_ID” number(2) PRIMARY KEY, “PAVADINIMAS” varchar2(16));
•    create table ZEMELAPIAI(“ZEMELAPIO_ID” number(2) PRIMARY KEY, “PAVADINIMAS” varchar2(15), “GINKLAI” number(1), “SARVAI” number(1), “ZAIDIMO_TEMPAS” varchar2(17));
•    create table GINKLAI(“GINKLO_ID” number(2) PRIMARY KEY, “PAVADINIMAS” varchar2(18), “NUOTOLIS” varchar2(9), “AMUNICIJOS_SPALVA” varchar2(19));
•    create table ZAIDEJAI (“ZAIDEJO_ID” number(2) PRIMARY KEY, “VARDAS_PAVARDE” varchar2(20), “GIMIMAS” date, “PSEUDONIMAS” varchar2(20), “SURINKTI_TASKAI” number(3), “VALSTYBES_ID” number(2), “ZEMELAPIO_ID” number(2), “GINKLO_ID” number(2), constraint ZAIDEJAI_VALSTYBES_ID_fk FOREIGN KEY(“VALSTYBES_ID”) REFERENCES VALSTYBES(“VALSTYBES_ID”) ON DELETE CASCADE);
•    create table TASKAI(“ZAIDEJO_ID” number(2), “PIRMA_DIENA” number(3), “ANTRA_DIENA” number(3));
•    alter table zaidejai add constraint ZAIDEJAI_ZEMELAPIO_ID_fk FOREIGN KEY(“ZEMELAPIO_ID”) REFERENCES ZEMELAPIAI(“ZEMELAPIO_ID”) ON DELETE CASCADE;
•    alter table zaidejai add constraint ZAIDEJAI_GINKLO_ID_fk FOREIGN KEY(“GINKLO_ID”) REFERENCES GINKLAI(“GINKLO_ID”) ON DELETE CASCADE;
•    alter table zaidejai add constraint TASKAI_ZAIDEJO_ID_fk FOREIGN KEY(“ZAIDEJO_ID”) REFERENCES ZAIDEJAI(“ZAIDEJO_ID”) ON DELETE CASCADE;

Sukurtos jos atrodo sekančiai:
SQL> select table_name from user_tables;

TABLE_NAME
——————————
GINKLAI
TASKAI
VALSTYBES
ZAIDEJAI
ZEMELAPIAI
2.2 Struktūra

Įvedus komandą desc zaidejai į „Oracle 9i“ konsolę, galima pasižiūrėti lentelės struktūrą (šiuo atveju, įvedus jau minėtą komandą, matysime lentelės zaidejai struktūrą). Taigi, žemiau pateikiu visų lentelių struktūrą:

1 pav.Lentelių struktūra.

Iš kairės į dešinę:     a) kolonėlėje Name talpinama lentelės kolonėlių pavadinimai;
b) kolonėle Null? nusako, ar gali toje kolonėlėje įrašo nebūti. Jeigu yra įrašyta Not Null, vadinasi įrašas yra privalomas;
c) ir paskutinė kolonėlė Type parodo nustatytus lentelės kolonėlių duomenų tipus. Number(2) reiškia galimi tik skaitmeniniai duomenys, iki 99 (2 skaičiai). Varchar2(15) leidžia naudoti simbolius, kurių eilutės seka būtų sudaryti daugiausiai iš 15 simbolių (varchar2 nurodo, jog atmintyje bus išskirta tiek vietos, kiek realiai įrašas užims. Tarkim įrašas yra 13 raidžių žodis, tai priešingai nei varchar tipe, jis 13 baitų ir užims). Ir galiausiai Date nusako, jog tai bus datos tipo duomenys.

2.3 Apribojimai

Toliau galime pasiūrėti lentelėse sukurtus apribojimus:

SQL> select constraint_name, constraint_type, table_name from user_constraints;

CONSTRAINT_NAME                C TABLE_NAME
—————————— – ——————————
SYS_C0049359                           P GINKLAI
SYS_C0049357                           P VALSTYBES
SYS_C0049360                           P ZAIDEJAI
ZAIDEJAI_VALSTYBES_ID_FK    R ZAIDEJAI
ZAIDEJAI_ZEMELAPIO_ID_FK     R ZAIDEJAI
ZAIDEJAI_GINKLO_ID_FK              R ZAIDEJAI
TASKAI_ZAIDEJO_ID_FK               R ZAIDEJAI
SYS_C0049358                           P ZEMELAPIAI
SYS_C0047938                           P GINKLAI
SYS_C0047939                           P TASKAI
SYS_C0047934                           P VALSTYBES
SYS_C0047935                           P ZAIDEJAI
ZAIDEJAI_VALSTYBES_ID_FK    R ZAIDEJAI
SYS_C0047937                           P ZEMELAPIAI

Taigi, lentelėse zaidejai, ginklai, zemelapiai, taskai bei valstybes egzistuoja dviejų tipų apribojimai:
1.    Lentelė ZAIDEJAI. Kolonėlės Valstybes_ID, Zemelapio_ID, Ginklo_ID turi Foreign Key apribojimą, ir taip yra susietos su lentelėmis VALSTYBES, ZEMELAPIAI bei GINKLAI ryšiu vienas-su-daug. Taip pat lentele ZAIDEJAI turi ir Primary Key apribojimą Zaidejo_ID kolonėlėje. Tiek PK, tiek ir FK apribojimai neleidžia įrašams kartotis ar būti neįvestiems.
2.    Lentelė GINKLAI. Kolonėlė Ginklo_ID turi Primary Key apribojimą.
3.    Lentelė VALSTYBES. Kolonėlė Valstybes_ID turi taip pat Primary Key apribojimą.
4.    Lentelė ZEMELAPIAI. Kolonėlė Zemelapio_ID turi Primary Key apribojimą.
5.    Lentelė Taskai. Kolonėlė Zaidejo_ID turi Foreign Key apribojimą.

2.4 Ryšiai

2 pav. Ryšiai tarp lentelių.

Čia pavaizduoti ryšiai tarp esančių lentelių. 1 – ∞ ryšys (vienas-su-daug) nusako, jog tarkim lentelėje ZEMELAPIAI vieną žemėlapį iš lentelės ZAIDEJAI gali atitikti daug žaidėjų. Toks pat principas galioja ir lentelėms GINKLAI bei VALSTYBES.
O lentelė TASKAI su ZAIDEJAI yra susieta vienas-su-vienu ryšiu – kiekvienas įrašas iš lentelės TASKAI atitinka vieną įrašą (šiuo atveju žaidėją) ZAIDEJAI lentelėje.

3. Formos

Kad su sukurta duomenų baze butų dirbti patogiau bei suprantamiau eiliniam vartotojui, sukūriau 11 formų. Darbą galima pradėti paleidus pagrindinę formą – intro.fmb. Čia bus titulinis langas, kuriame matysite nuorodas į kitas formas:

3 pav. Pagrindinė forma.

Čia matome darbo pavadinimą, autorių, logotipą bei mygtukus. Būtent pasinaudojus mygtukais, galima patekti į kitas formas. Taigi, apie mygtukų reikšmes:
Perziura – atidarys formą, kurioje galima pasirinkti vieną iš keturių formų tik peržiūrėjimui.
Ivedimas – atidarys formą, kurioje galima pasirinkti vieną iš trijų formų duomenų įvedimui. Plačiau apie jas kiek vėliau.
Paieska – atidarius formą, leidžia ieškoti žaidėjų pagal jų vardus arba pseudonimus.
Apie turnyra – trumpa informacija apie vykusį turnyrą bei „Quake III Arena“.

Beje, verta paminėti, jog kiekvienoje formoje yra panaudotas automatiškas užklausos paleidimo mechanizmas, tik ją atidarius. Tai įgyvendinta trigerio WHEN_NEW_FORM_INSTACE pagalba, įvedus komandą:
Execute_query;

3.1 Peržiūra

Pasirinkus pagrindiniame meniu mygtuką Perziura, bus atidaryta forma su mygtukais.

4 pav. Peržiūros forma.

Kaip matome, čia galima pasirinkti vieną iš keturių mygtukų, kuris atidarys atitinkamą formą. Beje, bet kuriuo metu galima grįžti į pradinį meniu, paspaudus mygtuką meniu.

3.1.1 Valstybės ir žaidėjai

Ši forma yra master-detail tipo. Master blokas čia yra lentelė VALSTYBES, o detail – ZAIDEJAI. Šios lentelės yra susietos per Valstybes_ID kolonėlę.

5 pav. Forma „Valstybės ir žaidėjai“.

Navigacija čia paprasta: mygtukais <, > galite vaikščioti po Valstybes_ID įrašus ir matyti apatiniame bloke atitinkamus žaidėjus iš tam tikros valstybes. Kartu su šiais mygtukais panaudoti du WHEN-MOUSE-CLICK trigeriai:
a) per vieną įrašą atgal:
begin
go_item(‘Valstybes_ID’);
go_block(‘Valstybes’);
previous_record;
end;

b) per vieną įrašą į priekį:
begin
go_block(‘Valstybes’);
go_item(‘Valstybes_ID’);
next_record;
end;
Mygtukas meniu veikia taip pat WHEN-MOUSE-CLICK trigerio pagalba:
OPEN_FORM(‘C:\TEMP\intro.fmx’);

P a s t a b a. Kurie mygtukai kartosis tolesnėse formose, jų neaptarinėsiu, kadangi veikimo principas išliks tas pats, skirsis tik parametrai.

3.1.2 Ginklai ir žaidėjai

Ši forma taip pat yra master-detail tipo. Čia master blokas yra GINKLAI, o detail blokas – ZAIDEJAI. Sujungtos šios lentelės čia per Ginklo_ID kolonėlę.

6 pav. Forma „Ginklai ir žaidėjai“.

3.1.3 Žemėlapiai ir žaidėjai

Dar viena master-detail tipo forma. Čia master blokas yra ZEMELAPIAI, o detail blokas – ZAIDEJAI. Sujungtos šios lentelės čia per Zemelapio_ID kolonėlę.

7 pav. Forma „Žemėlapiai ir žaidėjai“.

3.1.4 Žaidėjai ir taškai

Paskutinioji master-detail tipo forma. Priešingai nei kitose formose, čia master blokas yra ZAIDEJAI, o detail blokas – TASKAI. Sujungtos šios lentelės čia per Zaidejo_ID kolonėlę. Taip pat šioje formoje įgyvendinti Radio mygtukai. Pažymėjus atitinkamai vieną iš jų, bus rodomi žaidėjai, tenkinantys pasirinktą kriterijų. Pvz., pasirinkus pirmąji Radio mygtuką, kairėje bus rodomi žaidėjai, kurie surinko mažiau nei 100 taškų. Taip pat su pele paspaudus ant norimo žaidėjo, būtų galima pamatyti detaliau pirmą ir antrą dienomis surinktus taškus bloke TASKAI.

8 pav. Forma „Žaidėjai ir taškai“.

3.2 Įvedimas

Atsidarius šios formos langui, bus matomi trys mygtukai, kuriuos pasirinkus bus galima įvedinėti atskirai – arba žaidėjus, arba ginklus, arba valstybes.

3.2.1 Žaidėjai

9 pav. Forma „Žaidėjų įvedimas“.

Be jau minėtu <, > ir meniu mygtukų, ši forma dar papildyta keliais naujais:
a)    Trinti – šis mygtukas leis ištrinti įrašą. Vėlgi WHEN-MOUSE-CLICK trigeris:
begin
go_item(‘Valstybes_ID’);
go_block(‘Valstybes’);
delete_record;
end;
Taip pat paspaudus šį mygtuką pasirodys įspėjantysis pranešimas (ALERT), klausiantis ar tikrai norime ištrinti įrašą. Šis pranešimas sukurtas į ALERTS skiltį įdėjus DELETE_ALERT bei Program Unit skiltyje įrašius programos kodą:
PROCEDURE Rodyti_delete_Alert IS
return_alert NUMBER;
BEGIN
return_alert:=show_alert(‘DELETE_ALERT’);
if return_alert=alert_button1 then
commit;
else
rollback;
end if;

END;

b)Naujas – leis įvedinėti naują įrašą:
begin
go_block(‘Zaidejai’);
create_record;
end;
c)Paskutinis – rodys paskutinį įrašą:
begin
go_block(‘Zaidejai’);
last_record;
end;
d)Issaugoti – išsaugos visus pakeitimus:
commit_form;

3.2.2 Valstybės

Analogiška forma prieš tai aptartai, tik vienintelis skirtumas – čia galima įvesti tik valstybes.

10 pav. Forma „Valstybių įvedimas“.

3.2.3 Ginklai

Forma, skirta ginklų įvedimui.

11 pav. Forma „Ginklų įvedimas“.

3.3 Paieška

12 pav. Forma „Paieška“.

Šioje formoje yra realizuotas „List Of Values“, arba trumpiau LOV. Būtent jo pagalba galime atlikti paiešką žaidėjų tiek pagal pseudonimą, tiek pagal vardą ar pavardę.
Sukūrus LOV su vedliu, jis yra priskiriamas mygtukui paieska ir aktyvuojamas trigeriu WHEN-BUTTON-PRESSED:
declare
return_lov Boolean;
begin
return_lov:=Show_lov(‘LOV2’);
end;

Čia LOV2 yra pavadinimas. O paieškos forma paspaudus mygtuką atrodys sekančiai:

3.4 Pabaiga

Galiausiai, iškilus neaiškumams ar norint labiau susipažinti su nagrinėjama tema, iš pagrindinio meniu galima pasirinkti apie turnyra mygtuką:

13 pav. Forma „Apie turnyrą“.

Ir galiausiai, norint baigti darbą, pasirenkame mygtuką uzdaryti, iš pagrindinio meniu. Šis mygtukas yra įgyvendintas WHEN-MOUSE-CLICKED trigeryje įrašius kodą exit_form;

7. Išvados

Sukūriau duomenų bazę su penkiomis lentelėmis, ryšiais bei vaizdingomis formomis įvairiai informacijai įvesti bei ja manipuliuoti. Didesnių problemų neturėtų kilti netgi nedaug įgudusiam vartotojui: mygtukai pakankamai suprantami, tekstas aiškus. Kuriant naudotas „Oracle 9i client edition“ bei „Forms Builder 1996“.

8. Literatūra

1.    Introduction to Oracle9i – SQL;
2.    Oracle9i – Develop PL/SQL Program Units;
3.    Oracle9i DBA Fundamentals;
4.    Prentice Programming  Oracle Triggers And Stored Procedures 3rd Edition;
5.    OraFaq.com forumai;
6.    www.worldcybergames.com