Relationele database (RDB) versus NoSQL: datamodel, schema, joins, consistentie en schaalbaarheid

Een relationele database (RDB) stelt data voor als tabellen met rijen en kolommen en wordt bevraagd met SQL. Ze ondersteunt complexe query's die tabellen samenvoegen, en houdt de data strikt consistent via de ACID-eigenschappen van transacties en beperkingen zoals primaire en vreemde sleutels. NoSQL is een verzamelnaam voor andere dan relationele databases, waaronder key-value-, document-, wide-column- en graafdatabases. De meeste maken het dataformaat flexibel en maken het eenvoudiger om uit te schalen over veel servers, ten koste van complexe query's zoals joins en van een deel van de strikte consistentie. Het is niet zo dat de ene beter is: de keuze hangt af van de vorm van de data en de eigenschappen die je nodig hebt.

KenmerkRelationele database (RDB)NoSQL
Voorstelling van de dataTabellen (relaties) met rijen en kolommen, aan elkaar gekoppeld via gedeelde waarden (vreemde sleutels)Hangt af van het type: key-valueparen, JSON-achtige documenten, groepen kolommen, grafen van knopen en verbindingen enz.
SchemaKolomnamen en -typen worden vooraf gedefinieerd; wijzigen betekent de tabeldefinitie aanpassen, bijvoorbeeld met ALTER TABLEVeel producten vereisen vooraf geen strikt schema (schemaloos), dus records met verschillende velden kunnen samen worden opgeslagen
Query'sZoeken op voorwaarden, aggregeren, sorteren enz. kan declaratief worden geschreven in SQL, een standaardtaalMeestal productspecifieke API's of querytalen; sommige producten bieden SQL-achtige talen
JoinsMet JOIN kunnen query's meerdere tabellen combinerenVeel kunnen slecht met joins overweg; data die samen wordt gelezen, wordt vaak samen in één document of waarde opgeslagen
Transacties en consistentieTransacties met de ACID-eigenschappen kunnen wijzigingen aan meerdere rijen en tabellen in één keer vastleggenVeel producten beperken wijzigingen tot één sleutel of document, of staan eventual consistency toe, waarbij kopieën het niet meteen eens zijn; sommige producten bieden wel ACID-transacties
Manier van schalenVooral opschalen door één server krachtiger te maken; leesbewerkingen kunnen over replica's worden verdeeld, maar schrijfbewerkingen over veel servers verdelen is moeilijkEenvoudig uit te schalen door de data per sleutel over veel servers te verdelen
NormalisatieTabellen worden genormaliseerd om dubbele data te verwijderen en wijzigingsanomalieën te voorkomenDezelfde data wordt vaak gedupliceerd om snel lezen te bevorderen
Geschikte toepassingenBedrijfssystemen waar integriteit telt en de relaties tussen data complex zijn, zoals boekhouding, voorraad en bestellingenSessies en caches voor webdiensten met zeer veel verkeer, data zonder vaste vorm, grote hoeveelheden logs, verbanden tussen mensen of dingen (grafen)

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

Relationele database
Voor data die halverwege een wijziging niet inconsistent mag worden, zoals geld of voorraad, en data die je onder allerlei voorwaarden wilt samenvoegen en aggregeren. Het is de standaardkeuze voor de meeste bedrijfssystemen.
NoSQL
Wanneer de hoeveelheid data of het verkeer te groot is voor één server, wanneer de vorm van de data varieert en vaak verandert, of wanneer het werk vooral uit eenvoudig lezen en schrijven per sleutel bestaat. Het type kiezen dat bij het doel past, is belangrijk.

Veelgestelde vragen

Betekent NoSQL „geen SQL”?

Het wordt meestal uitgelegd als „Not only SQL” en wordt minder gebruikt als afwijzing van SQL dan als verzamelnaam voor alternatieven voor relationele databases. Sommige producten laten je zelfs SQL-achtige querytalen gebruiken.

Welke soorten NoSQL-databases zijn er?

Er zijn vier hoofdsoorten. Key-value stores zijn gespecialiseerd in eenvoudig lezen en schrijven van waarden per sleutel. Documentdatabases slaan documenten met geneste, JSON-achtige structuren op en kunnen ook zoeken op velden binnen documenten. Wide-column stores laten elke rij andere kolommen hebben en zijn geschikt om grote hoeveelheden data verdeeld over veel servers te schrijven. Graafdatabases stellen verbanden tussen data voor als knopen en verbindingen en zijn geschikt voor query's die die verbanden volgen.

Wat heeft de CAP-stelling met deze vergelijking te maken?

De CAP-stelling laat zien dat een gedistribueerde database die kopieën op meerdere servers bijhoudt, bij een opgesplitst netwerk niet tegelijk consistentie (elke leesbewerking geeft de nieuwste waarde) en beschikbaarheid (elk verzoek krijgt antwoord) volledig kan garanderen. Veel NoSQL-producten kiezen voor beschikbaarheid en passen eventual consistency toe, waarbij de kopieën na verloop van tijd gelijk worden.

Worden beide ooit in hetzelfde systeem gebruikt?

