FM1: andmete päringu universaalne teenus

Mustri tüüp: funktsionaalne muster
Peamine kasusaaja: inimene, automatiseeritud süsteem
Eesmärk
: andmete pärimine
Allikas
: teadaolev praktika
Teenuste arv
: 1

Abstract

FM1: Universal data pull service is used when a service producer needs to allow multiple consumers to query its data and each consumer needs a differentiated dataset. This pattern is an extension of the primitive "PM1: Data pull service".

The pattern proposes defining an additional array of data field names in the service input. Then the service consumers can use this array to determine which data fields will be returned in the service response.

In the context of this pattern:

  • The service producer is the information system that has the needed data;
  • The service consumer is the information system that needs the data.

Sissejuhatus

Muster kirjeldab üle X-tee andmete pärimise ühte erijuhtu. Tegemist on primitiivi "PM1: andmete päringu teenus" täiendusega, mis võimaldab sama teenusega lahendada mitme andmeid vajava infosüsteemi erinevaid vajadusi.

Võrreldes primitiiviga "PM1: andmete päringu teenus" on põhilised täiendused:

  • täiendava pääsuõiguste kihi loomine;
  • teenuse sisendis saab valida millised andmeväljad tagastatakse teenuse vastusena.

Andmete pärimise eesmärgil luuakse üks X-tee teenus, mille korral eristame kahte poolt:

  • andmeid omav infosüsteem:
    • teenuse osutaja;
    • infosüsteem, kus toimub andmete kogumine ja muutmine;
  • andmeid vajav infosüsteem:
    • teenuse tarbija;
    • infosüsteem, mis kasutab andmeid omava infosüsteemi andmeid oma äriprotsessis.

Loodava teenuse sisendiks on päringu parameetrid ja päritavate andmeväljade nimekiri. Teenuse väljundiks on päringu tulemused.

Probleem

Käesolev muster sobib kasutamiseks olukorras, kus on vajalik lahendada andmete vahetus sissejuhatuses nimetatud poolte vahel ning:

  • andmeid vajavaid infosüsteeme on mitu;
  • iga andmeid vajav infosüsteem soovib pärida erinevaid andmevälju;
  • andmeid vajava infosüsteemi käideldavus on tagatud ainult andmete pärimise hetkel;
  • andmeid omava infosüsteemi käideldavus on tagatud alati, kui keegi soovib andmeid pärida;
  • andmeid vajaval infosüsteemil peab olema kontroll selle üle, millal andmevahetus toimub;
  • päritud andmete ajakohasena hoidmise eest vastutab andmeid vajav infosüsteem.

Lahendus

Andmeid omavas infosüsteemis:

  • kirjeldatakse X-tee teenus, mis võimaldab andmeid vajaval infosüsteemil andmete pärimist;
    • teenuse sisendiks on päringu parameetrid ja andmeväljade nimekiri;
    • teenuse väljundiks on päringu tulemused;
  • arendatakse teenuse sisendi valideerimine;
  • arendatakse täiendav pääsuõiguste kiht, mis kontrollib andmeväljade pärimise õiguseid;
  • arendatakse teenuse sisendi põhjal vajalike andmete leidmine vastavalt andmeväljade nimekirjale;
  • arendatakse teenuse väljundi koostamine;
  • määratakse infosüsteemid, mis võivad teenust kasutada;
  • iga infosüsteemi kohta määratakse andmeväljad, mida antud infosüsteem võib pärida.

Andmeid vajavas infosüsteemis:

  • arendatakse teenuse sisendiks olevate parameetrite määramine;
  • arendatakse päritavate andmeväljade määramine;
  • arendatakse teenuse sisendi koostamine;
  • arendatakse andmeid omava infosüsteemi poolt osutatava X-tee teenuse tarbimine;
  • arendatakse teenuse väljundi töötlemine ja salvestamine.

Teenuste kirjeldus

Sisend koosneb kahest osast. Tavaliselt on esimene osa päritava objekti mingi unikaalne tunnus. Teine osa on päritavate andmeväljade nimekiri.

