Naar de inhoud
maarten.
Alle posts

Data contracts tussen systemen: structuur en betekenis

Maarten Soetens 13 min lezen

Een data contract legt vast welke gegevens een systeem levert, wat die gegevens betekenen en aan welke regels ze moeten voldoen. Je leest hoe teams contracten opstellen, valideren en wijzigen zonder de gevolgen voor producerende en afnemende systemen uit het oog te verliezen.

Welke afspraken horen in een data contract?

Een data contract beschrijft de interface waarmee een producerend systeem gegevens beschikbaar stelt aan afnemers. Het gaat verder dan een lijst kolomnamen. Een bruikbaar contract legt ook gegevenstypen, verplichte waarden, toegestane bereiken, betekenis en verwachtingen over beschikbaarheid vast. Daarmee wordt duidelijk welke eigenschappen een afnemer mag gebruiken en welke aannames niet veilig zijn.

Structuur, regels en context

Voor een tabel kan het contract bijvoorbeeld bepalen dat klant_id een niet-lege tekenreeks is, dat aanmaakdatum een datum-tijdwaarde in UTC bevat en dat status alleen waarden uit een afgesproken verzameling kan aannemen. Voor een gebeurtenis kunnen ook de naam, sleutel, volgorde en betekenis van de payload onderdeel zijn. Metadata zoals de eigenaar, de bron en de contractversie helpt om de afspraken terug te vinden.

Niet elke eigenschap is even hard. Een verplicht veld en een maximale veldlengte kunnen technisch worden afgedwongen; de precieze zakelijke interpretatie vraagt vaak toelichting. Maak daarom onderscheid tussen machineleesbare regels en documentatie voor mensen, maar beheer beide als onderdelen van hetzelfde contract. Een schema zonder betekenisvolle beschrijving voorkomt typefouten, maar niet dat afnemers een veld verkeerd interpreteren. Andersom is alleen documentatie kwetsbaar voor veroudering en verschillende lezingen.

Leg ook vast wat buiten het contract valt. Als de volgorde van velden geen betekenis heeft, moet dat expliciet zijn. Hetzelfde geldt voor ontbrekende waarden, standaardwaarden en de behandeling van onbekende velden. Zonder die afspraken vullen teams de leemtes zelf in, waardoor integraties afhankelijk worden van toevallige implementatiedetails.

Gegevenstypen zijn niet hetzelfde als betekenis

Een schema kan controleren of een veld een getal, tekst of datum bevat, maar daarmee is de betekenis nog niet bepaald. Het getal 12 kan een leeftijd, een aantal dagen of een statuscode voorstellen. Een datum kan de dag van een gebeurtenis aanduiden, maar ook de datum waarop een systeem de gebeurtenis registreerde. Als producer en afnemer daar verschillende aannames over hebben, kan de data technisch geldig zijn en toch tot verkeerde uitkomsten leiden.

Maak semantiek expliciet

Beschrijf per veld wat het voorstelt, welke eenheid van toepassing is, welk tijdsgebied wordt gebruikt en hoe de waarde tot stand komt. Bij een bedrag horen bijvoorbeeld valuta en de vraag of het inclusief of exclusief belasting is. Bij een tijdstempel is het relevant of die in UTC staat en of de waarde het moment van optreden of verwerking weergeeft. Voor een identificatieveld moet duidelijk zijn binnen welke context de identifier uniek is.

Ook null, nul en een lege tekenreeks verdienen afzonderlijke definities. Een ontbrekende waarde kan betekenen dat informatie onbekend is, niet van toepassing is of nog niet is aangeleverd. Die betekenissen zijn niet uitwisselbaar. Als een afnemer ze samenvoegt, kunnen rapportages of beslisregels anders uitpakken dan bedoeld.

Zakelijke termen vragen soms om een verwijzing naar een gedeelde begrippenlijst. Dat voorkomt dat bijvoorbeeld ‘actieve klant’ in twee systemen verschillende criteria heeft. Definities hoeven niet lang te zijn, maar moeten wel toetsbaar genoeg zijn om implementatiekeuzes te sturen. Waar interpretatie onvermijdelijk blijft, benoemt het contract de grens en wijst het een eigenaar aan die vragen over die betekenis kan beantwoorden.

