Ryšiai tarp modelių

Pateikiant metaduomenis apie ryšius tarp modelių, duomenų brandos lygis pakeliamas iki ketvirto lygio.

Ryšiai tarp modelių aprašomi tais atvejais, kai vienoje duomenų lentelėje naudojami identifikatoriai iš kitos lentelės.

Jungimas per pirminį raktą

Pavyzdžiui, jei turime tokias dvi duomenų lenteles:

Country

id

name

code

1

Lietuva

lt

2

Latvija

lv

City

id

name

country

1

Vilnius

lt

2

Kaunas

lt

3

Ryga

lv

Šiuo atveju, jei norime parengti aukčiau pateiktų duomenų struktūros aprašą, jis atrodytų taip:

d

d

r

b

m

property

type

ref

level

1

datasets/gov/example/countries

2

Country

code

3

id

integer

4

4

name

string

4

5

code

string

4

6

City

id

7

id

integer

4

8

name

string

4

9

country

ref

Country

4

Šiame duomenų struktūros apraše, 9-oje eilutėje country stulpelio tipas yra ref, tai reiškia, kad šis stulpelis yra kito modelio išorinis raktas. property.ref stulpelyje nurodyta kurio modelio išorinis raktas šis stulpelis yra. Šiuo atveju, tai yra Country modelis, kuris apibrėžtas 2-oje eilutėje.

Pagal nutylėjimą, ryšys su kitu modeliu nustatomas naudojant kitos lentelės pirminį raktą nurodytą model.ref stulpelyje. Šiuo atveju, City .country yra jungiamas per Country.code. Tai reiškia, kad City.country duomenų tipas turi sutapti su Country.code duomenų tipu, kuris yra string.

property.ref reikšmė gali būti pateikiama vienu iš šių variantų:

property.ref
model

model nurodo kito model pavadinimą kurio model.ref siejamas su property.

Jei model.ref pirminiam raktui naudoja daugiau nei vieną lauką, tada property.source laukas turi būti tuščias, o property.prepare turi būti pateikiamos kableliu atskirtos property reikšmės, kurios bus naudojamos susiejimui.

model[property]

Tais atvejais, kai property duomenys nesutampa su siejamo model.ref, galima nurodyti propertymodel.

model[*property]

Jei susiejimui reikia daugiau nei vieno duomenų lauko ir jie nesutampa su model.ref, tada galima nurodyti kelias property reikšmes atskirtas kableliu. Tačiau šiuo atveju taip pat būtina nurodyti ir property.prepare kelias reikšmes atskirtas kableliu, o property.source reikšmė turi būti tuščia. property.prepare stulpelyje nurodomi kiti modelio property pavadinimai iš kurių duomenų reikšmių turi būti formuojamas sudėtinis raktas.

Jungimas per nepirminį raktą

Jei modelius reikia jungti ne per pirminį raktą, o per kitus laukus, tada naudojama model[property] forma.

Pavyzdžiui, jei turime tokius duomenis:

Country

id

name

code

1

Lietuva

lt

2

Latvija

lv

City

id

name

country

1

Vilnius

lt

2

Kaunas

lt

3

Ryga

lv

Kur Country pirminis raktas yra id ir norime jungti City.country per Country.code, tuomet duomenų struktūros aprašas atrodys taip:

d

d

r

b

m

property

type

ref

level

1

datasets/gov/example/countries

2

Country

id

3

id

integer

4

4

name

string

4

5

code

string

4

6

City

id

7

id

integer

4

8

name

string

4

9

country

ref

Country[code]

4

9-oje eilutėje property.ref stulpelyje pateikta Country[code] reikšmė, kuri Country nurodo su kokiu modeliu jungiame, o code nurodo su kokiu Country stulpeliu jungiame. Jei pateiktas tik modelis, tada jungiama per to modelio pirminį raktą, jei pateiktas stulpelis laužtiniuose skliausteliuose, tada jungiama per nurodytą stulpelį.

Jungimas per kompozicinį raktą

Jei modelius reikia jungti per kelis laukus, tada naudojama model[*property] forma, kur laužtiniuose skliaustuose pateikiami keli stulpeliai atskirti kableliais.

Pavyzdžiui, jei turime tokius duomenis:

Country

id

name

code

1

Lietuva

lt

2

Latvija

lv

City

id

name

country

country_id

1

Vilnius

lt

1

2

Kaunas

lt

1

3

Ryga

lv

2

Kur City su Country yra jungiamas per du country ir country_id stulpelius, tuomet reikia įtraukti išvestinį duomenų lauką, kuriame formulės įrašomos į property.prepare pagalba apjungiami keli laukai į vieną kompozicinį raktą. Šiuo atveju duomenų struktūros aprašas atrodys taip:

d

d

r

b

m

property

type

ref

prepare

level

1

datasets/gov/example/countries

2

Country

id

3

id

integer