Teenuse väljundi struktuur sisaldab kõiki andmevälju, mida teenuse kaudu saab pärida. Kõik andmeväljad, mida teenus ei tagasta kõigile teenuse tarbijatele alati, on määratud valikuliseks.

Päritavate andmeväljade nimekirja koostamiseks on mitu erinevat võimalust:

  • omaduste (ehk objekti atribuutide nimede) nimekirja kasutamine;
  • andmestiku loogilisteks plokkideks jagamine ja nende plokkide numeratsiooni kasutamine.

Järgnevalt on toodud andmete pärimise universaalse teenuse WSDL näide.

<wsdl:definitions .... >
<wsdl:types>
<schema ....>
<complexType name="RequestType">
<sequence>
<!-- The usual query parameters -->
<element name=”objectID” type=”String”/>
</sequence>
<sequence>
<!-- List of data fields to be queried -->
<element name=”selectedField” type=”String”/>
</sequence>
</complexType>

<complexType name="ResponseType">
<!-- The response is the array of selected fields -->
<complexContent>
<restriction base=”SOAP-ENC:Array”>
<sequence>
<element name=”objectId” type=”String”/>
<element name=”selectedField”>
<complexType>
<sequence>
<element name=”availableField1”/>
<element name=”availableField2”/>
<element name=”availableField3”/>
....
</sequence>
</complexType>
</element>
</sequence>
</restriction>
</complexContent>
</complexType>
....
</schema>
</wsdl:types>

<wsdl:message name="RequestMessage">
<wsdl:part name="keha" type="RequestType"/>
</wsdl:message>

<wsdl:message name="ResponseMessage">
<wsdl:part name="keha" type="ResponseType"/>
</wsdl:message>
....

<wsdl:portType .... >
<wsdl:operation name="Universal pull service">
<wsdl:input message="RequestMessage"/>
<wsdl:output message="ResponseMessage"/>
</wsdl:operation>
....
</wsdl:portType >
</wsdl:definitions>

Mustri käitumine

Järgneval joonisel esitatakse andmeid vajava infosüsteemi (teenuse tarbija) ja andmeid omava infosüsteemi (teenuse osutaja) vaheline suhtlus.


Joonis 4.1 Mustri FM1 järgnevusdiagramm.

Infosüsteemi spetsiifilise äriloogika esitamiseks on viidatud järgnevusdiagrammile "Infosüsteemi äriprotsess", mille sisu ei ole toodud kuna see sõltub konkreetse infosüsteemi äriprotsessist.

Andmeid vajava infosüsteemi poolel on eristatud äriloogika ja teenusloogika kihid.

  • Äriloogika kiht:
    • täidab infosüsteemi spetsiifilist äriprotsessi;
    • määrab, milliseid andmeid soovitakse pärida;
    • määrab teenuse väljundis soovitud andmeväljad;
    • edastab päritavatele andmetele vastavad parameetrid teenusloogika kihile.
  • Teenusloogika kiht:
    • koostab teenuse sisendi vastavalt äriloogika kihist saadud paameetritele;
    • tarbib andmeid omava infosüsteemi poolt osutatavat teenust;
    • võtab vastu tarbitud teenuse vastuse;
    • tõlgendab vastuses sisalduvad andmed äriloogika kihile sobivaks;
    • teavitab äriloogika kihti teenuse kasutuse tulemustest.

Andmeid omava infosüsteemi juures toimuvad tegevused on lahendatud teenusloogika kihis. Teenusloogika kihis toimuvad järgmised tegevused:

  • võetakse vastu teenuse sisend;
  • valideeritakse teenuse sisendis olevad päringuparameetrid;
  • kontrollitakse, kas teenuse tarbijal on õigus soovitud andmevälju pärida;
  • leitakse päritavad andmed vastavalt päringu parameetritele ja soovitud andmeväljadele;
  • koostatakse päritavaid andmeid sisaldav teenuse vastus.

Lisakaalutlused

