BAZOM NA BAZU CIK -BIH

3.1. Prije nego što se podnese zahtjev za pristup informacijama treba pokušati tražene informacije dobiti na neformalni način.
Centralna izborna komisija BiH - Vodič za pristup informacijama.


UVOD

Prije nekoliko godina, čitao sam blog legendarnog Tom Kyte o dizajnu relacionih baza, najbolje i najgore prakse. 

Jedna od tih priča govori o tome da se čitav sistem može dizajnirati pomoću jedene tabele. Ta tabela sadrži ID, PARENT_ID i XML kolonu. ID i PARENT_ID opisuju relacije između objekata koji su opisani u XML koloni. Ideja je opisana kao jedna od najgorih... U mom slučaju ne radi se o sistemu, ali se radi o varijaciji ovog modela koji se pokazao vrlo upješnim prilikom prikupljanja podataka sa web servisa Centralne izborne komsije Bosne i Hercegovine.

Ovo je mali projekat koji pokazuje na koji način organizacije i pojedinci, koje to žele, mogu da formiraju bazu podataka opštih izbora Bosne i Hercegovine održanih 2018 godine. Tekst je edukativne i tehničke prirode.

Tehnologije: Oracle XE koja je besplatna i može se preuzeti sa www.oracle.com


STRUKTURA PODATAKA

Ideja: preuzezi bazu podataka CIK-a sa web sajta www.izbori.ba, izborna jedinica Republika Srpska.

Analizom web sajta www.izbori.ba može se zaključiti sljedeća struktura podataka.



U prvim testiranjima, očekivao sam da su biračka mjesta objedinjena za sve nivoe, međutim to nije tačno, tako da ista biračka mjesta imaju različite vrijednosti primarnih ključeva. Opravdanja za ovakav pristup nema, pa čak ni u verzijama DWH baze.



WEB SERVISI


Za svaku od relacija iz gore navedenog modela postoji web servis. Web servis vraća json fajl u kojem je smještena lista objekata.
Spisak web servisa:

race5_electoralunit/{dbName}/1
race1_pollingstation/{dbName}/{electoralUnitId}/1
race5_pollingstation/{dbName}/{electoralUnitId}/1
race1_pollingstationsbasicinfo/{dbName}/{pollingStationId}
race2_pollingstationsbasicinfo/{dbName}/{pollingStationId}
race5_pollingstationsbasicinfo/{dbName}/{pollingStationId}
race6_pollingstationsbasicinfo/{dbName}/{pollingStationId}
race2_pollingstationspartyresult/{dbName}/{pollingStationId}/1
race6_pollingstationspartyresult/{dbName}/{pollingStationId}/1
race1_pollingstationscandidatesresult/{dbName}/{pollingStationId}/1
race2_pollingstationscandidatesresult/{dbName}/{pollingStationPartyResultId}/1
race5_pollingstationscandidatesresult/{dbName}/{pollingStationId}/1
race6_pollingstationscandidatesresult/{dbName}/{pollingStationPartyResultId}/1



MODEL BAZE

Ideja: model baze koji će opisati web servise, skladištiti sve json fajlove i opisati relacije između json fajlova.  






LOGIKA IZVRŠENJA

Ideja: osmisliti proces koji će u n interacija skupljati nove podatke i unositi ih u bazu.

Na ovom koraku se sve svodi na to koliko puta možemo prozvati web servis, kojom brzinom i da li možemo izvršavati paralelne procese.

Iz strukture se vidi da su web servisi kaskadno vezani i uslovljeni jedan drugim.

U nekim brzim izračunavanjima došao sam do broja od oko 100.000 poziva prema cik api-ju da bi se preuzeli svi podaci izborne jedinice RS. U testiranjima koja sam obavio po standardnim podešavanjima  utl_http paketa, prosječan broj uspješnih poziva je iznosio oko 1500 u jednom satu što bi značilo da bi proces preuzimanja trajao oko 66h. Razlog malog broja uspješnih poziva je time-out exception koji se vjerovatno dogodi na web serveru cik-a, zatim utl_http čaka 60 sekundi prije nego podigne exception. Broj ovih izuzetaka je iznosio oko 10% od ukupnonog broja poziva.

Uz malo upornosti, strpljenja i analize koje nisam imao, utl_http bi se mogao podesiti da što optimalnije čeka na odgovor servera.

Multithreading sa bazama nije baš u modi, ali kako sam proces preuzimanja podataka iz baze traje onda je neophodno napraviti job-ove koji će u pozadini prkupljati podatke.

Za svaki definisani web servis (tabela cik_webservices) sem 100 koji je početni, napravljen je job, npr. CIK210, CIK230, CIK310, CIK320....

Logika u paketu podržava ovakvo izvršenje te će tako job-ovi čim dobiju dovoljno informacija početi nezavisno prikupljati podatke. Ovom logikom brzina poziva web servisa je iznosila oko 4000-4500 poziva u jednom satu.
  



ZAKLJUČAK

Rezultat jednodnevnog izvršenja je oko 100000 json fajllova koji sadrže kompletne podatke za formiranje denormalnizovane baze CIK-a.

Za pohvalu je što je CIK omogućio javni prstup "bazi podataka", bez obzira na činjenicu da su rezultati denormalizovani. Uz malo truda, preko modela koji sam napravio, potrudiću se da u nekom od narednih blogova opišem proces normalizacije baze. Rezultat ove aktivnosti bi trebao biti normalizovani registar političkih subjekata i njihovi rezultati na opštim izborima 2018 u BiH.

Volio bih da vidim stvarnu fizičku organizaciju tabela u ovoj aplikaciji. Sa jedne strane mi se čini da  je loše dizajnirana sa velikim stepenom denormalizacije, sa druge strane ovaj zključak je izveden na bazi strukture i sadržaja json fajlova pa ne mora biti istinit.

Kao čovjek koji se profesionalno bavi obradom podataka, ovaj mini projekat je bio čisto zadovoljsto kao i dokaz da politika može biti interesantna.


SKRIPTA








Primjedbe

Popularni postovi s ovog bloga

STANDARDNO PODEŠAVANJE DEFAULT RAZMIŠLJANJE

How to create user define help (Oracle APEX)