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ė.