Andmete päringu universaalse teenuse loomisel, osutamisel ja tarbimisel tuleks silmas pidada järgnevat:

  • andmeväljade nimetuste kasutamise asemel võib andmestiku jagada loogilisteks blokkideks ning kasutada soovitud väljade määramiseks nende blokkide numeratsiooni;
  • täiendava pääsuõiguste kihi loomine ei ole vajalik, kui teenuse kaudu pakutakse sisuliselt avaandmeid;
  • sama ülesande lahendamiseks on võimalik luua iga andmeid vajava infosüsteemi jaoks ülesandespetsiifiline teenus, aga see tähendaks hoolduskulude kasvu;
  • sama ülesande lahendamiseks on võimalik luua üks teenus, mis tagastaks iga andmeid vajava infosüsteemi poolt soovitud andmete ühisosa, aga see tekitaks probleeme seoses andmete liiasusega;
  • teenuse sisendi ja väljundi struktuur peaks keskenduma andmetele, mitte andmete kogumise või edasise kasutamise äriloogikale;
  • andmeid vajav süsteem peab teadma, millal andmed tekivad.

Näide

Näitena on toodud Rahvastikuregistri teenus rr.RR404_isik.v1.Tegemist on teenusega, mida kasutavad paljud osapooled erinevatel eesmärkidel.

Teenuse sisendiks on isikukoodide ja soovitud andmeväljade nimekiri. Teenuse väljundi struktuur on väga mahukas ja esitatud ainult osaliselt.

Teenuse sisend:

RR404RequestMessage
|-> keha (type: RR404Request)
|-> cValjad (type: String, description: “Andmeväljad”)
|-> cIsikukoodid (type: String, description: “Isikukoodid”)

Teenuse väljund:

RR404_isik_v1_vastusMessage
|-> keha (type: RR404_isik_v1_vastus)
|-> ttIsikud404 (type: SOAP-ENC:Array, minOccurs = 0, maxOccurs = “unbounded”)
|-> ttIsikud404.cIsikukood (type: String, description: “Isikukood”)
|-> ttIsikud404.cPerenimi (type: String, description: “Perenimi”)
|-> ttIsikud404.cEesnimi (type: String, description: “Eesnimi”)
|-> ttIsikud404.cMPerenimed (type: String, description: “Muud perenimed”)
|-> ttIsikud404.cMEesnimed (type: String, description: “Muud eesnimed”)
|-> ttIsikud404.cRiikKood(type: String, description: “Selle riigi kood, mille kodanik isik on”)
|-> ttIsikud404.cRiik (type: String, description: “Selle riigi nimetus, mille kodanik isik on”)
|-> ttIsikud404.cIsanimi (type: String, description: “Isanimi”)
|-> ttIsikud404.cSugu (type: String, description: “Sugu”)
|-> ttIsikud404.cSynniaeg (type: String, description: “Sünniaeg”)
|-> ttIsikud404.cSurmKpv (type: String, description: “Surma kuupäev”)
|-> ttIsikud404.cTeoVoime (type: String, description: “Teovõime”)
|-> ttIsikud404.cIsStaatus(type: String, description: “Isiku staatus”)
|-> ttIsikud404.cKirjeStaatus (type: String, description: “Kirje staatus”)
|-> ttIsikud404.cEKRiik (type: String, description: “Elukoha (aadressi) riik”)
|-> ttIsikud404.cEKMaak (type: String, description: “Elukoha (aadressi) maakond”)
|-> ttIsikud404.cEKVald (type: String, description: “Elukoha (aadressi) vald”)
|-> ttIsikud404.cEKAsula (type: String, description: “Elukoha (aadressi) asula”)
|-> ttIsikud404.cEKVkoht (type: String, description: “Elukoha (aadressi) väikekoht”)
|-> ttIsikud404.cEKTanav (type: String, description: “Elukoha (aadressi) tänava nimi”)
|-> ttIsikud404.cEKNimi (type: String, description: “Elukoha (aadressi) nime nimi”)
|-> ttIsikud404.cEKMaja (type: String, description: “Elukoha (aadressi) maja number”)
|-> ttIsikud404.cEKKorter (type: String, description: “Elukoha (aadressi) korteri number”)
|-> ttIsikud404.cEKIndeks (type: String, description: “Elukoha (aadressi) postiindeks”)
|-> ....



Last modified: Monday, 24 October 2016, 1:24 PM