Duomenys be identifikatorių

level = 4.

Objektų identifikavimas

Kadangi atvirų duomenų saugykloje duomenys turėtų būti saugomi normalizuotoje formoje, susiejat lenteles tarpusavyje ryšiais, labai svarbu tinkamai identifikuoti objektus.

Tarkim, jei turime tokius duomenis:

COUNTRIES

code

country

lt

Lietuva

lv

Latvija

ee

Estija

Šioje lentelėje nėra pirminio rakto, todėl inventorizacijos lentelėje, model eilėtės ref stulpelis yra tuščias:

id

d

r

b

m

property

type

ref

source

level

datasets/gov/dc/countries

sql

Countries

COUNTRIES

code

string

code

2

country

string

country

2

Tam, kad lentelę būtų galima sieti su kitomis lentelėmis reikia turėti patikimą identifikatorių. Šiuo atveju, galima daryti prielaidą, kad laukas code unikaliai identifikuoja countries modelio įrašus, todėl model ielutės ref stulpeliui galima priskirti code reikšmę taip pakeliand modelio brandos lygį iki 4.

id

d

r

b

m

property

type

ref

source

level

datasets/gov/dc/countries

sql

Countries

code

COUNTRIES

code

string

code

4

country

string

country

4

Šiuo atveju, laukas code yra šalies kodas, kuris unikaliai identifikuoja objektą. Todėl galima šį lauką naudoti, kaip unikaliai identifikuojančią šalies reikšmę.

Dažnai pasitaiko, kad neužtenka vieno lauko norint unikaliai identifikuoti objektą, tokiu atveju, galima pateikti kelis laukus ref stulpelyje, atskiriant juos kableliu.

Po pertvarkymų taip pat reikėtų nepamiršti atnaujinti level stulpelio reikšmių, nurodant pasikeitusį brandos lygį. Kadangi atsirado galimybė identifikuoti modelio objektus, code laukui suteikėme 4 brandos lygį. Atitinkamai, pakeliam ir kitų laukų brandos lygį, kadangi įsitikinome, kad automatiškai suteiktas string tipas yra teisingas, kas leidžia suteikti 3 brandos lygį, tačiau taip pat įsitikinome, kad nei vienas iš laukų nėra ryšio su kita lentele laukas, todėl galime suteikti 4 brandos lygį.

Nei vienam iš šių laukų negalima suteikti 5 brandos lygio, kadangi base eilutė yra tuščia.

Objektai be identifikatoriaus

Duomenų šaltinis ne visada leidžia unikaliai identifikuoti objektą. Pavyzdžiui, jei turime tokią šaltinio lentelę:

VILLAGES

name

population

Gudeliai

28

Gudeliai

27

Gudeliai

19

Lentelė objektas yra kaimo gyvenvietė, tačiau nėra jokio kaimo gyvenvietės unikalaus identifikatoriaus. Lietuvoje gali būti daug gyvenviečių tokiu pačiu pavadinimu, ką ir matome lentelėje. Jungti gyvenvietės pavadinimo su gyventojų skaičiumi taip pat negalime, nes gyventojų skaičius gali sutapti su pavadinimu, be to gyventojų skaičius nuolat kinta.

Šiuo atveju neturim jokios išeities ir vienintelis būdas pakelti šio rinkinio brandos lygį, keičiant originalų duomenų šaltinį. Susidūrėme su nepakankamų duomenų atveju.

Galutinė inventorizacijos lentelė turėtų atrodyti taip:

id

d

r

b

m

property

type

ref

source

level

datasets/gov/dc/villages

sql

Villages

VILLAGES

name

string

name

4

population

string

population

4

name ir population laukams suteikėme 4 brandos lygį, kadangi šie laukai nėra ref tipo. Tačiau bendro modelio brandos lygio skaičiavime, šių laukų brandos lygis bus nuleistas iki 3, kadangi modelis neturi identifikatoriaus, todėl nė vienas laukas išskyrus ref tipo laukus, negali turėti didesnio brandos lygio nei 4.