Vaak. Data waarbij integriteit telt, zoals bestellingen en betalingen, gaat bijvoorbeeld in een relationele database; sessies van ingelogde gebruikers en caches van vaak gelezen data gaan in een key-value store; en data zonder uniforme vorm, zoals productbeschrijvingen, gaat in een documentdatabase.

Test uw begrip

Welke beschrijving van de kenmerken van een key-value-store, een van de databases die NoSQL worden genoemd, is in het algemeen juist?

  1. AHij kan complexe SQL met joins tussen tabellen en subquery's sneller verwerken dan een relationele database
  2. BVoordat er gegevens worden geschreven, moeten de namen en typen van alle kolommen strikt als schema worden gedefinieerd
  3. CHij is gespecialiseerd in de eenvoudige bewerking van een waarde lezen en schrijven door de sleutel op te geven en is gemakkelijk over meerdere servers uit te breiden, maar is niet geschikt voor complexe query's zoals joins tussen tabellen
Antwoord en toelichting tonen

Antwoord: C. Hij is gespecialiseerd in de eenvoudige bewerking van een waarde lezen en schrijven door de sleutel op te geven en is gemakkelijk over meerdere servers uit te breiden, maar is niet geschikt voor complexe query's zoals joins tussen tabellen

NoSQL is een verzamelnaam voor andere databases dan relationele databases, waaronder key-value-, document-, kolomgeoriënteerde (wide-column) en graafdatabases. Een key-value-store bewaart paren van een sleutel (identificatie) en een waarde en is gespecialiseerd in de eenvoudige bewerking van een waarde ophalen door de sleutel op te geven. Omdat de gegevens gemakkelijk op sleutel kunnen worden verdeeld en over meerdere servers gespreid, wordt hij gebruikt door webdiensten met zeer veel verkeer, bijvoorbeeld om informatie over ingelogde gebruikers (sessies) op te slaan. Aan de andere kant is hij zwak in zoeken op de inhoud van waarden en in complexe query's zoals joins tussen tabellen, zodat de applicatie daar zelf omheen moet werken. Veel producten vereisen ook niet dat de vorm van de waarden vooraf strikt wordt vastgelegd (schemaloos). Sommige producten staan bovendien eventual consistency toe, waarbij wijzigingen niet direct in alle verspreide kopieën zichtbaar zijn.

Welke beschrijving van de CAP-stelling voor een gedistribueerde database die kopieën van gegevens op meerdere servers bewaart, is passend?

  1. AWanneer het netwerk tussen de servers wordt opgesplitst, kunnen consistentie (elke server geeft de nieuwste waarde) en beschikbaarheid (elk verzoek krijgt een antwoord) niet tegelijk volledig worden gewaarborgd
  2. BMet een goed ontwerp kunnen consistentie, beschikbaarheid en partitietolerantie altijd tegelijk worden gewaarborgd
  3. CPartitietolerantie betekent dat netwerkverbindingen dubbel worden uitgevoerd, zodat het netwerk tussen de servers nooit wordt opgesplitst
Antwoord en toelichting tonen

Antwoord: A. Wanneer het netwerk tussen de servers wordt opgesplitst, kunnen consistentie (elke server geeft de nieuwste waarde) en beschikbaarheid (elk verzoek krijgt een antwoord) niet tegelijk volledig worden gewaarborgd

De CAP-stelling laat zien dat een gedistribueerde database niet alle drie de volgende eigenschappen tegelijk volledig kan waarborgen: consistentie (consistency: lezen van elke willekeurige server geeft het resultaat van de laatste schrijfactie), beschikbaarheid (availability: elke server die niet is uitgevallen, beantwoordt elk verzoek) en partitietolerantie (partition tolerance: het systeem blijft werken, ook als de communicatie tussen servers wordt verbroken). Omdat netwerkpartities in de praktijk niet te vermijden zijn, is de kern dat het systeem bij een partitie moet kiezen tussen voorrang voor consistentie, waarbij het antwoorden op sommige verzoeken stopt, en voorrang voor beschikbaarheid, waarbij het blijft antwoorden en verouderde waarden toestaat. Als er geen partitie is, kunnen consistentie en beschikbaarheid allebei worden gewaarborgd. Veel NoSQL-producten geven voorrang aan beschikbaarheid en passen eventual consistency toe, waarbij de kopieën na verloop van tijd gelijk worden. Partitietolerantie gaat niet over het dubbel uitvoeren van verbindingen; het is de eigenschap dat het systeem blijft werken, ook als er een partitie optreedt.

Wat is het belangrijkste doel van de normalisatie van tabellen in een relationele database?

  1. AHet aantal tabellen verminderen, zodat elke zoekopdracht snel en zonder joins kan worden uitgevoerd
  2. BGegevens versleutelen, zodat onbevoegde gebruikers ze niet kunnen lezen
  3. CDubbele gegevens wegwerken en anomalieën voorkomen, zoals inhoud die na een wijziging inconsistent wordt
Antwoord en toelichting tonen

Antwoord: C. Dubbele gegevens wegwerken en anomalieën voorkomen, zoals inhoud die na een wijziging inconsistent wordt