Eigenaarschap van data contracts verdelen

Een contract raakt zowel het team dat gegevens produceert als de teams die ze gebruiken. Toch is gedeeld belang niet hetzelfde als gedeeld eigenaarschap. Als onduidelijk is wie een velddefinitie beheert, blijven fouten vaak bestaan omdat iedere partij verwacht dat een andere partij de wijziging oppakt. Wijs daarom een eigenaar aan voor het contract als geheel en benoem waar nodig eigenaren voor specifieke domeintermen of kwaliteitsregels.

Producer, afnemer en platformteam

De producer is verantwoordelijk voor het leveren van gegevens die aan de afgesproken structuur en kwaliteitsregels voldoen. De afnemer is verantwoordelijk voor het gebruik volgens de vastgelegde betekenis en voor het signaleren van ontbrekende behoeften. Een platformteam kan hulpmiddelen leveren voor registratie, validatie en distributie, maar hoort niet automatisch eigenaar te worden van de zakelijke inhoud. Die scheiding voorkomt dat technische ondersteuning de inhoudelijke besluitvorming vervangt.

Leg vast wie wijzigingen mag voorstellen, wie ze beoordeelt en hoe conflicten worden beslecht. Een wijziging aan een statuswaarde kan voor het producerende team klein lijken, terwijl meerdere afnemers die waarde gebruiken in rapportages of procesautomatisering. Een register met eigenaar, contactpunt, afnemers en afhankelijkheden maakt zulke gevolgen zichtbaar. Alleen een e-mailadres in een schema is onvoldoende als niemand verantwoordelijk is voor opvolging of continuïteit.

Eigenaarschap vraagt ook aandacht bij reorganisaties en systeemvervangingen. Contracten die alleen in de hoofden van individuele ontwikkelaars bestaan, verliezen hun context wanneer die mensen van rol veranderen. Bewaar beslissingen en uitzonderingen bij het contract, zodat nieuwe beheerders kunnen zien waarom een regel bestaat en wie een wijziging kan goedkeuren.

Validatie van data contracts in de ontwikkelketen

Een contract heeft pas operationele waarde wanneer systemen kunnen controleren of gegevens eraan voldoen. Validatie kan op verschillende momenten plaatsvinden: bij het bouwen van een producer, tijdens publicatie van een schema en wanneer gegevens daadwerkelijk worden verstuurd of opgeslagen. Die controles beantwoorden verschillende vragen. Een bouwcontrole vindt fouten vroeg, terwijl runtime-validatie afwijkingen ontdekt die pas door configuratie, externe invoer of productiegedrag ontstaan.

Controleer op de juiste grens

Begin met regels die automatisch toetsbaar zijn, zoals verplichte velden, gegevenstypen, toegestane waarden en formaatbeperkingen. Een test kan vervolgens representatieve geldige en ongeldige voorbeelden controleren. Bij een API kan de server een ongeldige aanvraag weigeren; bij een gebeurtenisstroom kan een validator berichten markeren of naar een aparte foutstroom sturen. De keuze hangt af van de gevolgen van afwijzen en van de mogelijkheid om gegevens later opnieuw te verwerken.

Validatie alleen bij de producer is niet altijd voldoende. Een bericht kan onderweg worden aangepast, een oudere applicatie kan nog actief zijn of een invoerbron kan buiten de normale bouwketen vallen. Controle aan de ontvangende kant beschermt afnemers, maar te strikte controles kunnen geldige uitbreidingen blokkeren. Leg daarom vast wat er gebeurt bij onbekende velden en hoe fouten zichtbaar worden gemaakt.

Niet alle kwaliteitsregels passen in een schema. Een veld kan het juiste type hebben maar een onmogelijke relatie met een ander veld bevatten. Domeincontroles, zoals een einddatum die vóór een startdatum ligt, vragen aanvullende validatie. Houd schema-validatie en inhoudelijke kwaliteitscontroles herkenbaar gescheiden, zodat teams weten welk soort fout is gevonden en waar die moet worden opgelost.

Compatibiliteit tussen versies beoordelen

