Denne side beskriver Datafordelerens moderniserede Dataleverancespecifikation (DLS).


Sideinformation


Den moderniserede DLS

Den Moderniserede DLS vil bestå af registrets datamodel og en håndfuld maskinlæsbare bilag. På baggrund af disse vil den Moderniserede Datafordeler automatisk generere tjenester til datadistribution, herunder fildownloads, hændelser, GraphQL-tjenester og geodata-vektor-tjenester (WFS). 






Proces for ændring af DLS


Efter identifikation af ændringsbehov opdateres de relevante bilag, f.eks. for datamodel, distribution eller sikkerhed, som derefter afleveres i Datafordelerens DLS GitHub repository til validering af Datafordelerens Change team.

Når ændringerne er godkendt, implementeres de på testmiljøer og idriftsættes efterfølgende - begge dele efter aftale mellem register og Datafordelermyndighed.  

I processen står Modelsekretariatet som ansvarlig for Datamodellen. Modelsekretariatet har kun ansvaret for at datamodellen er korrekt. Det er registerets eget ansvar at indsende den nye godkendte datamodel til GitHub.

Følgende distributionstjenester fra registerets datamodel er autogenereret:

  • Fildownload
  • GraphQL-tjenester
  • Hændelser
  • Geodata-tjenester





Git og GitHub


Git er et versionsstyringssystem, til håndtering af filversioner. Et Git repository er en database, der indeholder alle filer, og tilhørende filhistorik, for et givent projekt.

Brugere kan arbejde på lokale kopier af repository og synkronisere ændringer med et centralt repository, hvilket muliggør effektivt samarbejde på de versionsstyrede filer.

GitHub er en webbaseret hostingplatform, der bygger på Git-versionskontrolsystemet, hvor udviklere kan gemme, dele, samarbejde om og administrere koderepositories.

For vejledning i brug af Git og GitHub, samt god praksis, henvises til Git – What is Git? og GitHub.






Proces for aflevering i GitHub


DLS afleveres i Datafordeler Repository, hvor DLS’en versionsstyres og interessenter kan samarbejde om ændringer. Datafordeler Repository er ikke offentligt tilgængelig, hvorfor GitHub-brugere, der ikke er tildelt adgang, vil blive vist en 404 fejlside, når linket tilgås.

For at tilgå Datafordeler Repository kræves en GitHub-bruger. Når GitHub-brugeren er oprettet, kan rettigheder til at se repository opnås ved at kontakte Datafordeleroperatøren.



Branchingstrategi


Datafordeler Repository benytter en branchingstrategi, som skal sikre en stabil Main branch (produktionsversion), der kun opdateres via pull requests fra replikeringskanalernes branches.

Replikeringskanalernes branches navngives efter formatet main/rcXXXXX, hvor X angiver replikeringskanalens numeriske id.

For hver ny DLS oprettes en separat branch fra replikeringskanalens branch, navngivet efter DLS-versionen (f.eks. main/rc00018/version2.4.5). 

Dette minimerer risikoen for utilsigtede ændringer i replikeringskanalens branch. 


En replikeringskanal arbejder altså primært med to branches:

  1. main - hvor godkendte DLS'er afleveres til Datafordelermyndigheden.
  2. main/rcXXXXX - replikeringskanalens egen branch med seneste færdige DLS-version.

Ved udvikling af ny DLS oprettes midlertidigt en tredje branch navngivet efter DLS-versionsnummeret (f.eks. main/rc00123/version2.1), hvilket sikrer konsekvent navngivning på tværs af replikeringskanaler.




Fremgangsmåde


Det overordnede flow ser ud således:

  1. Der oprettes ny branch af registret til at lave sine ændringerne
  2. Registret ligger sine ændringerne op i branchen og udfører egen validering af filerne
  3. Registret opretter en pull-request med Datafordeleroperatøren som reviewer
  4. Datafordeleroperatøren reviewer / godkender og merger herefter ind i main-branchen hvis ændringerne godkendes.




DLS-Historik


Historik for registrenes DLS’er tilgås via commit-historikken i Datafordeler Repository.






DLS Validator – Værktøj til validering af DLS