4

4

name

string

4

5

code

string

4

6

City

id

7

id

integer

4

8

name

string

4

9

country_code

string

4

10

country_id

integer

4

11

country

ref

Country[id,code]

country_id, country_code

4

Čia matome, kad 11-oje eilutėje buvo įtrauktas išvestinis laukas country, kuris išskaičiuojamas apjungiant country_id ir country_code. O ryšiui su Country, laužtiniuose skliausteliuose nurodyti du laukai iš jungiamo Country modelio. Abiejų jungiamų pusių pateiktas laukų sąrašas turi būti vienodo eiliškumo, o jungiami laukai turi turėti vienodus tipus.

Jei Country pirminis raktas būtų kompozicinis, pavyzdžiui id, code, tuomet, 11-oje eilutėje property.ref užtektu nurodyti tik Country.

Jungimas atgaliniu ryšiu

Pastaba

Tokio tipo jungimas kol kas dar nėra įgyvendintas.

Jungiant modelius atgaliniu ryšiu kuriamas išvestinis arba virtualus laukas, kuriame analogiškai kaip ir paprasto ryšio atveju, apjungiami du modeliai, tik šiuo atveju kuriamas daug su vienas tipo ryšys.

Pavyzdžiui, jei turime tokius duomenis:

Country

id

name

1

Lietuva

2

Latvija

City

id

name

country

1

Vilnius

1

2

Kaunas

1

3

Ryga

2

Tai norint sukurti atgalinį ryšį iš City modelio į Country modelį, duomenų struktūros aprašas atrodys taip:

d

d

r

b

m

property

type

ref

level

1

datasets/gov/example/countries

2

Country

id

3

id

integer

4

4

name

string

4

5

cities

backref

City

4

6

City

id

7

id

integer

4

8

name

string

4

9

country

ref

Country

4

Čia atgalinis ryšys nurodytas 5-oje eilutėje, pateikiant virtualų Country.cities lauką, kuris jungiamas per City.country lauką, kadangi City.country turi ryšį su Country.

Jei City modelyje būtų pateikti keli stulpeliai susieti su Country, tada 5-oje eilutėje property.ref reikšmė turėtų nurodyti konkretų lauką, per kurį jungiama, pavyzdžiui City[country].

Polimorfinis jungimas

Pastaba

Tokio tipo jungimas kol kas dar nėra įgyvendintas.

Polimorfinis jungimas yra toks ryšys tarp modelių, kai vieno modelio laukas yra siejamas su daugiau nei vienu kitu modeliu. Tokiam ryšiui nurodyti polimorfinis laukas turi dvi reikšmes, išorinio modelio pavadinimą ir to modelio stulpelio per kurį jungiama reikšmę.

Country

id

name

1

Lietuva

2

Latvija

City

id

name

country

1

Vilnius

1

2

Ryga

2

Event

id

name

object_id

object_model

1

Gimtadienis

1

datasets/gov/example/countries/Country

2

Gimtadienis

2

datasets/gov/example/countries/Country

3

Gimtadienis

1

datasets/gov/example/countries/City

4

Gimtadienis

2

datasets/gov/example/countries/City

Pavyzdyje aukščiau matome, kad yra du modeliai Country ir City, kuriuos jungia Event modelis per object_id ir object_model laukus. Pavyzdžiui Event kurio id yra 1, siejamas su Country modeliu, kurio id yra 1.

Tokių duomenų struktūros aprašas atrodys taip:

d

d

r

b

m

property

type

ref

prepare

level

1

datasets/gov/example/countries

2

Country

id

3

id

integer

4

4

name

string

4

5

cities

backref

City

4

6

City

id

7

id

integer

4

8

name

string

4

9

country

ref

Country

4

10

Event

id

11

id

integer

4

12

name

string

4

13

object_id

integer

4

14

object_model

string

4

15

object

generic

Country

object_model, object_id

4

16

City

