Waarom “één database” soms ineens niet meer werkt

Je data platform groeit en ineens komt er frictie. Product wil nieuwe features sneller uitrollen, dus het datamodel verandert vaker. Tegelijk vraagt analytics om meer data (logs, events, clickstreams) en wil engineering hogere beschikbaarheid en schaalbaarheid—liefst wereldwijd. Als je alles in één relationele OLTP-database probeert te proppen, loop je vaak tegen dezelfde twee problemen aan: schema-rigiditeit (elke verandering is risicovol) en schaal-/latencygrenzen (reads/writes, regio’s, pieken).

In de vorige les heb je gezien waarom we workloads scheiden (OLTP vs OLAP) en waarom een warehouse een contract is over definities en tijd. NoSQL en cloud storage verschijnen historisch precies op dat snijvlak: organisaties willen sneller kunnen schalen, data in meer vormen kunnen opslaan, en systemen bouwen die “altijd aan” zijn—maar dat betekent bijna altijd dat je trade-offs accepteert.

In deze les leer je hoe je NoSQL en cloud storage benadert als ontwerpkeuzes: welke belofte koop je in, welke garantie lever je in, en hoe voorkom je dat flexibiliteit verandert in chaos.

De basisbegrippen: NoSQL en cloud storage als andere contracten

NoSQL is geen één technologie maar een verzamelnaam voor databasen die niet primair het relationele model + SQL + strikte constraints als kerncontract nemen. Het gaat meestal om één (of meer) van deze doelen: horizontaal schalen, hoge beschikbaarheid, flexibele datarepresentatie, of lage latency bij specifieke access patterns. Belangrijk: NoSQL betekent niet “geen schema”, maar vaak schema-on-read of schema in applicatielogica, in plaats van harde constraints in de database.

Cloud storage is opslag als dienst, waarbij je capaciteit, replicatie en duurzaamheid uitbesteedt aan een platform. In praktijk gaat het vaak om drie smaken: object storage (bestanden/objects), block storage (schijf-achtig voor VM’s/DB’s) en managed database services (waarbij opslag en database samen als dienst komen). Het contract verschuift: je krijgt elasticiteit en operational gemak, maar je leeft met netwerkgrenzen, kostenmodellen per gebruik, en soms consistency/latency-eigenschappen die anders zijn dan “één lokale disk”.

De link met OLTP/OLAP/warehousing is direct. OLTP vraagt vaak om sterke integriteit en transacties; OLAP vraagt om snelle scans en historiek; warehousing vraagt om eenduidige definities. NoSQL en cloud storage kunnen elk van die doelen ondersteunen, maar nooit zonder keuzes. Zie NoSQL en cloud dus niet als “modern = beter”, maar als andere set afspraken over consistentie, model, performance en beheer.

NoSQL-modellen: dezelfde vraag, andere data-vorm

Key-value en document stores: snelheid en flexibiliteit, maar discipline verschuift

Bij key-value stores is het contract extreem simpel: je haalt een waarde op via een sleutel. Dit blinkt uit in voorspelbare latency en schaalbaarheid, zolang je access pattern “lookup by key” dominant is. Het gevaar zit in wat je opgeeft: er is meestal geen rijke relationele structuur met foreign keys of joins die je integriteit afdwingen. Als je relaties nodig hebt, bouw je die buiten de database—en dat is vaak waar inconsistentie binnensluipt.

Document stores (JSON-achtige documenten) geven je een natuurlijke manier om “een aggregate” in één record te stoppen, bijvoorbeeld een klant met adressen en voorkeuren. Dat maakt lezen vaak efficiënt: je haalt één document op in plaats van meerdere tabellen te joinen. De trade-off is dat duplicatie makkelijker wordt en dat “één waarheid” fragieler kan worden: als productnaam of klantsegment op meerdere plekken gekopieerd wordt, moet je updates en versies strak regelen.