Normalisatie is een ontwerpprocedure die tabellen opsplitst op basis van functionele afhankelijkheden tussen kolommen (een relatie waarbij de waarde van een kolom de waarde van een andere kolom eenduidig bepaalt), zodat hetzelfde feit niet op meerdere plekken wordt vastgelegd. Als bijvoorbeeld elke rij van een tabel met medewerkers ook de naam van de afdeling bevat, moeten bij het hernoemen van een afdeling de rijen van alle medewerkers van die afdeling worden herschreven, en wordt er een overgeslagen, dan wordt de inhoud inconsistent (een wijzigingsanomalie). Er ontstaan ook andere problemen: een afdeling zonder medewerkers kan nog niet worden geregistreerd (een invoeganomalie), en het verwijderen van de laatste medewerker van een afdeling wist ook de informatie over de afdeling (een verwijderanomalie). Als de informatie over afdelingen naar een aparte tabel Afdeling wordt verplaatst, hoeft een afdelingsnaam maar op één plek te worden gecorrigeerd. Aan de andere kant betekent het opsplitsen van tabellen meer joins bij het zoeken, dus normaliseren maakt zoekopdrachten niet per se sneller.

  1. In een database die vooral wordt gebruikt om te lezen en te aggregeren, worden tabellen die door normalisatie zijn opgesplitst soms bewust samengevoegd tot één tabel, zodat dezelfde gegevens dubbel worden bewaard (denormalisatie). Welke combinatie van een voordeel en een nadeel van dit ontwerp is juist?
  2. Welke van de ACID-eigenschappen die een transactie moet hebben, is de eigenschap dat een overboeking die rekening A debiteert en rekening B crediteert ofwel volledig ofwel helemaal niet wordt uitgevoerd, ook als er halverwege een storing optreedt?

Oefenvragen over Basis van databases

Belangrijke termen uitgelegd

Relationele database
Database die gegevens voorstelt als tabellen (relaties) van rijen en kolommen en via gemeenschappelijke waarden verbanden tussen tabellen legt. Wordt ook RDB genoemd. Query's en wijzigingen worden in SQL uitgevoerd, en beperkingen zoals primaire sleutels en vreemde sleutels houden de gegevens consistent.
NoSQL
Verzamelnaam voor andere databases dan relationele databases, waaronder key-value-, document-, kolomgeoriënteerde en graafdatabases. Veel producten zijn gemakkelijk over meerdere servers uit te breiden en laten flexibele gegevensformaten toe, maar ze zijn vaak zwak in complexe query's zoals joins tussen tabellen en in strikte consistentie.
SQL
De standaardtaal voor het definiëren van tabellen, het zoeken, toevoegen, wijzigen en verwijderen van gegevens en het regelen van rechten in relationele databases. Ze is gestandaardiseerd door ISO/IEC (in Japan ook als JIS). Tot haar statements behoren SELECT, INSERT, UPDATE, DELETE, CREATE TABLE en GRANT.
Transactie
Een reeks bewerkingen op een database die als één eenheid wordt behandeld. COMMIT maakt de resultaten definitief, en ROLLBACK brengt de gegevens terug in de toestand van vóór het begin van de transactie. Het DBMS beheert transacties met locks en logs, zodat ze voldoen aan atomiciteit, consistentie, isolatie en duurzaamheid (de ACID-eigenschappen).
ACID-eigenschappen
De beginletters van vier eigenschappen waaraan een transactie moet voldoen: atomiciteit (atomicity: alles wordt uitgevoerd of niets), consistentie (consistency: aan de integriteitsbeperkingen blijft voldaan), isolatie (isolation: gelijktijdige transacties beïnvloeden elkaar niet) en duurzaamheid (durability: gecommitte resultaten gaan ook bij een storing niet verloren).
Normalisatie
Ontwerpprocedure die tabellen van een relationele database opsplitst op basis van functionele afhankelijkheden tussen kolommen, zodat hetzelfde feit niet op meerdere plekken wordt vastgelegd. Ze verwijdert dubbele gegevens en voorkomt wijzigings-, invoeg- en verwijderanomalieën. De stappen omvatten de eerste tot en met de derde normaalvorm en de Boyce-Codd-normaalvorm.
Primaire sleutel
Kolom of combinatie van kolommen waarmee één rij in een tabel uniek wordt geïdentificeerd. Er gelden de beperkingen dat de waarden niet dubbel mogen voorkomen en geen NULL mogen bevatten. De primaire sleutel wordt gekozen uit de minimale combinaties van kolommen die een rij uniek kunnen identificeren (kandidaatsleutels).
Vreemde sleutel (foreign key)
Kolom die verwijst naar de primaire sleutel (of een unieke kolom) van een andere tabel. Via de beperking van referentiële integriteit, die alleen waarden toestaat die in de tabel waarnaar wordt verwezen bestaan, of NULL, voorkomt ze gegevens die naar niet-bestaande rijen wijzen. Ook het gedrag bij het verwijderen of wijzigen van een rij waarnaar wordt verwezen (weigeren, verwijderen in cascade enzovoort) kan worden opgegeven.

Verwante vergelijkingen