15-oje eilutėje įtrauktas virtualus Event.object laukas, kuris 15-oje ir 16-oje eilutėse, property.ref stulpelyje išvardina du modelius Country ir City`, su kuriais jungiamas šis laukas, per object_model ir object_id laukus, kurie aprašyti atskirai.

object_id ir object_model aprašomi atskirai tik todėl, kad duomenys ateina iš išorinio šaltinio. Jie duomenys rašomi tiesiogiai į Saugyklą, tada atskirai generic laukų apsirašyti nereikia.

Denormalizuoti duomenys

Denormalizuoti duomenų laukai yra tokie laukai, kurie pateikti viename modelyje, tačiau pagal semantinę prasmę priklauso skirtingiems modeliams.

Dažniausiai duomenų normalizavimas atveriant duomenis yra nepageidaujamas ir duomenų struktūra turėtu būti transformuojama į skirtingus modelius, pagal semantinę prasmę. Plačiau apie duomenų normalizavimą galite skaityti skyriuje Normalizavimas.

Tačiau tais atvejais, kai vis dėlto norima pateikti duomenis denormalizuotoje formoje, duomenų struktūros apraše galima nurodyti, kurie duomenų laukai yra denormalizuoti.

Denormalizuotų laukų brandos lygis negali būti didesnis nei 4.

Pavyzdys, kaip atrodo denormalizuotų duomenų laukų žymėjimas:

d

r

b

m

property

type

ref

level

example

Country

code

string

4

name@en

text

4

City

name@en

text

4

country

ref

Country

4

country.code

3

country.name@en

3

country.name@lt

text

3

Šiame pavyzdyje turime tokius laukus:

country

Šis laukas yra ref tipo, tai reiškia, kad šiame lauke saugomas Country modelio identifikatorius, kurio pagalba City galima susieti su Country.

ref tipo duomenys yra sudėtiniai, tai reiškia, kad per ref tipo lauką galima pasiekti siejamo modelio laukus, nurodant kito modelio laukus po taško.

Todėl pagal nutylėjimą country ref Country yra tas pats, kas country._id ref Country, tik ._id dalis nenurodoma.

country.code ir country.name@en

Šie laukai yra denormalizuoti, tai reiškia, kad jie priklauso Country modeliui, tačiau duomenys yra dubliuojami ir pateikiami dviejose vietose, prie Country ir prie City.country.

Kadangi City.country yra ref tipo, tai po taško, galima nurodyti kitus šiam siejamam modeliui priklausančius laukus iš kito modelio.

Atkreipkite dėmesį, kad denormalizuotiems laukams nepildomas type stulpelis, kadangi šių laukų tipas turi sutapti su siejamo modelio laukų tipais, taip pat turi sutapti ir laukų pavadinimai.

country.name@lt

Tais atvejais, kai siejamame modelyje (šiuo atvjeu Country modelyje) nėra tam tikrų laukų, tuoment galima juose pateikti ir prie City.country, tačiau tokiu atveju, būtina nurodyti type.

Brandos lygis

Apibrėžiant ryšius tarp modelių, brandos lygis įrašomas level stulpelyje atlieka svarbų vaidmenį.

Neįmanomas susiejimas

Jei ref tipui nurodytas 2 arba žemesnis brandos lygis, tai reiškia, duomenų jungimas nėra įmanomas. Tokiu atveju, atveriant duomenis, property įgaus tokį tipą, koks yra lauko su kuriuo siejamas ryšys tipas.

Pavyzdžiui:

d

r

b

m

property

type

ref

level

example

Country

name

name

text

4

City

name

name

text

4

country

ref

Country

2

Šiuo atveju, City.country yra siejamas su Country.name. Kadangi City.country brandos lygis yra 2, tai rei6kia, kad City.country ir Country.name pavadinimai nesutampa ir jungimo atlikti neįmanoma. Tokiu atveju, City.country tipas bus ne ref, o toks pat, kaip Country.name, t.y. text.

Tačiau, metaduomenyse išliks informacija, apie tai, kad šios lentelės yra susijusios, tačiau dėl prasto duomenų brandos lygios, susiejimas nėra įmanomas.

Jei modeliai yra susiję, tačiau, tokio duomenų lauko, per kurį galima būtų atlikti susiejimą iš vis nėra, tuomet, tokį lauką galima sukurti, nurodant brandos lygį 0. Pavyzdžiui:

d

r

b

m

property

type

ref

level

example

Country

name@lt

name@lt

text

4

name@en

text

0

City

name

name

text

4

country

ref

Country[name@en]

2

Šioje vietoje City.country tampa country@en, kurio tipas yra text. O į Country yra įtrauktas papildomas laukas name@en, per kurį ir atliekamas susiejimas, t.y. per kurį galėtu būti atliktas susiejimas, jei toks laukas egzistuotų.

Nepatikimas susiejimas

Jei ref tipui suteiktas 3 brandos lygis, tai reiškia, kad susiejimas atliekamas, tačiau susiejimas yra nepatikimas ir duomenys gali būti susieti klaidingai.

Susiejimas laikomas nepatikimu, tada, kai siejimas atliekamas ne patikimo unikalaus identifikatoriaus pagalba, o per pavadinimą ar panašiais būdais.

Pavadinimai gali keistis, gali dubliuotis, gal skirtis jų užrašymo forma, todėl toks jungimas laikomas nepatikimu.

Patikimas susiejimas

Jei ref tipui suteiktas 4 ar didesnis brandos lygis, vadinasi susiejimas yra patikimas. Duomemnys siejami naudojant patikimus unikalius identifikatorius, kurie nesidubliuoja ir rašomi visada vienodai.

Dažniausiai patikimais identifikatoriais laikomi sveiki skaičiai, tam tikri sutartiniai kodai ir kiti specializuoti identifikatoriai, tokie kaip UUID.