Een contract verandert mee met de behoeften van systemen, maar niet iedere wijziging heeft dezelfde impact. Een optioneel veld toevoegen is vaak compatibel met afnemers die onbekende velden negeren. Een verplicht veld toevoegen kan bestaande berichten ongeldig maken of oudere afnemers laten vastlopen. Een veld verwijderen, hernoemen of van betekenis veranderen raakt doorgaans zowel producer als afnemer, zelfs wanneer de technische structuur op het eerste gezicht weinig verandert.

Vooruit- en achterwaartse compatibiliteit

Achterwaartse compatibiliteit betekent meestal dat nieuwe producers nog werken met bestaande afnemers. Voorwaartse compatibiliteit gaat erom dat oude producers kunnen worden verwerkt door nieuwere afnemers. Die eigenschappen zijn niet automatisch symmetrisch. Een strikte validator die onbekende velden afwijst, kan een toevoeging onverenigbaar maken, terwijl een flexibele afnemer die velden negeert diezelfde toevoeging wel kan verwerken.

Beschrijf per contract welke compatibiliteitsregels gelden en toets wijzigingen daartegen. Daarbij tellen niet alleen veldnamen en typen, maar ook beperkingen, standaardwaarden en semantiek. Een wijziging van eurocenten naar euro's behoudt misschien een numeriek type, maar verandert de interpretatie van iedere waarde. Een semantische wijziging kan daardoor ingrijpender zijn dan een zichtbare schemawijziging.

Versies kunnen worden beheerd met aparte schema-identificaties, expliciete versienummers of een compatibiliteitsbeleid in een register. Een versienummer op zichzelf voorkomt geen fouten: systemen moeten weten welke versies ze accepteren en hoe lang oudere versies beschikbaar blijven. Test daarom contractwijzigingen met voorbeelden van bestaande berichten en relevante afnemers, niet alleen met de nieuwe schema-definitie.

Wijzigingen invoeren zonder afnemers te verrassen

Een wijzigingsproces begint met het vaststellen van de reden en de reikwijdte. Een producer kan een veld willen hernoemen om de naam consistenter te maken, terwijl afnemers afhankelijk zijn van die bestaande naam. Inventariseer daarom welke applicaties, rapportages en dataproducten het contract gebruiken voordat een wijziging wordt ingevoerd. Een catalogus met geregistreerde afhankelijkheden helpt, maar is niet altijd volledig: handmatige exports en tijdelijke koppelingen blijven soms buiten beeld.

Geleidelijke migratie

Bij een ingrijpende wijziging kan een overgangsperiode nodig zijn. De producer publiceert bijvoorbeeld tijdelijk zowel het oude als het nieuwe veld, waarna afnemers hun verwerking aanpassen. Dit verlaagt het risico op een gelijktijdige omschakeling, maar vergroot tijdelijk de complexiteit. Beide velden moeten dezelfde betekenis hebben of hun verschillen moeten expliciet worden gedocumenteerd. Anders ontstaat een periode waarin systemen uiteenlopende waarden gebruiken.

Definieer vooraf hoe wordt vastgesteld dat een afnemer is gemigreerd. Dat kan via gebruiksmetingen, testresultaten of bevestiging van het verantwoordelijke team. Verwijder het oude veld niet alleen omdat een nieuwe versie is gepubliceerd; een publicatie betekent niet dat alle afnemers die versie al gebruiken. Communiceer ook wanneer de wijziging beschikbaar is, wat er verandert en welke acties nodig zijn. Een technisch changelog zonder impactinformatie maakt het voor afnemers moeilijk om prioriteiten te bepalen.

Bij een spoedwijziging kan een normale overgang niet haalbaar zijn. Leg dan vast wie het risico accepteert, welke afnemers geraakt kunnen worden en hoe gegevens opnieuw verwerkt kunnen worden. Een expliciete uitzonderingsroute voorkomt dat tijdelijke noodoplossingen stilzwijgend de nieuwe standaard worden.

Contractschendingen herkennen in productie

Een contract kan correct zijn geïmplementeerd en toch in productie worden geschonden. Een onverwachte bronwaarde, foutieve transformatie of gedeeltelijke uitrol kan ervoor zorgen dat berichten afwijken van het schema. Zonder observatie komt zo’n afwijking soms pas aan het licht wanneer een rapportage leeg is of een downstream-proces faalt. Meet daarom niet alleen de beschikbaarheid van een endpoint, maar ook de kwaliteit en geldigheid van de gegevens die erdoorheen gaan.