Best practices draaien hier om bewust modelleren op querypatronen. Denk in “wat lees ik in één keer?” en “waar moet ik consistent blijven?” Als de use case transactie-achtig is, heb je alsnog een vorm van atomiciteit nodig—maar dan vaak binnen één document of key. Een veelvoorkomende misvatting is: “document stores zijn schema-loos, dus we kunnen alles later wel fixen.” In werkelijkheid verschuift schema naar validatie, versiebeheer en contracttests; zonder die discipline verandert flexibiliteit in onbetrouwbare data.

Wide-column en graph: schaal voor specifieke patronen, met scherpe randen

Wide-column stores (kolomfamilies) zijn ontworpen voor hoge write-throughput en grote datasets, vaak met partitioning als kernprincipe. Ze passen goed bij tijdreeksen, events of log-achtige data waarbij je meestal leest per sleutel/partition (bijv. per klant, per device, per dag). De kracht is dat je structuur rond partitions je performance voorspelbaar maakt. De valkuil: als je later ineens “ad-hoc joins” of brede queries wilt, ontdek je dat het model dat niet faciliteert—je moet dan vooraf meerdere “views” of tabellen ontwerpen die je query’s ondersteunen.

Graph databases modelleren relaties als first-class: nodes en edges. Ze zijn sterk als je vragen stelt zoals “vind alle verbonden entiteiten binnen 3 hops” of “wat zijn de paden tussen A en B”. Dat is conceptueel aantrekkelijk, maar het blijft een trade-off: graph workloads kunnen duur worden als de graaf groot is en traversals ongericht zijn. Bovendien blijven definities en integriteit een ontwerpvraag: ook in een graph wil je constraints-achtig denken (unique identifiers, edge-typen, domeinregels), anders wordt je graaf een rommelig netwerk zonder betrouwbare semantiek.

Een typische misconceptie is: “NoSQL is voor alles wat relationeel lastig is.” In praktijk is het andersom: NoSQL is vaak fantastisch als je heel goed weet welke queries je wilt optimaliseren. Als je vraagruimte breed en veranderlijk is (typisch analytics), dan heb je juist baat bij systemen en modellen die dat aankunnen—en bij een contractlaag (zoals warehousing) die definities en tijd stabiliseert.

Consistentie en transacties: waar de grootste trade-offs echt zitten

De meest gevoelige ruil in NoSQL/cloud ontwerpen gaat bijna nooit over “SQL vs NoSQL” als taal, maar over consistentie, beschikbaarheid, en partities (netwerkproblemen of regio-scheiding). In een gedistribueerde realiteit kun je niet doen alsof netwerkstoringen niet bestaan; je kiest hoe het systeem reageert wanneer nodes elkaar even niet kunnen bereiken.

Relationele OLTP-systemen geven je vaak sterke garanties: transacties, locks, constraints, en een duidelijke plek waar “de waarheid” staat. Veel NoSQL-systemen kiezen voor andere garanties, zoals eventual consistency of beperktere transactiegrenzen, om beschikbaarheid en schaal te halen. Dat kan prima zijn—als je businessproces het toelaat. Bij een shopping cart is “eventueel consistent” soms acceptabel; bij betaling of voorraad vaak niet.

Belangrijk is dat “eventual consistency” niet betekent “random”. Het betekent dat je expliciet moet ontwerpen voor conflicten en timing: idempotente writes, retry-strategieën, unieke keys, en reconciliatie. Een pitfall is om integriteit “later in een batch” te repareren terwijl je eigenlijk OLTP-achtige correctheid nodig hebt. Dat zagen we al bij OLTP: realtime fouten worden snel duur. NoSQL maakt die fout alleen makkelijker, omdat de database minder hard tegen je zegt: “dit mag niet.”

Een nuttige manier om dit te framen is als contractverplaatsing. Bij relationeel OLTP zit een stuk contract in het schema (foreign keys, constraints). Bij veel NoSQL-oplossingen zit dat contract vaker in je services, events, of data pipelines. Dat is niet per se slechter, maar het vraagt volwassen engineering: duidelijke ownership, tests op datacontracten, en observability om te detecteren wanneer data “wegdrijft”.

Cloud storage keuzes: object, block en managed databases