Inventorizacijos lentelėse, kiekvieno lauko brandos lygį galima žymėti individualiai. Net jei modelis neturi identifikatoriaus, tačiau tam tikras laukas nėra ref tipo ir to lauko duomenys tvarkingi ir atitinka lauko duomenų tipą, lauko pavadinimai naudoja manifesto žodyno pavadinimus, tada tam laukui galima suteikti 5 brandos lygį. Tačiau reikia atkreipti dėmesį, kad bendro brandos lygio skaičiavimuose, šio lauko brandos lygis gali būti sumažintas, jei modelis neatitinka tam tikrų kriterijų, pavyzdžiui jei modelis neturi unikalaus identifikatoriaus.

Ryšiai tarp lentelių

Labai svarbu atveriant duomenis nepamesti ryšių tarp lentelių. Turint veikiančius ryšius tarp lentelių atsiranda galimybė duomenis jungti tarpusavyje, o tai yra labai svarbu.

Tarkime, duomenų šaltinyje yra tokios dvi lentelės:

COUNTRIES

id

code

country

1

lt

Lietuva

2

lv

Latvija

3

ee

Estija

CITIES

id

country

city

1

1

Vilnius

2

1

Kaunas

3

1

Klaipėda

Iš šių lentelių gauname tokią inventorizacijos lentelę:

id

d

r

b

m

property

type

ref

source

level

datasets/gov/dc/countries

sql

Countries

id

COUNTRIES

id

integer

id

4

code

string

code

4

country

string

country

4

Cities

id

CITIES

id

integer

id

4

country

ref

countries

country

4

city

string

city

4

Kaip matome ryšys tarp lentelių buvo aptiktas automatiškai, kadangi tokia informacija yra pateikta duomenų bazės schemoje. Tačiau gali pasitaikyti atvejai, kad ryšiai tarp lentelių nėra aprašyti duomenų bazės schemoje, tokiais atvejais, ryšius reikia aprašyti rankiniu būdu.

Norint nurodyti ryšį su kita lentele, reikia lauko type stulpelyje nurodyti ref, o ref stulpelyje nurodyti kitos lentelės pavadinimą iš model stulpelio.

Ryšiai tarp lentelių gali būti nurodomi tik vieno duomenų rinkinio resurso ribose.

Laukai naudojami ryšiams tarp lentelių automatiškai nustatomi pagal rodomo modelio ref reikšmes. Pavyzdžiui šiuo atveju modelio countries eilutės ref reikšmė yra id, todėl modelio cities savybė country automatiškai siejama su id lauku. Tačiau galima laukus, nurodyti ir rankiniu būdu taip: countries[id].

Atveriant duomenis, vidinės duomenų bazės identifikatoriai nėra perkeliami. Visi identifikatoriai generuojami naujai, kad neatskleisti vidinės duomenų bazės detalių.

Jei šaltinio lentelės yra susietos naudojant daugiau nei vieną lauką, source stulpelyje galima nurodyti kelis laukus, atskiriant juos kableliu. Arba property eilutės ref stulpelyje galima nurodyti kelis laukus taip countries[id,code].

Sudėtiniai identifikatoriai

Dažnai pasitaiko, kad informacinių objektų negalima identifikuoti kurios nors vienos savybės pagalba. Tokiais atvejais, tenka pasitelkti sudėtinius identifikatorius, kur vienas informacinis objektas identifikuojamas kelių savybių pagalba.

Kaip pavyzdį galime panagrinėti šį duomenų šaltinį

CITIES

COUNTRY

CITY

Lietuva

Vilnius

Lietuva

Kaunas

Latvija

Ryga

STREETS

ID

COUNTRY

CITY

STREET

1

Lietuva

Vilnius

Gedimino pr.

2

Lietuva

Vilnius

Vilniaus g.

3

Lietuva

Vilnius

Konstitucijos pr.

Čia matome, kad STREETS lentelė siejasi su CITIES lentele, tačiau sąsajai tarp lentelių neužtenka vieno lauko. Norinti unikaliai identifikuoti CITIES objektą būtina naudoti dvi country ir city savybes.

Tokią duomenų struktūrą galima aprašyti taip:

id

d

r

b

m

property

type

ref

source

prepare

level

access

1

datasets/gov/dc/countries

2

db

sql

3

City

id

CITIES

4

id

array

country, name

4

private

5

country

string

COUNTRY

3

open

6

name

string

CITY

3

open

7

Street

id

STREET

8

id

integer

ID

4

private

9

country

string

COUNTRY

3

open

10

city_name

string

CITY

3

private

11

city

ref

city

country, city_name

4

open

12

name

string

