Modelleringspatronen voor document-, key-value-, wide-column-, graf- en vectorstores — wanneer je moet embedden, refereren, denormaliseren of indelen in tijdvakken.
NoSQL-stores ruilen vaste schema's en joins in voor horizontale schaal. Elke familie modellereert relaties op eigen wijze, dus het toegangspatroon — niet de normaalvorm — bepaalt de structuur.
Referentietabel · 28 items
NoSQL-datamodelleringExplained
28 of 28 rows
Document
Geneste subdocumenten leven binnen één ouderdocument in plaats van aparte tabellen.
One-to-few-relaties die samen gelezen worden. Een order met zijn orderregels. Een gebruiker met drie adressen.
Sla een vreemde id op, niet de data. Los die op met een tweede leesactie of een $lookup.
Grote, gedeelde of onafhankelijk bijgewerkte sub-entiteiten. Many-to-many-koppelingen tussen collecties.
De ouder embedt een korte array kinderen; de hele set past in en laadt als één document.
Een handvol telefoonnummers of voorkeuren op een profiel. Eén leesactie retourneert ouder en kinderen.
Kinderen leven in hun eigen collectie; elk kind draagt de ouder-id, of de ouder houdt een begrensde id-array bij.
Sets te groot of te onafhankelijk om te embedden. Vraag kinderen op via de ouder-id.
Het kind slaat de ouder-id op; de ouder noemt de kinderen nooit, omdat de set onbegrensd is.
Events, logs of stemmen gekoppeld aan een host of gebruiker. Filter kinderen op ouder-id en pagineer.
Documenten van verschillende entiteitstypen delen één collectie, onderscheiden door een typeveld.
Comments of notificaties gekoppeld aan vele soorten ouders, alle op één manier bevraagd.
Een paar extreme entiteiten worden uit de gedeelde vorm gehaald, zodat hun omvang of verkeer de rest niet vertekent.
Accounts van beroemdheden waarvan volgerslijsten of tellers het normale document zouden ontgroeien.
Elke revisie is een nieuw document met dezelfde id en een oplopend versienummer; de query kiest de nieuwste.
Auditsporen en bewerkgeschiedenis waarin oude revisies bevraagbaar blijven.
Afgeleide waarden worden bij schrijftijd berekend en naast de data opgeslagen die ze samenvatten.
Totalen, beoordelingen en top-N die anders bij elke leesactie een aggregatie zouden draaien.
Key-value en wide-column
DynamoDB-designterm: vat vele entiteitstypen samen in één tabel met overbelaste partitie- en sorteerkeys.
Haal heterogene items op in één query, zonder join.
Eén key-attribuut bedient vele entiteitstypen, gemarkeerd met prefixen als USER# of ORDER#.
Single-table-designs. Cluster gerelateerde items onder één partitie en haal ze in één query op.
Een partitiekey spreidt rijen over nodes; een sorteerkey ordent elke partitie.
Cassandra en DynamoDB. Range-scans, geordende logs, hiërarchische samengestelde keys.
Stapel meerdere attributen in één sorteerkey met scheidingstekens — country#region#city — zodat een prefix-match de hiërarchie afdaalt.
Hiërarchieën en multi-facet-filters. Eén geordende range-query vervangt vele indexlookups.
Groepeer events in vaste vensters — uur, dag, maand — onder eigen partities of tabellen.
Metrics, logs en IoT-telemetrie. Begrenst partitiegrootte en veroudert koude data.
Dupliceer leeszware velden over records heen, zodat een query nooit een tweede lookup nodig heeft.
Leeszware workloads waar uiteindelijke consistentie acceptabel is en opslag goedkoop.
Een secundaire index op een attribuut dat maar enkele items dragen; items zonder het attribuut komen nooit in de index.
Alternatieve toegangspaden. Vind de sparse-subset — open orders, niet-verzonden items — zonder een full scan.
Schrijf eerst de exacte queries op; de tabelindeling wordt daaruit afgeleid, niet uit entiteiten of normaalvorm.
Schema-werk in Cassandra en DynamoDB. Eén tabel per queryfamilie; het datamodel kopieert de vraag.
Een query moet vele partities of nodes parallel raken, omdat geen key bij de vraag past.
Een luchtje om weg te ontwerpen, geen doel. Her-key de tabel zodat de gebruikelijke query op één partitie landt.
Kopieën worden bij schrijftijd naar elke lezersweergave geduwd, of bij leestijd verzameld en samengevoegd.
Feeds en timelines. Fan-out bij schrijven voor een klein publiek, bij lezen voor een enorm publiek.
Een voorberekend queryresultaat, opgeslagen als eigen tabel en actueel gehouden met de basistabel.
Alternatieve leesvormen over één schrijfpad. Bedient queries die de basistabel niet kan beantwoorden.
Graaf
Elke edge is een rij of tuple die van een bronnode naar een doelnode wijst.
Graf- en propertystores. Friend-of-friend-lookups, routing, aanbevelingen.
Elke relatie is een document in een eigen collectie, met from- en to-id's plus koppelattributen.
Grafen in documentstores. Attributen op de koppeling zelf — beoordeling, rol, tijdstempel.
Elke node slaat linker- en rechtertellers uit een depth-first-wandeling op; een subboom leeft binnen het bereik van de ouder.
Leeszware bomen. Eén BETWEEN-query retourneert een subboom; inserts hernummeren de wandeling.
Een eigen tabel registreert elk voorouder-naar-nazaat-paar, inclusief elke node op diepte nul.
Query's op hele takken op elke diepte. Eenvoudige joins, betaald met opslag en onderhoud.
Property graphs hangen key-value-attributen aan nodes en edges; RDF stelt alles als subject-predicaat-object-triples.
Property graphs voor rijke traversals (Neo4j); RDF voor linked open data en ontologie-uitwisseling.
Vector
Een hoogdimensionale float-array staat naast metadata. Een ANN-index vindt de dichtstbijzijnde buren.
Semantisch zoeken, RAG-retrieval, aanbevelingen en similariteit over ongestructureerde content.
Brondocumenten worden opgesplitst — op grootte, overlap of structuur — voordat elk deel apart wordt geëmbed.