Cloud maakt opslag en databases toegankelijker, maar je betaalt met nieuwe ontwerpdimensies: netwerk-latency, doorvoer vs kosten, en operationele afhankelijkheid van een managed platform. Een klassieke lokale database op een snelle disk voelt “direct”; in cloud is opslag vaak een remote service met eigen latencyprofiel en throttling-gedrag. Dat beïnvloedt transactionele workloads sterk.

Object storage is ideaal voor grote, immutable datasets (logs, exports, snapshots) en past daardoor vaak goed bij analytics-achtige workflows en historiek. Maar object storage is geen OLTP-database: updates zijn niet “in-place” zoals bij block storage of een database engine. Block storage is juist geschikt voor systemen die een disk-achtig device nodig hebben, zoals self-managed databases, maar dat brengt beheerlast terug (patching, tuning, backups). Managed databases combineren opslag + engine + beheer, maar je accepteert service-limieten, specifieke consistency/back-upmechanismen en een prijsmodel dat meeademt met gebruik.

De kernvraag voor data engineering is: welk contract wil je waar borgen? Voor analytische “brondata” wil je vaak duurzaamheid, goedkope opslag en duidelijke historiek; voor operationele kernprocessen wil je voorspelbare transacties en integriteit. Cloud maakt het makkelijker om die workloads fysiek te scheiden, maar het maakt het ook makkelijker om per ongeluk een data swamp te bouwen: “gooi alles in object storage en we zien later wel.” Het warehouse-idee uit de vorige les blijft dus leidend: ook in cloud heb je expliciete definities, tijdsregels en kwaliteitscontroles nodig om één waarheid te behouden.

Keuzes naast elkaar: wat je wint, wat je inlevert

Dimensie Relationele OLTP (klassiek) NoSQL (algemeen) Cloud object storage
Primair contract Schema + constraints + transacties als harde regels voor integriteit. Schaal/availability + model per use case, vaak met beperktere constraints. Duurzame opslag van objects met eenvoudige API’s; compute/queries zijn losgekoppeld.
Sterktes Betrouwbare updates, referentiële integriteit, duidelijke “single source of truth” voor transacties. Hoge schaalbaarheid, flexibele representatie, lage latency voor specifieke patterns. Goedkoop op schaal, historiek/snapshots, ideaal voor ruwe data en uitwisseling.
Zwaktes Schemawijzigingen kunnen zwaar zijn; horizontaal schalen en multi-region is complex. Integriteit verschuift naar applicatie/pipeline; query-flexibiliteit kan beperkt zijn. Niet geschikt voor OLTP-updates; governance nodig om swamp/duplicatie te voorkomen.
Typische pitfall Analytics op productie draaien, of alles in één schema willen stoppen. “Schema-loos” interpreteren als “geen contract”, met inconsistente data als gevolg. Alles dumpen zonder definities, tijdsregels, of kwaliteitscontroles.
Wanneer vaak passend Orders, betalingen, voorraad, kernadministratie met hoge correctheidseisen. Events, session data, catalogs, high-scale lookups, relatie-specifieke workloads. Logs, exports, landing zones, archivering, historisch ruwe datasets voor analytics.

Twee praktijkvoorbeelden: hoe trade-offs uitpakken in echte systemen

Voorbeeld 1: e-commerce orders en klantprofielen — wanneer NoSQL helpt, en wanneer niet

Stel je webshop heeft een relationeel OLTP-systeem voor orders en betalingen. Dat is logisch: je wilt constraints (order moet een klant hebben), transacties (betaling en orderstatus moeten kloppen) en voorspelbare correctheid. Tegelijk wil het productteam een “Customer 360” profiel tonen met recente views, voorkeuren, adressen en marketingflags. Dat profiel verandert vaak van vorm: vandaag voeg je “loyalty tier” toe, morgen “consent per kanaal”.

Een document store kan hier aantrekkelijk zijn: je bewaart per klant een document met nested velden die je UI snel ophaalt. Het stappenplan dat het verschil maakt:

  1. Je definieert wat transactiekritisch is (orders/betalingen blijven relationeel met harde integriteit).
  2. Je definieert wat presentatie/ervaring is (profielen) en accepteert dat dit minder strikt hoeft te zijn, zolang de UX klopt.
  3. Je voorkomt dat duplicatie “waarheid” wordt: bedragen, orderstatus en voorraad blijven uit de profieldocumenten.
  4. Je bouwt versiebeheer/validatie: nieuwe velden zijn optioneel, maar je test contracten zodat services niet breken.