STREET

3

open

Tam, kad city lentelei aprašyti kompozicinį raktą, 4-oje eilutėje buvo įtraukta nauja savybė id, kuri tiesioginio analogo pirminiame duomenų šaltinyje neturi, todėl šios savybės property.source yra tuščias, tačiau šios savybės reikšmė gaunama property.prepare pagalba, kur nurodyta, kad reikšmė gaunama apjungiant country ir name savybes.

Analogiška situacija ir su street modeliu.

street.city_name property.access pažymėtas private, kadangi miesto pavadinimas yra perteklinė informacija. Miesto pavadinimą galima gauti apjungiant city ir street modelius.

Globalūs identifikatoriai

Dažniausiai nėra didelių problemų su lokaliais, vieno duomenų rinkinio ribose naudojamais identifikatoriais. Objektus galima jungti tarpusavyje, tačiau tik vieno duomenų rinkinio ribose.

Atsiveria žymiai didesnės galimybės, jei objektus galima jungti ir už vieno rinkinio ribų, su visais kitais, visuose kituose rinkiniuose esančiais objektais.

Kad tai veiktų, naudojami globalūs objektų identifikatoriai. Iliustruosiu, kaip visa tai veikia pavyzdžiu. Tarkime turime tokią lentelę viename duomenų rinkinyje:

COUNTRIES

id

code

country

1

ltu

Lithuania

2

lva

Latvia

3

est

Estonia

Ir kitą lentelę, kitame duomenų rinkinyje:

SALYS

id

kodas

salis

9

lt

Lietuva

8

lv

Latvija

7

ee

Estija

Abu duomenų rinkiniais valdomi skirtingose įstaigose, nors abu rinkiniai apie tą patį šalies objektą, tačiau vidiniai identifikatoriai skirtingi, žodynas taip pat skirtingas ir net patys duomenys yra skirtingi. Iš esmės nėra galimybės šių duomenų sujungti tarpusavyje.

Tačiau mums pasisekė, nes yra dar trečias duomenų šaltinis su šalių kodais:

CODES

A2

A3

lt

ltu

lv

lva

ee

est

Pasitelkus šį trečiąjį duomenų šaltinį sujungti visas lenteles pasidaro įmanoma.

Galutinė, pilnai sutvarkyta visų trijų duomenų rinkinių inventorizacijos lentelė atrodytų taip:

id

d

r

b

m

property

source

type

ref

level

datasets/gov/dp1/countries

sql

/place/Country

a3code

Countries

COUNTRIES

id

id

id

integer

3

a3code

code

string

2

name.en

country

text

2

datasets/gov/dp2/countries

sql

/place/Country

a2code

Salys

SALYS

id

id

id

integer

5

a2code

kodas

string

5

name.lt

salis

text

5

datasets/gov/dp3/countries

sql

/place/Country

a3code

Codes

CODES

a3code

a2code

A2

string

5

a3code

A3

string

5

Žodyno lentelė turėtų atrodyti taip:

id

m

property

type

place/Country

a2code

string

a3code

string

name

text

Duomenų atvėrimo metu, visi inventorizuoti duomenų rinkiniai bus siejami su žodyno modeliais pasitelkiant identifikatorių nurodytą base.ref stulpelyje. Jei duomenų rinkinio modelis neturi tokio lauko, tada susiejimas nebus daromas ir viso modelio brandos lygis nukris iki 4 brandos lygio.

Duomenų atvėrimo metu atskirų duomenų rinkinių duomenys bus saugomi atskirai, kadangi jie gali turėti laukų ne iš žodyno. Iš visų duomenų rinkinių bus kuriami ir globalūs, nuo konkretaus duomenų rinkinio nepriklausomi žodynų objektai.

Konkrečiai šiuo atveju place/country žodyno lentelė atvėrus duomenis atrodys taip:

place/country

id

a2code

a3code

name.en

name.lt

1

lt

ltu

Lithuania

Lietuva

2

lv

lva

Latvia

Latvija

3

ee

est

Estonia

Estija

Kaip matote, iš pirmo žvilgsnio atrodė, kad dviejų duomenų rinkinių neįmanoma sujungti tarpusavyje, tačiau prijungus dar daugiau duomenų rinkinių, kaip kokia dėlionė iš mažų detalių susidėliojo pilna ir išsami modelio place/country lentelė.