Komanda 'CREATE INDEX'

Last modified by superadmin on 2018-01-12 20:38

Komanda 'CREATE INDEX'

Šī komanda veido indeksus tabulām. Galvenā vajadzība, kāpēc ir tāda iespēja - lai taupītu vietu un paārtrinātu meklēšanu. Tas izraisa zināmas grūtības meklēšanā ar SELECT kā arī datu sasaistes brīžos, bet ļoti atmaksājas jau tabulām, kurās ir vairāk kā 10 000 ieraksti. CREATE INDEX ir vecais stils kā definēt indeksus tabulai, tas ir SQL standarts:
CREATE [UNIQUE] INDEX index_name ON tbl_name (col_name[(length)],... )
piemēram,
CREATE INDEX name ON cilveks (uzvards,vards)
Bet ir arī drusku modernāks stils, tad indeksus definē tabulas veidošanas momentā. Tas tiek atbalstīts tikai jaunākajās datubāzu vadības sistēmu versijās:
CREATE TABLE cilveks (
    id_cilveks INT NOT NULL,
    vards CHAR(30) NOT NULL,
    uzvards CHAR(30) NOT NULL,
    PRIMARY KEY (id_cilveks),
    INDEX name (uzvards,vards));
Standarta uzdevums, ko risina tabulu indeksi, ir datu redundances novēršana, jeb, vienkārši sakot, datu neatkārtošanās. Kā pareizi dalīt informāciju, kā sasaistīt savā starpā šos datus, tā atkal ir datu normalizācijas zinātne. Otrs pamatuzdevums, ko risina indeksi, ir klasifikatoru uzturēšana. Klasifikators - ir maz mainīga datu kopa, kuru bieži lieto.

Piemēram eksāmena novērtējums 10-ballu sistēmā (no 1-"bezcerīgs gadījums" līdz 10-"GURU"), katram eksāmena kārtotājam jābut obligāti kādai atzīmei, un lai nebūtu pārpratumi novērtējot piemēram viens novērtējumu "LABI" raksta ar atzīmi 6, cits ar 7, kas parasti nav pieņemami. Lai tā nenotiktu, uztaisa vienotu vērtējumu sistēmu, sasaistot skaitliskās atzīmes ar vārdiskajiem raksturojumiem. Lietotājs redz tikai izvēli ar attiecīgajiem vārdiem, un skaitļi atbilstošajiem vārdiem ievietojas pilnīgi vienādi.

Izklāstīšu pamatideju par tabulu veidošanu. Tipisks uzdevums - jums vajag glabāt cilvēku pierakstus pēc dzīvesvietas. Ienākošie dati ir sekojoši:

1) Miki Mausis , Latvija, Rīga, Kino iela 1-1
2) Donalds Daks , Latvija, Rīga, Kino iela 1-1
Mēs šos datus mākam iztulkot un iesākumā tos varētu dalīt jēdzieniski loģiskās vienībās, uzskatot ka katrai personai noteikti ir adrese.

NPKCILVEKSADRESE
1Miki MausisLatvija, Rīga, Kino iela 1-1
2Donalds Daks Latvija, Rīga, Kino iela 1-1

Daudzi pie šāda sadalījuma arī apstājas un smalkāk šo informāciju nedala. Starp citu, parasti šo pirmatnējo sadalījumu izmanto, lai veidotu tabulu nosaukumus un satura skices (tas ir lai izdomātu kādas tabulas ko glabās), mūsu gadījumā ir viegli redzams, ka būs divas tabulas - viena par personu un otra par adresi. Bet kā jūs labi saprotat šīs informācijas vienības ļoti viegli dalās apakšlīmeņos, jo tā ir pēc būtības strukturēta informācija. Mūsu mērķis ir izveidot pēc iespējams strukurētāku informācijas loģisko sadalījumu. No augstāk minētās informācijas mēs iegūstam sekojošu struktūras detalizāciju.

ID_CILVEKSUZVARDSVARDSVALSTS PILSETAIELANR_DZ
1MikiMausisLatvijaRīgaKino1-1
2DonaldsDaksLatvijaRīgaKino1-1

No šīs iegūtās sadalījuma informācijas redzams, ka abām minētajām personām ir vienādas adreses. Tātad viena adrese uz 2 personām (to sauc par 1-N (lasās viens pret N) saiti). Tātad sasaiti veidojam tā , ka cilvēkam noteikti ir adrese, nevis adresei ir noteikti viens cilvēks. (Adrese var eksistēt arī bez tā ka tur kāds ir pierakstīts - neapdzīvota platība). Tātad taisam divas tabulas, kur cilvēks ir piesaistīts adresei:

Tabula: cilveks
ID_CILVEKSINT NOT NULL
VARDSCHAR(30) NOT NULL
UZVARDSCHAR(30) NOT NULL
ID_ADRESEINT NOT NULL DEFAULT -1

Jūs jautāsiet, kāpēc pie lauka ID_ADRESE ir noklusētā vērtība "-1". Tas tiek darīts tādēļ, lai paredzētu gadījumu, kad mēs nezinām konkrētu adresi kur pierakstīts cilvēks, bet piesaistītam viņam jābūt pēc atrunas. Tāpēc veidojot visus klasifikatorus (tabulas), tajos ieliek aizpildītu ierakstu ar indeksu -1. Teiksim jūs izveidotjat ierakstu par cilvēku, bet konkrētu adresi izvēlaties kaut kad vēlāk, kad adrese ir ievadīta vai arī noskaidrota ir cilvēka pieraksta vieta.

Tabula: adrese
ID_ADRESEINT NOT NULL
VALSTSCHAR(50) NOT NULL
PILSETACHAR(50) NOT NULL
IELACHAR(50) NOT NULL
NR_DZCHAR(10) NOT NULL

Protams, normāli būtu, ka mēs turpinātu strukturēt informāciju, un teiksim izveidotu atseviški klasifikatorus (citas tabulas) priekš Valstu, Pilsētu, Ielu uzglabāšanas, lai ar šī informācija gan ir apjomīga, toties bieži atkārtojas, bet to šeit detalizēti nedarīsim. SQL skripts šīm tabulām izskatītos sekojoši:

DROP TABLE IF EXISTS cilveks,adrese;
CREATE TABLE adrese (
           id_adrese INT NOT NULL,
           valsts CHAR(50) NOT NULL,
           pilseta CHAR(50) NOT NULL,
           iela CHAR(50) NOT NULL,
           nr_dz CHAR(10),
           PRIMARY KEY (id_adrese));
CREATE TABLE cilveks (
           id_cilveks INT NOT NULL,
           vards CHAR(30) NOT NULL,
           uzvards CHAR(30) NOT NULL,
           id_adrese INT REFERENCES adrese.id_adrese);

INSERT INTO adrese (id_adrese,valsts,pilseta,iela,nr_dz)
       VALUES (1,"Latvija","Rīga","Kīno","1-1");

INSERT INTO cilveks (id_cilveks,vards,uzvards,id_adrese)
       VALUES (1,"Miki","Mausis",1);

INSERT INTO cilveks (id_cilveks,vards,uzvards,id_adrese)
       VALUES (2,"Donalds","Daks",1);
Indeksēšanas citas iespējas un parametrus sk. MySQL komanda CREATE INDEX.
Tags:
Created by Kalvis Apsītis on 2008-05-04 16:01
    
This wiki is licensed under a Creative Commons 2.0 license
XWiki Enterprise 6.4 - Documentation