De impact is vaak direct: snellere iteratie op het profiel en minder join-zware reads op OLTP. De beperking is dat je nu twee waarheden moet coördineren: de operationele waarheid (OLTP) en een afgeleide weergave (document). Als teams dat vergeten, ontstaat de klassieke discussie: “welke klantstatus is leidend?”—precies waarom het “contractdenken” uit warehousing ook hier relevant blijft.

Voorbeeld 2: eventlogs en analytics — cloud storage als kracht, maar alleen met governance

Neem clickstream- en applicatielogs die per dag miljoenen events genereren. Als je die in OLTP-tabellen stopt “omdat SQL handig is”, krijg je al snel de valkuil uit de vorige les: zware scans, groeiende tabellen en production performance die instabiel wordt. Hier is cloud object storage vaak een betere landing zone: goedkoop, duurzaam en geschikt voor append-only data.

Een praktische aanpak die de trade-offs expliciet maakt:

  1. Je schrijft ruwe events naar object storage als immutable batches (bijv. per uur of per dag), met een heldere partitionering op tijd.
  2. Je houdt een simpele, consistente set metadata bij: schema-versie, bronservice, timezone/timestamps, en unieke event identifiers.
  3. Je bouwt een verwerkingslaag die events opschoont en verrijkt naar analytische tabellen/structuren, met duidelijke definities zoals “session”, “active user”, “conversion”.
  4. Je bewaakt “single source of truth” door die definities centraal vast te leggen—zodat teams niet elk hun eigen interpretatie bouwen.

De winst is schaal en kostencontrole: opslag groeit mee en je vermijdt dat je OLTP wordt misbruikt als logstore. De beperking is dat object storage op zichzelf geen semantiek afdwingt. Zonder contracten, datakwaliteitschecks en tijdregels krijg je dezelfde chaos als in het file-based tijdperk, maar dan groter en sneller. Cloud maakt opslag makkelijk; betrouwbare betekenis blijft mensenwerk dat je moet operationaliseren.

Waar je op stuurt als data engineer

NoSQL en cloud storage zijn vooral manieren om het systeem aan te passen aan nieuwe realiteiten: groei, distributie, veranderende schema’s en enorme volumes. Maar elke “modernisering” is een ruil: je wint elasticiteit of snelheid, en je betaalt met complexere consistency, governance of kostenmodellen. De rode draad uit relationele systemen en warehousing blijft daarom gelden: maak het contract expliciet, alleen zit het contract soms minder in de database en meer in je platformpraktijken.

Wat blijft hangen

  • NoSQL is een set modellen, geoptimaliseerd voor specifieke access patterns; de prijs is vaak dat integriteitsregels verschuiven naar applicatie en pipelines.

  • Cloud storage geeft schaal en duurzaamheid, maar vraagt extra discipline rond semantiek, tijd, kosten en lifecycle.

  • “Single source of truth” is een ontwerpkeuze, niet een productfeature: definities, historiek en kwaliteitsregels moeten ergens expliciet vastliggen.

Van opslag naar afspraken die kloppen

  • Datamodellen en schema’s blijven je basis om structuur, integriteit en samenwerking af te dwingen—ook als je deels “schema-flexibel” gaat werken.

  • OLTP/OLAP/warehousing blijft het kernonderscheid: verschillende workloads vragen verschillende systemen en andere garanties.

  • NoSQL en cloud storage zijn vooral nieuwe contracten over schaal, beschikbaarheid en flexibiliteit; succes hangt af van waar je consistentie en definities borgt.

Als je deze trade-offs scherp kunt verwoorden, maak je betrouwbaardere platformkeuzes: je kiest niet “hippe technologie”, maar een set garanties die past bij de business en die je als team ook echt kunt waarmaken.

Last modified: Tuesday, 17 February 2026, 6:41 AM