Van validatiefout naar oorzaak

Maak zichtbaar hoeveel records of berichten niet voldoen, welke regels worden geraakt en bij welke bron of contractversie de afwijking voorkomt. Een totaalteller is nuttig voor trends, maar onvoldoende voor onderzoek. Foutmeldingen moeten de relevante veldnaam en reden bevatten zonder onnodig gevoelige payloads in logs te bewaren. Correlatie-id's en tijdstempels helpen om een probleem over meerdere services heen te volgen.

Bepaal per stroom wat er met ongeldige gegevens gebeurt. Een transactie kan worden geweigerd als verdere verwerking onveilig is. Een batch kan naar quarantaine worden verplaatst zodat geldige records doorgaan. Bij gebeurtenissen kan een aparte foutstroom herstel mogelijk maken, mits duidelijk is wie die berichten beoordeelt en hoe herverwerking wordt uitgevoerd. Stilzwijgend records overslaan is riskant: de verwerking lijkt gezond terwijl gegevens ontbreken.

Stel meldingen af op betekenisvolle afwijkingen. Een enkele ongeldige record kan incidenteel zijn, maar een plotselinge toename kan wijzen op een defecte release of gewijzigde bron. Bewaar genoeg context om veranderingen in foutpatronen te vergelijken, en koppel incidenten aan de contracteigenaar. Zo wordt een contractschending een traceerbare operationele gebeurtenis in plaats van een losse melding zonder verantwoordelijke.

Data contracts toepassen op API's, events en datasets

De vorm van een data contract verschilt per manier waarop gegevens worden uitgewisseld. Een API-contract beschrijft vaak verzoeken, antwoorden, foutcodes en gedrag bij ontbrekende of ongeldige invoer. Bij events zijn ook de gebeurtenisnaam, de sleutel, de publicatiecontext en de betekenis van het moment van optreden belangrijk. Voor datasets spelen kolomdefinities, partitions, vernieuwingsfrequentie en de behandeling van historische wijzigingen een grotere rol.

Pas de afspraken aan het gebruik aan

Een event is doorgaans een mededeling dat iets heeft plaatsgevonden, niet alleen een momentopname van de huidige toestand. Als een orderstatus van ‘verzonden’ naar ‘geannuleerd’ verandert, moet de afnemer weten of het bericht een nieuwe gebeurtenis is of een volledige vervanging van de eerdere status. Ook duplicaten en volgorde kunnen relevant zijn: sommige transportsystemen leveren berichten meer dan één keer af of garanderen geen globale volgorde.

Een datasetcontract kan vastleggen hoe vaak gegevens worden bijgewerkt en of correcties met terugwerkende kracht mogelijk zijn. Dat is bepalend voor afnemers die periodieke rapportages maken. Een contract dat alleen kolommen en typen beschrijft, laat hen zelf aannemen of een dagbestand definitief is of later kan veranderen. Bij API's kan juist de behandeling van paginering, foutantwoorden en optionele velden bepalen of een integratie robuust is.

Gebruik waar mogelijk een gedeelde taal voor schema's en validatie, maar forceer niet elk transport in hetzelfde model. Een uniforme registratie kan eigenaarschap en vindbaarheid verbeteren; de concrete regels moeten aansluiten op het gedrag van de interface. Houd de contracten bovendien klein genoeg om één herkenbare gegevensgrens te beschrijven, zodat wijzigingen en afhankelijkheden gericht beoordeeld kunnen worden.

Veelgestelde vragen

Welk formaat gebruik je voor een data contract?

Het juiste formaat voor een data contract hangt af van de interface en de systemen die het contract moeten lezen. Voor JSON-berichten is JSON Schema vaak bruikbaar; Avro en Protobuf worden veel gebruikt voor gebeurtenisstromen en efficiënte berichtuitwisseling. Voor API’s kan een OpenAPI-specificatie de interface beschrijven. Geen enkel formaat legt vanzelf alle zakelijke betekenis of afspraken over beheer vast.

  • Kies een formaat dat aansluit op de bestaande technologie.
  • Controleer of tooling het kan valideren en versieverschillen kan beoordelen.
  • Documenteer zakelijke definities en afspraken die niet in het schema passen.