For at automatisere og standardisere DLS-valideringsprocessen stiller Datafordeleren kommandolinjeværktøjet DLS Validator til rådighed for registre og andre aktører, der udarbejder DLS'er. Dette muliggør, at en DLS-ansvarlig selv kan kvalitetssikre og kontrollere, at en given DLS overholder de påkrævede standarder defineret af Datafordeleren (se Indhold af den moderniserede Dataleverancespecifikation), før DLS'en sendes til Datafordeleren. Dermed kan udviklingstiden for nye DLS-versioner reduceres.
DLS Validator er et kommandolinjeværktøj, som validerer indholdet af Dataleverancespecifikationer (DLS'er), så dataintegritet og konsistens sikres, og dermed letter arbejdsgangen med at udvikle nye DLS'er.
Værktøjet validerer en række obligatoriske og valgfri komponenter af DLS'en, bl.a.:

  • DLS-mappestruktur: Sikrer, at alle påkrævede mapper og filer er til stede.
  • Datamodel (XSD- og XMI-filer): Sikrer at filerne er syntaktisk korrekte og fuldt deklarerede, samt at der er overensstemmelse mellem XSD- og XMI-definitioner.
  • Distributions-bilag: Validerer diverse JSON-fil bilag mod angivne skemaer for at sikre korrekt formatering og indhold, samt overensstemmelse med datamodellen.






Adgang til værktøjet


DLS Validator, brugervejledning og tilhørende kildekode er tilgængelige via Datafordeler_DLS_Validering Repository. Bemærk at repository ikke er offentligt tilgængeligt, hvorfor adgang skal indhentes ved Datafordeleroperatøren. For at tilgå repository kræves en GitHub-bruger. Når GitHub-brugeren er oprettet, kan rettigheder til at se repository opnås ved at kontakte Datafordeleroperatøren.






Indhold af den moderniserede Dataleverancespecifikation


DLS'en er overordnet defineret af en hierarkisk mappestruktur, som versionsstyres i et Git repository. Repository indeholder en mappe for hvert register, som indsender og distribuerer data via Datafordeleren. Register-mapperne følger en veldefineret struktur og indeholder en række påkrævede og valgfri bilag, som Datafordeleren skal bruge for at modtage og distribuere data.

De følgende afsnit beskriver mappestrukturen, mappernes indhold og bilagenes skemaer, samt vejleder om deres udfyldelse.

Bilag i Datafordelerens DLS er primært maskinlæsbare JSON-filer, som kan valideres mod et tilhørende JSON-skema. Et JSON-skema kan definere komplekse objekter, påkrævede felter, gyldige værdier, etc. Den formelle definition via JSON-skemaet sikrer ensartet udfyldelse og letter validering af bilag.

Bemærk:

  • Ikke alle bilag er påkrævede.
  • Et JSON-objekt med påkrævede felter er ikke nødvendigvis i sig selv påkrævet. Med andre ord skal objektet være udfyldt korrekt, hvis det er angivet, og ellers ikke.






Overordnet mappestruktur


Datafordelerens repository har nedenstående, overordnede mappestruktur.

<Repository rodmappe>

    • Guides
    • Register
      • <Navn på register>
        • General
          • DLS_metadata.json
        • <Replikeringskanal ID>
          • 1. Bitemporality
          • 2. Datamodel
          • 3. Security
          • 4. Tabular_data
          • 5. Raster_data






Mappe: Guides


Mappen "Guides" indeholder alle vejledninger til, hvordan bilagene i DLS'en udfyldes. Dette inkluderer både en beskrivelse af strukturen for bilagene, samt eksempler på hvordan disse udfyldes.

Der er ingen bilag i denne mappe, der skal afleveres til Datafordelermyndigheden, som del af DLS'en, da filerne heri blot er vejledninger.






Mappe: Register


Denne mappe indeholder en mappe for hvert register, som indsender og distribuerer data via Datafordeleren.






Mappe: Register / General


General-mappen skal indeholde følgende påkrævede, maskinlæsbare bilag:

  • DLS_metadata.json, som bl.a. beskriver den DLS-format version, som registrets DLS og bilag følger.

Bilag

Krav

DLS_metadata.json

Bilaget er påkrævet.Filen skal være navngivet som angivet her.


Derudover kan et register i denne mappe specificere detaljer om registerets data, som ikke hører til i de øvrige mapper. Eksempler på bilag, hvis indhold hører hjemme i denne mappe er:

  • Generelle detaljer, som gælder på tværs af flere replikeringskanaler, hvis dette er tilfældet for et register.
  • Særlige forretningsregler, der har indflydelse på datadistribution samt eventuelle implementeringsdetaljer. Eksempelvis CPR og CVR's implementeringsdetaljer.
  • Der understøttes udelukkende at der ligges maskinlæsbare formater (fx JSON og XML) samt Word-filer. Excel dokumenter understøttes ikke.






Mappe: Register / <Replikeringskanal ID>


Registrets mappe organiserer de bilag, som registret har udfyldt, per replikeringskanal. Et register kan have flere replikeringskanaler og de påkrævede bilag skal være udfyldt for hver kanal.




Bilag: DLS_metadata.json


Bilaget angiver hvilken version af DLS-formatet, den pågældende DLS følger – ikke registrets egen versionering af deres DLS. Ved idriftsættelse af den moderniserede Datafordeler, vil DLS-formatets version være "2.0".

Bilaget er formelt beskrevet af JSON-skemaet: DLS_Metadata_Schema.json.

Objekt

Beskrivelse

version_format

En string, der beskriver det DLS-format versionsnummer, som den pågældende DLS følger og kan valideres imod. F.eks. "2.0", "2.1", "3.0".


Filens brug til versionering er yderligere beskrevet i Versionering af DLS gennem DLS_metadata.json bilag.






Mappe: <Replikeringskanal ID>


Replikeringskanal-mappen indeholder en række undermapper, beskrevet i dette afsnit, som indeholder de maskinlæsbare bilag, der definerer den pågældende replikeringskanals distribution af data via Datafordeleren.

Mappen navngives efter formatet: "rc<numerisk id, prefikset med 0, op til 5 cifre>". F.eks. "rc00001"






Mappe: 1. Bitemporality


Mappen er tiltænkt bilag, der beskriver replikeringskanalens bitemporale model. Eksisterende registres bitemporale model er veldefinerede i Datafordeleren. Et nyt register vil være nødsaget til at indlevere bilag, der specificerer den bitemporale model.






Mappe: 2. Datamodel


I Datamodel-mappen placeres de bilag, der definerer replikeringskanalens logiske- og fysiske datamodel.

Den fysiske datamodel specificeres i en XSD-fil, mens den logiske datamodel specificeres i en XMI-fil.

Navngivningen af filerne skal følge dette mønster:. MAJOR.MINOR.PATCH.[REGISTERNAVN jf. GraphQL schema].xmi

Bilag

Krav

<filnavn>.xsd

Bilaget er påkrævet.

<filnavn>.xmi

Bilaget er påkrævet.




Bilag: Fysisk datamodel (XSD)


Den fysiske datamodel specificeres i en XSD-fil, der beskriver hvordan data ser ud på indlæsnings- og distributionstidspunktet.

XSD-filen indeholder:

  • Entiteter, som også er specificeret i den logiske datamodel (XMI), som enten simple eller komplekse data-typer.
  • Entitets-felter med dokumentation, begrænsninger (minimum- og maksimum værdier, minimum og maksimum forekomster, etc.) og UUID-reference til den logiske datamodel.

Eksempel på UUID angivelse:

<xs:annotation>
	<xs:appinfo>EAID_B4EB6CD9_K545_9c37_A782_84B303BDE25A</xs:appinfo>
</xs:annotation>


Eksempel på angivelse af begrænsninger som en del af <xs:element> linjen:

<xs:element name="navnPåElement" type="xs:string" minOccurs="0" maxOccurs="1">




Bilag: Logisk datamodel (XMI)


Den logiske datamodel specificeres i en XMI-fil, der definerer egenskaber og datatyper for entiteter, samt deres indbyrdes relationer. Alle elementer, attributter og relationer identificeres med UUID.
Filen indeholder følgende:

  1. Entiteter
  2. Relationer (interne og til andre registres entiteter)
  3. Entiteternes felter
    1. Forretningsmæssig betydning af felterne
    2. Attributter
  4. Datatyper på felter
    1. Udfaldsrum for kodelister
    2. Metadata på felter




Bilag: Relations.json


Relations.json er et supplement til datamodellen og bruges til at definere relationerne mellem entiteter internt i registret og eksternt til andre registre. Bilaget er nødvendig for fleksibel opslagslogik, dvs. for at muliggøre joins mellem entiteter og udstille disse relationer.

Bilaget er formelt beskrevet af JSON-skemaet: Relations_Schema.json.

Bilaget består af en liste af relationsversioner (RelationVersions). Hver RelationVersion er defineret af to egenskaber, et versionsnummer (RelationVersionNumber) og en liste af relationer (Relations). Versionering af bilaget er kompleks og er nærmere beskrevet i afsnit Versionering af Relations.




Navn

Type

Beskrivelse

Bemærkninger

SourceEntity

String

Navnet på entiteten i kilderegistret


SourceField

String

Navnet på feltet i kildeentiteten der bruges til koblingen

Er ikke auto-genereret – skal udfyldes.

TargetRc

String

RcId på register der kobles til


TargetRcVersion

String

Datamodelversionen af målregistret


TargetEntity

String

Navnet på entiteten i målregistret


TargetField

String

Navnet på feltet i målentiteten der bruges til koblingen

Er ikke auto-genereret – skal udfyldes.

ToManyRelation

Bool

Specificerer om én kilde kan kobles til flere mål eller bare én


Alias

String

Det navn, som relationen har fået i XMI'en

Hvis et navn ikke er angivet i XMI'en, bruges følgende mønster som en reserve:

{Kildefelt}_{Målregister}_{Målentitet}_{Målfelt}_ref




Retningslinjer for review af Relations.json


Denne vejledning forklarer, hvordan man korrekt ændrer Relations bilaget. Der er tre scenarier, hvor der er behov for at ændre i bilaget. Disse scenarier er skitseret afsnittene neden for.




Første generation af bilag


Processen og ansvar er ligeledes fordelt som for de andre bilag. Men når relations bilaget genereres første gang, sender Datafordelerleverandøren også Valideringsrapport (yderligere forklaret i afsnit Valideringsrapport) med til registret.

Den generator, der genererer bilaget, kan ikke udtrække kilde- og målfelter (”SourceField” og ”TargetField”) for relationerne, da disse ikke er defineret i XMI'erne. Derfor skal registret gennemgå hver enkelt relation i bilaget, når det modtager den autogenererede Relations.json, og angive kilde- og målfelter. Med andre ord, skal registret indtaste de felter, hvorpå JOIN-operationen skal ske for entiteterne (iflg. instruktionerne i afsnittet Fuldførelse af relation). Dette muliggør, at bilaget kan bruges til at generere en fleksibel GraphQL-tjeneste.

Derudover bør registret overveje følgende:

  • Hvis der mangler relationer, som registret ellers forventede, skal disse tilføjes (i instruktionerne i afsnittet Tilføjelse af en relation). Bemærk at manglende relationer også kan skyldes fejl i den eksisterende datamodel, hvilket vil fremgå af valideringsrapporten. I det tilfælde bør de eksisterende elementer i datamodellen rettes og bilaget genereres på ny.
  • Hvis der findes relationer, som registret ikke ønsker er udstillede, bør disse fjernes (i instruktionerne i afsnittet Fjernelse af en relation).

Bemærk at enhver manuel ændring i relationsbilaget, ud over at fuldføre ufuldstændige relationer, ikke repliceres af generatoren, når den køres igen. Dette skyldes, at generatoren bruger XSD'erne/XMI'erne som input og anser disse for at være autoritative. Det anbefales, at datamodellen (XMI’en) opdateres, så den afspejler alle manuelle ændringer.




Opdater datamodellen jf. ændringer i Relations.json


Når der er foretaget manuelle ændringer i Relations.json af registret (fjernelse eller tilføjelse af relationer) anbefales det, at registrets datamodel også opdateres. Dette sikrer, at fremtidige genereringer af bilaget indeholder de korrekte relationer, uden behov for yderligere manuel intervention. Generatoren bag bilaget fungerer ved at analysere elementerne <packagedElement> og <connector> i XMI-filerne. Dette betyder, at enhver manuel ændring i Relations.json bør afspejles i førnævnte elementer:

  • Når en relation fjernes fra relationsbilaget, bør de tilsvarende <packagedElement> og <connector> også fjernes fra XMI-filen.

Når en relation tilføjes til relationsbilaget, skyldes det typisk, at der mangler et <packagedElement> og en <connector> i XMI-filen, som derfor bør tilføjes.




Opdatering af datamodelversion


Når en datamodelversion opdateres, skal trinene i afsnittet Første generation af bilag gentages. Det er vigtigt også at evaluere, hvordan datamodelændringerne påvirker andre registre (f.eks. hvis en entitet eller et felt fjernes/omdøbes).




Change request


Processen for at opdatere et Relationsbilag i produktion er:

  • Foretag tilføjelse og eller fjernelse af relationer i bilaget.
  • Opret en ny pull-request.
  • Notificér Datafordeleroperatøren (ved at oprette en "Change Request" i Jira - husk at inkludere et link til pull-requesten)




Valideringsrapport


Når Relationsbilaget genereres, produceres der også en valideringsrapport til den person som starter generatoren. Hvis der er noget i datamodellen, der giver anledning til fejl eller tvivl, vil den pågældende relation ikke blive parset (dvs. den vil blive udeladt fra bilaget), og advarslen / fejlen logges i valideringsrapporten.




Følgende fejltyper fremgår af valideringsrapporten:

  1. Entities from associations in XMIs missing in XSDs (association EAID, entity EAID)
    • Generatoren bruger som udgangspunkt XMI'erne for at identificere relationerne. Relationerne defineres med en kilde- og en målentitet, og hver entitet skal have et EAID. En del af valideringen består i at bekræfte, at en given kilde-entitet findes i registrets egen XSD, samt at en given mål-entitet findes i en vilkårlig replikeringskanals/registers XSD. Dette gøres ved at søge efter entitetens EAID i de pågældende XSD'er.
    • Hvis denne fejl fremgår af rapporten, betyder det, at EAID for enten kilde- eller målenheden i en relation ikke findes i nogen af XSD'erne. Risikoen er derfor, at relationen er ubrugelig og derfor er den udeladt fra bilaget.
    • For at gøre det lettere at forstå, hvilken relation der er udeladt og på grund af hvilken entitet, er EAID for både relationen og den problematiske entitet angivet.
  2. Undefined Multiplicity (association EAID)
    • Meddelelsen betyder, at de oplysninger, der kræves for at bestemme feltet ”ToManyRelation”, manglede eller var forkerte for relationen med det givne EAID.
  3. No Connectors Found in XMI
    • Meddelelsen betyder, at der var defineret relationer i XMI'en, men at de elementer, der indeholder information om relationerne (<connectors>), ikke er definerede.
    • Dette betyder, at ingen relationer kan parses, selvom der måske er defineret nogle i datamodellen.
  4. Source not defined in association in XMI (association EAID)
    • Meddelelsen betyder, at de oplysninger, der kræves for at indstille ”SourceEntity” enten mangler eller er forkerte for relationen med det givne EAID.
  5. Tag not defined in association in XMI (association EAID)
    • Meddelelsen betyder, at de oplysninger, der kræves for at indstille ”TargetEntity”, ”TargetRc” og ”TargetRcVersion” enten mangler eller er forkerte for relationen med det givne EAID.




Følgende advarsler fremgår af valideringsrapporten (for advarsel er relationer ikke udeladt):

  1. Unnamed Association in XMI (association EAID)
    • Meddelelsen betyder, at relationen med den givne EAID ikke er navngivet i XMI'en.
    • Når en relation får et navn, er det det navn, der bruges til join-feltet. Når relationen mangler et navn, får relationen derimod et navn, der følger konventionen: {Kildefelt}_{Målregister}_{Målentitet}_{Målfelt}_ref.
  2. No Associations Found in XMI
    • Meddelelsen betyder, at der ikke er defineret nogen relationer i XMI’en.
    • Dette kan være intentionelt. Advarslen logges for at sikre, at registret overvejer om dette er tilfældet.




Tilføjelse af en relation


En manuel relation tilføjes den seneste RelationVersion i bilaget. Hvis der er behov for at oprette en ny RelationVersion vil dette blive kommunikeret af Datafordeleroperatøren, når bilaget er blevet evalueret.




Fjernelse af en relation


Fjernelse af en relation medfører en ”breaking change”. Derfor skal der altid oprettes en ny RelationVersion i bilaget. Et eksempel er vist under Versionering af Relations.json.

Den anbefalede fremgangsmåde er at:

  1. Kopiere den aktuelle RelationVersion i bilaget.
  2. Øge versionsnummeret på den kopierede RelationVersion, f.eks. fra ”1” til ”2”.
  3. Fjerne uønskede relationer ved at fjerne disse objekter fra Relations-listen i den kopierede RelationVersion.




Fuldførelse af relation


For at fuldføre en relation skal registret tilføje feltnavnene i de tomme pladser i relationerne for ”SourceField” og ”TargetField”. Bemærk at feltnavnene skal omgives af citationstegn (f.eks. ”NavnPåFelt”).

Følgende oplysninger er allerede udfyldt i Relations.json og kan bruges til at hjælpe dig med at udfylde felterne:

  1. Kilde- og målentitet: Navnet på kilde- og målentiteten angives i relationen af felterne “SourceEntity” og “TargetEntity”. De felter, der skal udfyldes i relationen ”SourceField” og ”TargetField”, skal findes i de entiteter, som relationen er mellem.
  2. Alias: Dette felt angiver navnet, som relationen har. Navnet skal angives i XMI’en under ”Alias”. Navnet er givet til det felt, der bruges til at udføre join. Kan give en idé om de felter, der er en del af relationen. Angives der ikke et Alias vil den blive autogenereret. Det skal bemærkes, at listen er omfattende, men ikke udtømmende, da der kan være foretaget ændringer i datamodellen og de tilladte joins. Derfor er oversigten kun vejledende.






Mappe: 3. Security


I Security-mappen beskrives et registers sikkerhedsmodel. Sikkerhedsmodellen specificeres i én fil, som beskriver hvilket sikkerhedsniveau der er påkrævet, for at tilgå registerets forskellige entiteter via Datafordeleren. Datafordeleren opererer med tre sikkerhedsniveauer, som beskrevet neden for.

Bilaget er ydermere beskrevet formelt i JSON-skemaet: Security_model_Schema.json.

Sikkerhedsniveau

Navn

Beskrivelse

1

Kendt bruger

Data kan indeholde almindelige personoplysninger, som er omfattet af databeskyttelsesforordningen og databeskyttelsesloven.

Tilgængelig for alle typer af log-in på Datafordeleren (e-mailadresse, MitID Privat og MitID Erhverv).

2

Begrænset data

Data indeholder almindelige personoplysninger eller oplysninger, der er særligt beskyttelsesværdige, og som er omfattet af databeskyttelsesforordningen og databeskyttelsesloven.

Tilgængelig for log-in med MitID Erhverv, hvor brugeren har anmodet om og eksplicit fået godkendt adgang til denne data af registret.

3

Specielle begrænsede data

Data indeholder almindelige personoplysninger, følsomme personoplysninger eller oplysninger, der er særligt beskyttelsesværdige, og som er omfattet af databeskyttelsesforordningen og databeskyttelsesloven.

Tilgængelig for log-in med MitID Erhverv, hvor brugeren har anmodet om og eksplicit fået godkendt adgang til denne data af registret.




Ved udfyldelse af bilaget kan sikkerhedsniveauet specificeres på to niveauer:

  • DefaultSecurity: Gælder alle entiteter.
  • SpecificSecurity: Angiver entitetsspecifikke værdier og har forrang over DefaultSecurity.

Mindst én af ovenstående skal angives i bilaget. Hvis DefaultSecurity ikke er udfyldt, skal SpecificSecurity være udfyldt for mindst ét sikkerhedsniveau.

Følgende tabel fremviser eksempler for mulige kombinationer af DefaultSecurity og SpecificSecurity udfyldelse.

Bilag

Krav

Security_Model.json

Bilaget er påkrævet.

Filen skal være navngivet som angivet i venstre kolonne.

Eksempler:

Security_Model.json (Alle entiteter udstilles med Security Level 1)

{
    "DefaultSecurity": 1
}

 

Security_Model.json (Der er eksplicit angivet hvilke entiteter der udstilles med Security Level 1 og Secuirty Level 2)

{
    "SpecificSecurity": [
        {
            "SecurityLevel": 1,
            "Entities": []
        },
        {
            "SecurityLevel": 2,
            "Entities": [
                "AlternativAdresseType",
                "EjendomsadministratorType",
                "EjerskabType",
                "EjerskabsskifteType"
            ]
        },
        {
            "SecurityLevel": 3,
            "Entities": [
                "Ejerskifte_bilagsbankRefType",
                "HandelsoplysningerType",
                "PersonEllerVirksomhedsadminiType",
                "PersonVirksomhedsoplysType"
            ]
        }
    ]
}

 

Security_Model.json (Alle entiteter udstilles med Security Level 1 med undtagelse af CVRPersonType som er SecurityLevel 3).

{
    "DefaultSecurity": 1,
    "SpecificSecurity": [
      {
          "SecurityLevel": 3,
          "Entities": [
            "CVRPersonType"
          ]
      }
  ]
}

Bemærk

Hvis et register ikke bruger DefaultSecurity og ikke har beskrevet alle entiteter ved hjælp af SpecificSecurity, så vil de antages at have et Security Level 1.






Mappe: 4. Tabular_data


Registre, som indsender og distribuerer tabulære data via Datafordeleren, skal for den pågældende replikeringskanal vedlægge bilag i Tabular_data-mappen, der beskriver hvordan data skal distribueres via Datafordelerens distributionstjenester, dvs. prædefinerede og prægenererede fildownloads.

Mappen ”Tabular_data” indeholder tabulære data i form af bilag, dette inkluderer også vektordata. Bilag såsom Automated Predefined Filedownload, Automated Pregenerated Filedownload og Automated WFS er I denne mappe.

Bemærk at vektordata også betragtes som tabulær data.




Bilag: Automated_Predefined_Filedownloads.json


Bilaget definerer hvilke fildownload Datafordeleren skal inkludere i de autogenererede distributionstjenester.

For hver entitet specificeres:

  • Adgangsrettigheder
  • Opdateringsfrekvens
  • Type (delta/total)

Angives entitetsnavn som "All", gælder indstillingerne for alle registerets entiteter.

Bilaget er formelt beskrevet i JSON-skemaet: Automated_Predefined_Filedownloads_Schema.json.




Automated_Predefined_Filedownloads-bilaget består således af en liste af objekter med felter som beskrevet i nedenstående tabel.

Hvis der ikke skal distribueres prædefinerede fildownload udfyldes bilaget blot med en tom liste.

Objekt

Beskrivelse

EntityName

String: Navnet på entiteten. Nødvendig.

FileDownloadType

Enumeration: Angiver, om det er et delta- eller totaldownload. Nødvendig.

1: Totaldownload

2: DeltaDownload

TypeOfData

Enumeration: Angiver typen af data. Nødvendig.

1: Current

2: Temporal

3: Bitemporal

Frequency

Number: Angiver antallet af dage mellem generering af nyt fildownload. Nødvendig.(Der kan angives enten værdien 1 eller 7.

SecurityLevel

Enumeration: Angiver hvem der har adgang til data. Nødvendig.

Deprecated, skal fortsat udfyldes her også men bruges ikke aktivt længere. 

1: Knownuser - Data er omfattet af persondataloven og kræver kendt bruger

2: Restricted - Data er beskyttet, omfattet af persondataloven, og kræver kendt bruger med adgang der er godkendt af registret

3: SpecialRestricted - Ekstra sensitivt data. Som i niveau 2, er data beskyttet, omfattet af persondataloven, og kræver kendt bruger med adgang der er godkendt af registret.




Eksempler på udfyldelse af filen fremgår i følgende tabel.

Bilag

Krav

Automated_Predefined_Filedownloads.json

Bilaget er påkrævet.

Filen skal være navngivet som angivet her i venstre kolonne. 

Eksempler på udfyldelse: 

Automated_Predefined_Filedownloads.json – Beskriver udvælgelse på entitetsniveau

[
    {
        "EntityName": "BBRSag",
        "FileDownloadType": "1",
        "TypeOfData": "3",
        "Frequency": "7",
        "SecurityLevel": "2"
    },
(… eventuelle resterende entiteter)
]

 

Automated_Predefined_Filedownloads.json – Beskriver udvælgelse på baggrund af kombinationen af TypeOfData og FileDownloadType

[
    {
        "EntityName": "All",
        "FileDownloadType": "1",
        "TypeOfData": "3",
        "Frequency": "7",
        "SecurityLevel": "2"
    },
    {
        "EntityName": "All",
        "FileDownloadType": "1",
        "TypeOfData": "2",
        "Frequency": "7",
        "SecurityLevel": "2"
    },
    {
        "EntityName": "All",
        "FileDownloadType": "1",
        "TypeOfData": "1",
        "Frequency": "7",
        "SecurityLevel": "2"
    },
    {
        "EntityName": "All",
        "FileDownloadType": "2",
        "TypeOfData": "3",
        "Frequency": "1",
        "SecurityLevel": "2"
    }
]





Bilag: Automated_Pregenerated_Filedownloads.json


Bilaget definerer hvilke prægenererede fildownload som registeret afleverer til Datafordeleren.

For hvert prægenereret fildownload angives et filnavn, sikkerhedsniveau og filformat, hvis registret ønsker denne type distribution.

Bilaget er formelt beskrevet af JSON-skemaet: Automated_Pregenerated_Filedownloads_Schema.json.

Automated_Pregenerated_Filedownloads bilaget består således af en liste af objekter med felter som beskrevet i nedenstående tabel.

Objekt

Beskrivelse

FileName

String: Navnet på filen. Nødvendig.

SecurityLevel

Enumeration: Angiver hvem der har adgang til data. SecurityLevel er beskrevet i 0 . Nødvendig.

FileFormat

String: Angiver filformatet, f.eks. "XML". Nødvendig.




Eksempel på udfyldelse ses i følgende tabel.

Bilag

Krav

Automated_Pregenerated_Filedownloads.json

Bilaget er valgfrit.

Filen skal være navngivet som angivet i venstre kolonne. 

Eksempel: 

Automated_Pregenerated_Filedownloads.json

[
  {
    "Filename": "MatrikelGeometriGaeldendeDKComplete_GML_2022092",
    "SecurityLevel": "2",
    "FileFormat": "JSON"
  },
  {
    "Filename": "DAGI10MULTIGEOMHIST",
    "SecurityLevel": "1",
    "FileFormat": "GML"
  }
]




Bilag: Automated_Geographical_Filedownloads


Bilaget Automated Geographical Filedownloads kan benyttes af registeret til at definere hvilke entiteter som har geografiske felter som skal bruges til filtrering af fildownloads. Dette inkluderer at specificere navnet på entiteten og en liste af navne på de geografiske felter. Hvis en eller flere entiteter ikke har et eller flere geografiske felter behøves de ikke fremgå i bilaget.

JSON-skemaet Automated_Geographical_Filedownloads_Schema.json består af en liste af Automated_Geographical_Filedownloads objekter. Disse objekter består af følgende egenskaber:

Objekt

Beskrivelse

EntityName

String: Navnet på entiten. Nødvendig.

GeographicFieldNames

List: Angiver hvilke geografiske felter der skal bruges til filtrering. Nødvendig.




GeographicFieldNames er en liste af unikke tekststrenge som indeholder navnene på de felter som fortæller geografisk om hvor data’en til entiteten befinder sig eller hører til. Her er det vigtigt at understrege at feltet skal være af samme type og det derfor ikke er muligt at blande geografiske felter af forskellige typer eller at lave et nyt objekt for samme entitet.

Som et eksempel kan man have godt have en entitet ”NavngivenVej” med kun ”administreresAfKommune” i listen eller med både “vejnavnebeliggenhed_vejnavnelinje”, “vejnavnebeliggenhed_vejnavneområde” og “vejnavnebeliggenhed_vejtilslutningspunkter”, men ikke alle fire i samme liste. Årsagen er at feltet “administreresAfKommune” er af typen ”Kommunekode” og ”vejnavnebeliggenhed” felterne er af typen ”string”. Disse egenskaber er alle krævede før JSON-filen kan valideres.




Bilag Automated_Wfs.json


Automated_Wfs_Schema.json bruges af et register, når de ønsker at definere hvilke entiteter de vil udstille via WFS for en given replikeringskanal. Bilaget angiver navnene på entiteterne.

Objekt

Beskrivelse

Entities

String array: Navnet på entiteterne. Nødvendig. Kan indeholde et tomt array, hvis intet skal udstilles. Kan også indeholde ”All” som betyder alle entiteter fra XSD’en udstilles.






Mappe: 5. Raster_data


Registre, som indsender og distribuerer rasterdata via Datafordeleren, skal for den pågældende replikeringskanal vedlægge bilag i Raster_data-mappen, der beskriver hvordan data skal distribueres via Datafordelerens distributionstjenester, det vil sige prægenererede fildownload.




Bilag: Automated_Pregenerated_Filedownloads.json


Bilaget definerer hvilke prægenererede fildownload som registeret afleverer til Datafordeleren.

For hvert prægenereret fildownload angives et filnavn, sikkerhedsniveau og filformat, hvis registret ønsker denne type distribution.

Bilaget er formelt beskrevet af JSON-skemaet: Automated_Pregenerated_Filedownloads_Schema.json.

Automated_Pregenerated_Filedownloads bilaget består således af en liste af objekter med felter som beskrevet i nedenstående tabel.

Objekt

Beskrivelse

FileName

String: Navnet på filen. Nødvendig.

SecurityLevel

Enumeration: Angiver hvem der har adgang til data. SecurityLevel er beskrevet i 0 . Nødvendig.

FileFormat

String: Angiver filformatet, f.eks. "XML". Nødvendig.




Eksempel på udfyldelse ses i følgende tabel.

Bilag

Krav

Automated_Pregenerated_Filedownloads.json

Bilaget er valgfrit.

Filen skal være navngivet som angivet i venstre kolonne. 

Eksempel: 

Automated_Pregenerated_Filedownloads.json

[
  {
    "Filename": "DHM2015_terraen",
    "SecurityLevel": "1",
    "FileFormat": "GeoTIFF"
  }
]






Versionering


Filer versioneres automatisk gennem Githubs indbyggede versionsstyring. Versionering af maskinlæsbare formater bruger Git´s indbyggede versionering. Ændringer i disse filer kan således findes ved at bruge Git diff funktionaliteten direkte i ens lokale kommandoprompt eller ved at finde filen i Github og kigges på tidligere commits.




Git diff (funktionalitet til at se forskel på to filer)

  1. Navigér til repositoriet på din computer
    1. cd sti/til/mappen
  2. Se commits
    1. Git log –oneline
  3. Vælg forskel mellem to commit hashes
    1. git diff <commit_hash_1> <commit_hash_2> --filsti/til/filen/man/fil/se/forskel/på




Verificering via Github (Mere visuel vej til at se forskel)


  1. Naviger til Datafordeler Repository

  2. Find filen du vil se ændringen på
  3. Se eksempel i figuren til højre.





Eksempler på bilag der versioneres således:

  • JSON
  • XML

Versionering af ikke-maskinlæsbare filer gennem Githubs versionsstyring understøtter ikke at man kan tjekke forskelle mellem versioner via eksempelvis Git diff. Dette kan eksempelvis gøres for Word-dokumenter udenfor Git.






Versionering af DLS gennem DLS_metadata.json bilag


Bilaget angiver hvilken version af DLS-formatet, den pågældende DLS følger – ikke registrets egen versionering af deres DLS. Ved idriftsættelse af den moderniserede Datafordeler, vil DLS-formatets version være "2.0".

Hvis der tilføjes / fjernes bilag fra DLS'en i fremtiden, bruges dette til at være bagud kompatibelt. Datafordeleren øger versionsnummeret, når en ny DLS-format version kommer ud. Dette skal registrene tilføje som værdi i deres DLS_metadata.json bilag.






Versionering af datamodel


Når et register ændrer i dets datamodel, kan det håndteres ved enten at oprette en replikeringskanal eller opdatere den eksisterende. Når ændringen træder i kraft, vil der blive lavet en ændring i både den interne og eksterne version.




Intern versionering


Intern versionering relaterer sig til indlæsning af et registers data og er baseret på replikeringskanaler og model versionsnumre, Denne versionering opdateres når et register opdaterer sin datamodel. Der er to måder hvorpå et register kan opdatere sin datamodel og dermed også den interne versionering.





To replikeringskanaler


Her opretter man en ny replikeringskanal og indsender data til begge replikationskanaler, både den eksisterende og den nye, som man har oprettet, til autogenerering. Den gamle replikeringskanal vil bibeholde modelversion 1, som den nuværende ’as-is’ løsning, hvor den nye replikeringskanal vil få modelversion 2 og blive den nye ’to-be’ løsning. Resultatet er altså to modelversioner, på hver sin replikeringskanal, hvor den ene version kører den ’gamle’ version og den anden version kører den ’nye’ version.



Én replikeringskanal


I dette tilfælde vil resultatet stadig være to interne modelversioner, igen en ’as-is’ version og en ’to-be’ version.

Her skal registrene dog levere flere DLS-filer. En samlet XSD fil til replikering, as-is XMI og XSD, to-be XMI og XSD samt to sæt af mapping regler fra den samlede XSD til as-is og to-be XSD-filer.

Se Opdatering af eksisterende replikeringskanal



Valg af intern versionerings-fremgangsmåde


Datafordeleroperatøren og registrene bør i samarbejde vælge hvilken af de 2 mulige fremgangsmåder for intern versionering som registeret skal anvende. Det bør overvejes før processen om et skift sker, da implementeringen af den parallelle replikering-implementering i registerets eget system vil være stærkt afhængigt af hvilken fremgangsmåde der anvendes.

Det anbefales at hvis et register laver en mindre datamodel-ændring (som potentielt indeholder breaking changes) som leveres af samme bagvedliggende register-system at metoden fra Én replikeringskanal vælges. Dette kunne være tilføjelse af et par nye tabeller, fjernelse af enkelte felter, og lign.

Hvis registerets datamodel-ændring er en stor fuldamental ændring, som potentielt leveres af et helt separat ny-udviklet system der parallel-driftes med registerets gamle system, så anbefales det at metoden fra To replikeringskanaler vælges. Dette anbefales da denne metode ikke kræver nogen koordinering mellem registeret systemer, da hvert system har sin egen kanal med dedikeret sekvensnummer.

Da virkelighedens register datamodel-ændringer forventes at ligge et sted imellem de ovennævnte ender af skalaen, og da registeret muligvis har andre heri-ikke-beskrevne behov til paralleldriften, anbefales det at Datafordeleroperatøren og registrene sammen vurderer på en case-by-case basis hvilken fremgangsmåde der passer bedst til den konkrete situation.




Ekstern versionering


Ekstern versionering relaterer sig til udstilling af registrenes data til anvendere og baserer sig på register-navne og eksterne versionsnumre. En ny datamodel for et givent register er stadig det samme register og register-navnet skal dermed ikke nødvendigvis ændres, når der kommer en ny version. Helt konkret menes der her at register navneændringer der kommer udelukkende pga. ny datamodel (f.eks. MAT à MAT2) fremadrettet ikke er teknisk nødvendig.

Det er muligt at indføre et nyt register-navn ifm. en versions-opdatering hvis registeret og Datafordeleroperatøren aftaler dette, men det anbefales ikke at gøre det da dette vil anses af DAF-systemet som et helt nyt register, og ikke blot en ny version af et eksisterende register. Bemærk at hvis register-navnet ændres så skal den interne versionering med separate replikeringskanaler, beskrevet i To replikeringskanaler, vælges.

Når der oprettes en ny intern modelversion, beskrevet i Intern versionering, opretter DAF en ny ekstern version som udstiller ændringerne til anvenderne. Den gamle, eksisterende snitflade vil basere sig på den ’gamle’ ’as-is’ løsning, og der oprettes en ny ’to-be’ version ved siden af, så dette kan paralleldriftes så anvenderne har mulighed for at opdatere deres systemer.




Samlet overblik


Hvis et register sender data til to separate replikeringskanaler, vil det totale flow se ud som i nedenstående figur.





Hvis et register sender data til én enkelt replikeringskanal, vil det komplette flow se ud som neden for.





Som kan ses i ovenstående figurer så er den anvender-vendte eksterne snitflade altid ens overfor anvenderne, uagtet hvilken fremgangsmåde der er blevet valgt i den interne versionering.




Opdatering af eksisterende replikeringskanal


Når et register ændrer i dets datamodel, skal registeret aflevere følgende bilag, som bruges til at generere services:

  1. XSD for nuværende datamodel (As-is XSD) samt tilhørende XMI.
    1. XSD’en specificerer dataformatet af den nuværende datamodel. Den tilhørende XMI beskriver dens relationer. Disse filer blev brugt til at generere den nuværende version af services og fildownloads.
  2. XSD for kommende datamodel (To-be XSD) samt tilhørende XMI.
    1. XSD’en specificerer dataformatet af den opdaterede datamodel. Den tilhørende XMI beskriver dens relationer. Disse filer vil blive brugt til at generere den opdaterede version af services og fildownloads.
  3. XSD for data-replikering (Replication XSD).
    1. XSD-filen beskriver dataformatet som registret vil replikere til Datafordeleren i transitionsperioden
    2. Replikerings-XSD-skemaet skal specificere type- og elementbegrænsninger, der er gyldige for den strengest mulige fortolkning af datavaliditet som defineret i både nuværende (as-is) og kommende (to-be) skemaer.
    3. Eksempel på data-replikerings-XSD-begrænsning
      1. Hvis et register har specificeret at en specifik streng har en max længde på 250 karakterer i deres as-is XSD og deres to-be XSD har specificeret for samme streng en max længde på 500 karakterer, så skal replikering XSD’en begrænse max længden til 250 karakterer under transitionsperioden. Efter udfasningsperioden er slut, kan as-is XSD’en blive fjernet fra registrets DLS og data-replikering XSD’en kan blive ændret til to-be XSD-skemaet. Herefter kan registret bruge de eventuelle nye regler fra as-is XSD’en (den tidligere to-be XSD). I stedet burde registret tilføje et nyt felt.
    4. Et regelsæt der beskriver hvordan XSD-skemaet for data-replikering oversættes til den nuværende (As-is XSD) samt kommende (To-be XSD).
      1. Det er tilladt at udelade entiteter, felter og typer fra XSD-skemaet for data-replikering, som ikke eksisterer i de andre skemaer.
      2. Det er tilladt at omdøbe entiteter og felter mellem datamodel-versioner.

Det er ikke tilladt at ændre felter. I stedet skal et register specificere et nyt felt som er fyldt med konverteret data fra det eksisterende felt. Efter perioden for afskrivning af nuværende, bliver det gamle felt slettet og det nye felt kan omdøbes hvis det er nødvendigt.




Så længe der er paralleldrift på flere versioner af samme datamodel, vil det være påkrævet af et register at aflevere XSD-skemaer på de datamodeller der driftes. Dette betyder også, at hvis et register har paralleldrift på 3 datamodeller, vil det være påkrævet af et register at aflevere tilsvarende flere XSD-skemaer. Bemærk at det ikke anbefales at have mere end 2 modeller ad gangen.





XMI og XSD placeres under den tilhørende replikeringskanals mappe i GitHub, medmindre ændringerne kommer i forbindelse med en ny replikeringskanal, så oprettes der en ny mappe i GitHub. Reglerne for As-is og To-be mapping håndteres af autogeneratoren og kræver ikke yderligere handlinger af registret.




Oprettelse af ny replikeringskanal


  1. Aflever DLS i Github jf. Proces for aflevering i GitHub.
  2. Netcompany Forvaltning opretter ny replikeringskanal eksisterende proces.




Versionering af Relations.json


Bilaget Relations versioneres på to niveauer:

  1. Bilagsniveau. Selve bilaget har en version, som er identisk med datamodelversionen (dvs. DLS-versionen eller Git-versionen).
  2. Inden for bilaget. I bilaget kan der specificeres flere relationsversioner (RelationVersions). Dette muliggør, at de fleksible GraphQL-tjenester kan understøtte paralleldrift af forskellige versioner af relationsdefinitionerne. En ny RelationVersion skal oprettes, når et register ønsker at opdatere de relationer, de udstiller via FO, på en sådan måde, at det medfører en ”breaking change”. Et eksempel på dette er givet i eksemplet neden for, hvor en relation (Husnummer-Bygning) er fjernet fra version 2 ift. version 1.


Eksempel på relation i bilaget
{
  "RelationVersions": [
    {
      "RelationVersionNumber": "1",
      "Relations": [
        {
          "SourceEntity": "Husnummer",
          "SourceField": "navngivenVej",
          "TargetRc": "22",
          "TargetRcVersion": "1",
          "TargetEntity": "NavngivenVej",
          "TargetField": "id_lokalId",
          "ToManyRelation": false,
          "Alias": "husnummerHoererTilNavngivenVej"
        },
        {
          "SourceEntity": "Husnummer",
          "SourceField": "adgangTilBygning",
          "TargetRc": "18",
          "TargetRcVersion": "1",
          "TargetEntity": "Bygning",
          "TargetField": "id_lokalId",
          "ToManyRelation": false,
          "Alias": "husnummerGiverAdgangTilBygning"
        }
      ]
    },
    {
      "RelationVersionNumber": "2",
      "Relations": [                  
        {
          "SourceEntity": "Husnummer",
          "SourceField": "navngivenVej",
          "TargetRc": "22",
          "TargetRcVersion": "1",
          "TargetEntity": "NavngivenVej",
          "TargetField": "id_lokalId",
          "ToManyRelation": false,
          "Alias": "husnummerHoererTilNavngivenVej"
        }
      ]
    }
  ]
}






Versionering af fildownload og GraphQL-tjenester


Fildownload bliver automatisk genereret baseret på den leverede fysiske datamodel der leveres af et register. Fildownload versioneres derfor også på tværs af replikeringskanaler, hvilket vil sige at ændringer i enkelte entiteter vil forårsage en ny version af alle fildownload for den replikeringskanal, hvis ændringen indebærer at anvenderne skal lave ændringer i eget systemet for at bruge den pågældende tjeneste. Eksempelvis hvis der fjernes et felt eller en entitet. Det samme gør sig gældende for GraphQL-tjenester.