Hoe begin je met data contracts in een bestaande dataomgeving?

Begin met één gegevensstroom die belangrijk is voor meerdere teams en waarvan de huidige afspraken onduidelijk of foutgevoelig zijn. Breng de producer, afnemers en belangrijkste gevolgen van fouten in kaart. Leg daarna de huidige structuur, betekenis, eigenaar en verwachtingen vast, en bespreek die met de betrokken teams. Zo test je de werkwijze op een beheersbare schaal voordat je meer contracten invoert.

  • Kies een concrete, afgebakende pilot.
  • Maak bestaande aannames en uitzonderingen zichtbaar.
  • Verwerk feedback in een herhaalbaar sjabloon of proces.
  • Breid pas uit wanneer duidelijk is wie contracten onderhoudt.

Hoe leg je data freshness en beschikbaarheid vast in een data contract?

Leg data freshness en beschikbaarheid vast als meetbare verwachtingen, met een afgesproken meetpunt en tijdsperiode. Beschrijf bijvoorbeeld hoe vaak gegevens worden bijgewerkt, hoe oud een record maximaal mag zijn en binnen welke termijn een dataset na een gebeurtenis beschikbaar hoort te zijn. Maak ook duidelijk hoe geplande onderhoudsmomenten, vertragingen en uitzonderingen worden behandeld, zodat producer en afnemer dezelfde norm hanteren.

  • Definieer een meetbare grens, zoals maximale vertraging.
  • Vermeld waar en hoe de meting plaatsvindt.
  • Spreek af wie afwijkingen opvolgt en hoe afnemers worden geïnformeerd.

Hoe neem je privacyafspraken op in een data contract?

Neem privacyafspraken op door vast te leggen welke persoonsgegevens worden gedeeld, waarom ze nodig zijn en welke beperkingen voor gebruik gelden. Beschrijf ook classificatie, toegangsvoorwaarden, bewaartermijnen en eventuele eisen voor verwijdering of anonimisering. Een contract vervangt geen privacybeoordeling of juridische afspraken, maar kan teams wel helpen om gegevensgebruik en verantwoordelijkheden concreet en controleerbaar te maken.

  • Deel alleen velden die nodig zijn voor het afgesproken doel.
  • Markeer gevoelige velden en leg toegangsbeperkingen vast.
  • Gebruik geen echte persoonsgegevens in testvoorbeelden als dat niet nodig is.
  • Wijs een contactpersoon aan voor vragen over toegestaan gebruik.

Wat is het verschil tussen een data contract en een data quality SLA?

Een data contract beschrijft de afspraken over een gegevensinterface, terwijl een data quality SLA meetbare prestatieniveaus en gevolgen bij het niet halen daarvan vastlegt. De onderwerpen kunnen overlappen: een contract kan bijvoorbeeld een verwachting over volledigheid of actualiteit bevatten, terwijl een SLA bepaalt hoe die norm wordt gemeten en welke opvolging geldt bij een afwijking. Teams kunnen beide documenten koppelen, zolang duidelijk blijft waar iedere afspraak staat.

  • Gebruik het contract voor structuur, betekenis en gebruiksvoorwaarden.
  • Gebruik een SLA voor meetdoelen, rapportage en escalatieafspraken.
  • Verwijs tussen beide zodat normen niet op verschillende plekken uiteenlopen.
Portret van Maarten

Maarten

Freelance developer in Nijmegen

Even kennismaken?

Vertel kort wat er speelt. Dan hoor je wat er kan, wat ik anders zou doen en waar AI bij jou wél en niet iets toevoegt. Vrijblijvend.

[email protected]
Het kantoor in Nijmegen
© 2026 maarten.online Sitemap Privacy Algemene voorwaarden
Het kantoor in Nijmegen

Maarten.

Freelance developer in Nijmegen. Liever direct contact? Dat kan ook.

Kennismaken

Laat je gegevens achter, dan kijken we of het klikt. Vrijblijvend en zonder verkooppraat.

Maarten

Stuur een bericht via WhatsApp

Hoi! Waar kan ik je mee helpen?

nu